CN101071385A - 编译方法、调试方法、编译程序和调试程序 - Google Patents
编译方法、调试方法、编译程序和调试程序 Download PDFInfo
- Publication number
- CN101071385A CN101071385A CNA2007101068355A CN200710106835A CN101071385A CN 101071385 A CN101071385 A CN 101071385A CN A2007101068355 A CNA2007101068355 A CN A2007101068355A CN 200710106835 A CN200710106835 A CN 200710106835A CN 101071385 A CN101071385 A CN 101071385A
- Authority
- CN
- China
- Prior art keywords
- program
- linguistic norm
- function
- norm
- name
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/44—Encoding
- G06F8/443—Optimisation
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/362—Software debugging
- G06F11/3628—Software debugging of optimised code
Abstract
一种用于将输入程序转换成目标程序的编译方法,包括:部分语言规范判定步骤,用于判定在输入程序中设置的至少两个特定范围的每个特定范围中的语言规范;判断步骤,用于判断所述特定范围中的语言规范之间是否存在差别;和部分代码校正步骤,用于在判断出所述特定范围中的语言规范之间存在差别时,对特定范围之一中的至少一部分代码进行校正。
Description
技术领域
本发明涉及用于将用高级语言描述的程序转换成目标程序的编译方法、调试方法、编译程序和调试程序。
背景技术
在近年来的软件开发中,程序规模不断增大,基于这种情况,具有高可维护性和高可重用性的面向目标语言受到了关注。面向目标语言的典型例子是C++语言。作为替代一直以来传统地广泛用于编程的C语言的语言,C++语言正在成为关注的焦点,并且在相关技术领域,编程中的语言从C语言转变到C++语言。在这种语言转变中,因为C++语言是C语言的高级兼容语言,故在常规情况下只要简单地通过将C语言编译器替换为C++语言编译器,就能生成没有任何操作问题的目标代码。然而,当用C语言中叙述的程序在C++语言中编译时,会引起代码大小和执行时间不受欢迎地增长的问题。
针对该问题的常规第一解决方案是,使用文献(见M·A·Ellis、B·Stroustrup著,Takanori Adachi和Hiroshi Koyama译的“注释C++参考手册”7.4章“连接指配”)中所叙述的关于程序的连接指配(linkageassignment)。第二解决方案是分析程序中语言规范的范围并且尽可能地对编译自动应用子集的语言规范,如同在日本专利申请公开No.2003-50700中所叙述的。
然而,在第一解决方案中,迫使程序员在编程中考虑连接指配,这阻碍了C语言轻易地向C++语言转变。在第二解决方案中,没有考虑到与程序中编码符号(函数名、变量名等)相关的一致性,虽然可以将C++语言编译成用作内建为C++子集规范的EC++语言。结果是,无法期望这样的优化,例如基于语言规范的兼并对代码大小和执行时间的缩减。
发明内容
因此,本发明的主要目的在于提供一种编译方法,其中程序员可以轻易地将程序转变为向上兼容的程序,而不必注意任何连接指配,并且作为程序规范的最大兼并的结果,可以实现代码大小和执行时间的缩减,而且本发明的目的还在于提供能够轻易地进行微调的调试方法。
为了解决以上问题,根据本发明的编译方法是一种用于将输入程序转换成目标程序的编译方法,包括:
部分语言规范判定步骤,用于判定在输入程序中设置的至少两个特定范围中的语言规范;
判断步骤,用于判断所述特定范围中的语言规范之间是否存在差别;和
部分代码校正步骤,用于在判断出所述特定范围中的语言规范之间存在差别时,对特定范围之一中的至少一部分代码进行校正。
根据上述方法,由于代码被校正从而使得它们可以彼此组合在一起,包括部分不同语言规范的程序可以被组合起来并且以最优的语言规范编译,因此可以更有效地生成代码。
优选地,在所述部分语言规范判定步骤中,基于在特定范围中使用的编程语言的工具性程序判定所述语言规范。
根据上述方法,由于程序员可以将包括部分不同语言规范的程序组合在一起而不校正源程序,并且可以以最优的语言规范编译该程序,因此可以更有效地生成代码。
作为上述方法的更加优选的模式,在所述部分语言规范判定步骤中,在所述输入程序中存在语言规范控制语句的情况下,基于所述语言规范控制语句判定所述语言规范。
根据上述方法,例如,程序员可以根据源程序中的#pragma指令来描述所述语言规范控制语句,并且因此可以自由地选择语言规范而不受来自源程序中初始描述的工具性程序的任何影响。
更加优选地,在所述语言规范判定步骤中,在向用于编译所述输入程序的编译系统提供了语言规范控制指令的情况下,基于所述语言规范控制指令判定所述语言规范。
根据上述方法,例如,程序员基于编译系统的选项提供语言规范控制指令,并且由此可以自由地选择语言规范而不校正源程序,并且不受来自源程序中初始描述的工具性程序的影响。
更加优选地,在所述部分代码校正步骤中,在所有函数中的定义语言规范与引用语言规范之间存在差别的情况下,具有子集语言规范的函数代码名被改变为具有超集语言规范的函数代码名。
根据上述方法,即使在定义的语言规范和引用的语言规范之间存在任何差别,也可以将程序组合起来。
作为上述方法的更加优选的模式,在所述部分代码校正步骤中,所有被多重定义的外部函数都被改变为具有单独函数名并且在程序中未被多重定义的外部函数,并且当所有被多重定义的外部函数都被改变为具有所述单独函数名并且在程序中未被多重定义的所述外部函数时,再次执行部分语言规范判定步骤。
根据上述方法,使用多重定义函数的C++程序可以作为C程序进行编译,这提高了代码生成的效率。
作为上述方法的更加优选的模式,在所述部分代码校正步骤中,所有属于一名字空间的外部函数都被改变为具有单独函数名并且在程序中不属于所述名字空间的外部函数,并且当所有属于所述名字空间的外部函数都被改变为具有所述单独函数名并且不属于在程序中所述名字空间的所述外部函数时,再次执行部分语言规范判定步骤。
根据上述方法,使用所述名字空间的C++程序可以作为C程序编译,这提高了代码生成的效率。
作为上述方法的更加优选的模式,在所述部分代码校正步骤中,所有由一模板生成的外部函数都被改变为具有单独函数名并且在程序中不是由该模板生成的外部函数,并且当所有由该模板生成的外部函数都被改变为具有该单独函数名并且在程序中不是由该模板生成的外部函数时,再次执行部分语言规范判定步骤。
根据上述方法,使用所述名字空间的C++程序可以作为C程序编译,这提高了代码生成的效率。
根据本发明的调试方法是一种用于调试输入程序的调试方法,包括:
部分语言规范认可步骤,用于认可在输入程序中设置的至少两个特定范围的每个特定范围中的语言规范;和
部分语言规范显示步骤,用于一起显示每个特定范围中所认可的语言规范及其程序来源。
根据上述方法,程序员可以轻易地确认程序的哪个部分以何种语言规范被编译。结果是,可以有效地进行调试和微调操作。
作为上述方法的优选模式,该方法进一步包括模板开发显示步骤,其用于在待分析的目标是由所述模板生成的实例的情况下,显示其中模板被开发的源程序。
根据上述方法,在开发模板之后,程序员可以轻易地掌握源程序,并且可以有效地进行调试和微调操作。
作为上述方法的更加优选的模式,该方法进一步包括子集语言规范违背部分显示步骤,其用于在子集的语言规范被定义在所认可的语言规范中的情况下,显式地显示偏离子集的语言规范的一部分程序的内容。
根据上述方法,程序员可以轻易地掌握偏离子集的部分程序,并且可以更有效地进行调试和微调操作。
本发明不仅可以实现包括这些特征步骤的编译方法和调试方法,而且可以实现使计算机执行包含在所述编译方法和所述调试方法中的这些特征步骤的编译程序和调试程序,以及执行包含在所述编译方法和所述调试方法中的这些特征步骤的编译装置和调试器装置。进一步,显而易见地,可以通过例如CD-ROM(光盘只读存储器)的记录介质和例如互联网的传输介质来分布所述编译器和调试器。
根据本发明的编译程序是一种用于将输入程序转换成目标程序的编译程序,该编译程序使计算机执行:
部分语言规范判定工具性程序,用于判定在输入程序中设置的至少两个特定范围的每个特定范围中的语言规范;
用于判断所述特定范围之间的语言规范中是否存在差别的工具性程序;和
部分代码校正工具性程序,用于在判断出所述特定范围之间的语言规范中存在差别的情况下,对特定范围之一中的至少一部分代码进行校正。
作为上述程序的优选模式,所述部分语言规范判定工具性程序,基于所述特定范围中所使用的编程语言的工具性程序来判定所述语言规范。
作为上述程序的更加优选的模式,所述部分语言规范判定工具性程序在输入程序中存在语言规范控制语句的情况下,基于所述语言规范控制语句判定所述语言规范。
作为上述程序的更加优选的模式,所述部分语言规范判定工具性程序在向用于编译所述输入程序的编译系统提供了语言规范控制指令的情况下,基于所述语言规范控制指令判定所述语言规范。
作为上述程序的更加优选的模式,所述部分代码校正工具性程序在所有函数中的定义语言规范和引用语言规范之间存在差别的情况下,将具有子集语言规范的函数代码名改变为具有超集语言规范的函数代码名。
作为上述程序的更加优选的模式,所述部分代码校正工具性程序将所有被多重定义的外部函数都改变为具有单独函数名并且在程序中未被多重定义的外部函数,并且当所有被多重定义的外部函数都被改变为具有该单独函数名并且在程序中未被多重定义的该外部函数时,再次执行部分语言规范判定工具性程序。
作为上述程序的更加优选的模式,所述部分代码校正工具性程序将所有属于一名字空间的外部函数都改变为具有单独函数名并且不属于在程序中所述名字空间的外部函数,并且当所有属于所述名字空间的外部函数都被改变为具有该函数名并且不属于所述名字空间的该外部函数时,再次执行部分语言规范判定功能。
作为上述程序的更加优选的模式,所述部分代码校正工具性程序将所有由一模板生成的外部函数都改变为程序中具有单独函数名并且在不是由该模板生成的外部函数,并且当所有由该模板生成的外部函数都被改变为在程序中具有该单独函数名并且不是由该模板生成的外部函数时,再次执行部分语言规范判定步骤。
根据本发明的调试程序是一种用于调试输入程序的调试程序,所述调试程序用于使计算机执行以下工具性程序:
部分语言规范认可工具性程序,用于认可其中输入程序被设置的至少两个特定范围的每个特定范围中的语言规范;和
部分语言规范显示工具性程序,用于一起显示每个特定范围中所认可的语言规范及其程序来源。
作为上述程序的优选模式,该调试程序用于进一步使计算机执行一模板开发显示工具性程序,其用于在分析目标是由所述模板生成的实例的情况下,显示其中所述模板被开发的源程序。
作为上述程序的更加优选的模式,该调试程序进一步使计算机执行一子集语言规范违背显示步骤,其用于在子集的语言规范被定义在所认可的语言规范中的情况下,显式地显示偏离子集语言规范的一部分程序的内容。
根据本发明的编译方法,包括部分不同语言规范的程序可以被轻易地组合在一起,并且以最优的语言规范进行编译。结果是,可以更加有效地生成代码。进一步,根据本发明的调试方法,程序员可以轻易地掌握程序的该部分以何种语言规范进行编译,以及源程序的哪一部分在其被改变为子集语言规范时应该被校正。结果是,可以有效地执行调试和微调操作。
根据本发明的编译方法和调试方法可以有效地应用于针对诸如移动电话和PDA(个人数字助理)的嵌入式装置的编译方法和调试方法等,所述嵌入式装置要求具有小代码大小的目标代码。
附图说明
本发明的这些和其它目的以及优点将通过以下对本发明优选实施例的描述将变得清晰。在实施本发明之后,本领域技术人员将会注意到在本说明书中未叙述的许多优点。
图1是根据本发明优选实施例由编译器执行的处理步骤的流程图。
图2是示出部分语言规范判定步骤的细节的流程图。
图3是示出部分代码校正步骤的细节的流程图。
图4是根据优选实施例由调试器执行的处理步骤的流程图。
图5是示出部分语言规范显示步骤的细节的流程图。
图6示出具体示例1中使用的程序存储单元中所存储的源程序的示例。
图7示出根据现有技术的中间代码信息的示例。
图8示出由传统方法校正的源程序的示例。
图9示出在具体示例1中使用的源程序被应用到部分语言规范判定步骤之后的中间代码信息的示例。
图10示出在具体示例1中使用的源程序被应用到部分语言代码校正步骤之后的中间代码信息的示例。
图11示出在具体示例2中用的程序存储单元中所存储的源程序的示例。
图12示出在其中具体示例2中所用源程序以C++语言被编译的汇编代码,和在其中具体示例2中所用源程序以C语言被编译的汇编代码。
图13示出在具体示例2中中使用的源程序被应用到第一部分语言规范判定步骤之后中间代码信息的示例。
图14示出在具体示例2中中使用的源程序被应用到第一部分代码校正步骤之后中间代码信息的示例。
图15示出在具体示例2中中使用的源程序被应用到第二部分语言规范判定步骤之后中间代码信息的示例。
图16示出其中根据本发明的方法未被使用到具体示例2中所用源程序的汇编代码,和其中相关方法被应用到具体示例2中所用源程序的汇编代码。
图17示出显示具体示例3中所使用的源程序的调试器监视器。
图18示出显示具体示例3中所用源程序的语言规范信息的调试器监视器。
图19示出显示其中具体示例3中所用源程序模板被开发的源程序的调试器监视器。
图20示出显示从具体示例3中所用源程序中的C语言规范导出的程序的一部分内容的调试器监视器。
图21是传统程序转换方法(第二解决方案)的流程图。
具体实施方式
以下,参照附图描述根据本发明优选实施例的编译方法。图1是由编译器执行的处理步骤的流程图。
编译器读取存储在程序存储单元D1中的头文件和源程序(步骤S1)。编译器分析所读取源文件的语法,并且生成符号表和语法树(步骤S2)。接下来,编译器基于所生成的语法树生成中间代码(步骤S3)。然后,编译器对所生成的中间代码执行各种优化处理(步骤S4)。进一步,编译器分配硬件资源,例如寄存器和存储器,给经过优化的中间代码中包括的所有变量(步骤S5),然后将分配了资源的中间代码转换成目标代码并且输出其目标程序到生成代码存储单元D2(步骤S6)。
优化步骤S4包括部分语言规范判定步骤S10、部分代码校正步骤S11和其它优化步骤S12。在部分语言规范判定步骤S10中,分析中间代码,并且判定每个程序的部分范围中的语言规范。在部分代码校正步骤S11中,对在部分语言规范判定步骤S10中所判定的每个程序的部分范围中的语言规范进行分析,并且对相应范围中的代码进行校正,从而使其能够被基于相应范围中的语言规范的差别而组合。稍后描述部分语言规范判定步骤S10和部分代码校正步骤S11的细节。不描述其它优化步骤S12,因为这是传统的优化步骤,而不是本发明的主题。
对源程序输入步骤S1、语法分析步骤S2、中间代码生成步骤S3、其它优化步骤S12、资源分配步骤S5和目标输出步骤S6不进行详细描述,因为它们类似于传统的步骤而不是本发明的主要主题。
以下给出对作为本发明主题的部分语言规范判定步骤S10和部分代码校正步骤S11的描述。图2是示出部分语言规范判定步骤S10细节的流程图。作为循环处理L1,对于每个中间代码执行步骤S21-25,所述中间代码对应于所输入程序中设置的至少两个特定范围。在存在分析目标的情况下,处理前进到步骤S21;而在没有分析目标的情况下,处理前进到步骤S11。在步骤S21中,基于分析目标的范围中所用的编程语言的工具性程序判定语言规范,将语言规范信息记录在中间语言中,并且处理前进到步骤S22。这里,语言规范信息是至少能够判断其所编译的是何种语言规范的信息(例如,当其为C++语言时,是诸如“C++”的字符串)。
在步骤S22中,判断分析目标的范围中是否存在语言规范控制语句。此处所叙述的语言规范控制语句是这样的语句,其中通过例如#pragma指令在源程序中进行描述,而将特定操作指定给编译器。当判断结果为真时,处理前进到步骤S23,而当结果为非真时,处理前进到步骤S24。
在步骤S23中,基于语言规范控制指令判定语言规范,将语言规范信息记录在中间语言中,然后处理前进到步骤S24。在步骤S24中,判断语言规范控制指令是否提供给编译系统。此处所叙述的语言规范控制指令是直接给到编译系统的指令,从而使得特定操作被作为命令行选项指定给编译器。当判断结果为真时,处理前进到步骤S25,而当结果为非真时,处理前进到循环处理L1。
图3是示出部分代码校正步骤S11的细节的流程图。在循环处理L2中,步骤S31-S38由所有函数的每个中间代码执行。当存在分析目标时,处理前进到步骤S31;而当不存在分析目标时,处理前进到步骤S39。
在步骤S31中,判断相关函数的定义与引用中的语言规范之间是否有差别。语言规范之间的差别表示这样的情况,即:函数定义中的语言规范在中间代码中被记录为“C++”,而函数引用中的语言规范在中间代码中被记录为“C”。当判断结果为真,则处理前进到步骤S32,而当判断结果为非真时前进到步骤S33。
在步骤S32,具有子集语言规范的函数代码名被改变为具有超集语言规范的函数代码名,处理前进到步骤S33。
在步骤S33中,判断相关函数是否为被多重定义的外部函数。多重定义表示这种情况的函数定义,即函数名相同但是函数自变量不同,例如f(void)和f(int)。当判断结果为真时处理前进到步骤S34,而当结果为非真时前进到步骤S35。
在步骤S34中,相关函数被改变为具有单独函数名并且在程序中没有被多重定义的外部函数。接下来,处理前进到步骤S35。在步骤S35中,判断相关函数是否为属于名字空间的外部函数。属于名字空间的外部函数是在作为名字空间S{int f(void)}的名字空间的作用域中声明的函数。当判断结果为真则处理前进到步骤S36,当结果为非真则前进到步骤S37。
在步骤S36中,相关函数被改变为具有单独函数名并且不属于程序中的名字空间的外部函数。接下来,处理前进到步骤S37。在步骤S37中,判断相关函数是否为由模板生成的外部函数。这里,由模板生成的外部函数是由如同在模板<class T>Tf(Ta)中所定义的函数模板例示的函数。当判断结果为真则处理前进到步骤S38,当结果为非真则前进到循环处理L2。
在步骤S38中,相关函数被改变为具有单独函数名并且不是由程序中模板生成的外部函数。接下来,处理前进到L2。在步骤S39中,判断步骤S33、S35和S37的判断结果中的任意一个是否为真。当判断结果是真则处理前进到步骤S10,当结果为非真则前进到步骤S12。
如上所述,对中间代码执行包括部分语言规范判定步骤S10和部分代码校正步骤S11的优化步骤S4,并且然后对经过优化的中间代码执行资源分配步骤(步骤S5)和目标程序输出步骤(步骤S6)。因此,程序员可以轻易地将程序转变为向上兼容的程序而不用注意任何连接指配,并且由于语言规范的兼并可以最大程度地缩减代码大小和执行时间。
本发明不限于对中间代码的分析,可以对任何类型的数据进行分析,只要该数据是表示源程序的语法分析结果的数据。
接下来,参照附图描述根据本优选实施例的调试方法。图4是由调试器执行的处理步骤的流程图。调试器读取存储在程序存储单元D1中的程序(步骤N1)。调试器分析所读取的程序,并且转到命令输入等待步骤N2。接下来,调试器判断是否输入了部分语言规范显示命令(步骤N3)。当判断结果为真,则执行用于部分地显示语言规范的步骤N10。然后,执行用于显示其它源信息的步骤N11,并且处理前进到命令输入等待步骤N2。当结果为非真时,执行另一调试步骤(步骤N4),并且处理前进到命令输入等待步骤N2。稍后将描述部分语言规范显示步骤N10的细节。由于其它源显示步骤N11是用于显示一般源信息的步骤,并且不是本发明的主题,因此不对其进行描述。
另外,不详细描述程序输入步骤N1、命令输入等待步骤N2和另一调试步骤N4,因为它们是类似于传统步骤的处理步骤,并且不是本发明的主题。
以下,描述本发明关键结构的部分语言规范显示步骤N10。图5是示出部分语言规范显示步骤N10细节的流程图。在循环处理L3中,由与所输入程序的特定范围对应的每个调试信息执行步骤N21-N26。在存在分析目标时处理前进到步骤N21,在不存在分析目标时处理前进到步骤N11。
在步骤N21中,判断是否存在语言规范信息。当判断为真则处理前进到步骤N22,当判断为非真则前进到循环处理L3。在步骤N22中,基于记录在调试信息中的语言规范信息显示每个范围的语言规范及其程序来源,然后处理前进到步骤N23。
在步骤N23中,判断分析目标是否为由模板生成的实例。当判断结果为真则处理前进到步骤N24,当结果为非真则前进到步骤N25。在步骤N24中,显示其中模板被开发的源程序,并且处理前进到步骤N25。
在步骤N25中,判断子集的语言规范是否被定义为所认可的语言规范。当判断结果为真则处理前进到步骤N26,当结果为非真则前进到循环处理L3。在步骤N26中,清楚地描述了与子集的语言规范偏离的程序部分的内容。
当执行上述包括部分语言规范显示步骤N10的调试过程时,程序员可以轻易地掌握程序的每个部分以何种语言规范被编译,以及源程序的哪个部分在其被改变为子集的语言规范时应该被校正。结果是,可以有效地执行调试和微调操作。
以下,参照具体示例更加具体地描述根据本发明的编译方法和调试方法,在具体示例中,C++语言用作超集的语言规范而C语言用作子集的语言规范。
具体示例1
图6示出存储在程序存储单元D1中的源程序的示例。以下描述在输入源程序的情况下的编译方法。假设用户指定<main.cpp>作为C++语言被编译而<sub.c>作为C语言被编译。可以采用这样的方式指定语言规范,即在源程序中描述#pragma,然而这类似于基于命令行指定语言规范的情况,因此在此说明书中省略对其的描述。图6中所示的源文件<main.cpp>引用外部函数f。源文件<sub.c>定义外部函数f。
参照图7,预先提及要解决的问题。图7示出在中间代码生成步骤S3中生成的分别位于函数f引用侧和定义侧的中间代码中的信息的一部分。
在根据传统方法编译具体示例1的情况下,进行连接而不考虑分析目标的中间代码的语言规范。因此,在具体示例1中函数代码名不相同(f_Fv_和_f),这导致在连接时产生错误。因此,如图8所示,有必要以用户校正程序的方式合并函数代码名,从而使得连接指配显式地示出(见“C”)。这样,传统上需要校正步骤来在C语言中和在C++语言中使用源,这降低了开发过程中的效率程度。
接下来,示出本优选实施例的具体示例。在本具体示例中,在函数作用域的范围内进行分析。在部分语言规范判定步骤S10中,由每个中间代码执行图2所示的循环处理L1(步骤S21-S25),所述中间代码对应于与中间代码生成步骤中生成的中间代码相对应的各个函数作用域的范围。在本具体示例中,假设用户指定<main.cpp>以C++语言编译,而<sub.c>以C语言编译。因此,步骤S24的判断结果为真,则执行步骤S25。结果是,指示语言规范为C++语言的信息记录在引用侧的中间代码中,而指示语言规范为C语言的信息记录在定义侧的中间代码中(见图9)。
接下来,执行部分代码校正步骤S11。首先,执行图3所示的循环处理L2(步骤S31-S38)。在本具体示例中,在分别位于定义侧和引用侧的中间代码的语言规范信息之间存在差别(C++语言和C语言)。因此,步骤S31的判断结果为真,则执行步骤S32。相互比较C++语言和C语言,C++语言是超集的语言规范,而C语言是子集的语言规范。因此,在具有子集语言规范的定义侧的中间代码的函数代码名被改变为在具有超集语言规范的引用侧的中间代码的函数代码名(图10,合并为_f_Fv)。在之后的步骤S33-S38中,判断出所有的步骤都为非真。
如上所述,通过考虑分析目标的中间代码的语言规范,使得相同函数代码名被合并,并且允许连接而不显式地指配连接。因此,传统上为了如同使用C++语言中的源那样使用C语言中的源所必须的校正源的步骤,变得不必要。结果是,开发过程可以达到提高的效率。
具体示例2
图11示出使用存储在程序存储单元D1中的多重定义函数的源程序的示例。以与多重定义函数情况下的具体示例相似的方式,对在其中使用名字空间和模板的源程序进行处理,在此省略对它的描述。以下给出对输入了相关源程序的情况下的编译方法的描述。假设<test.cpp>被编译,而用户没有指定语言规范。
参照图12,预先指出问题区域。在根据传统方法编译本具体示例中的源程序<test.cpp>的情况下,所有函数都被作为C++语言的函数进行编译,因为在源程序中使用了作为C++语言的工具性程序的多重定义函数。因为这些函数被作为C++语言的函数进行编译,即使在函数体中只使用了C语言的工具性程序,还是会冗余地生成代码。图12示出了“test.cpp”的“voidf(void)”被作为C++语言的函数进行编译的情况下的代码生成结果,和“test.cpp”的“void f(void)”被作为C语言的函数进行编译的情况下的代码生成结果。如同从图12中清晰所见,与作为C语言的函数进行编译相比,作为C++语言的函数进行编译的代码生成结果中冗余地生成了代码。
接下来,示出本优选实施例的另一具体示例。以类似于具体示例1的方式,对本具体示例的函数作用域执行分析。在部分语言规范判定步骤S10中,由每个中间代码执行图2所示的循环处理L1(步骤S21-S25),所述中间代码对应于与中间代码生成步骤中生成的中间代码相对应的各个函数作用域。在本具体示例中,由于用户没有指定语言规范,步骤S22和S24的判断结果均为非真,因此不执行步骤S23和S25。因此,基于分析目标范围中所用编程语言的工具性程序而判定的语言规范信息被记录在中间代码中(步骤S21)。在本具体示例中,函数“void f(void)”和“void f(int)”是具有相同函数名的多重定义函数,并且是C++语言的工具性程序(函数)。因此,语言规范为C++语言的信息被记录在使用这些工具性程序的范围中的中间代码中(如图13所示的所有中间代码中的C++语言)。
接下来,执行部分代码校正步骤S11。首先,执行图3所示的循环处理L2(步骤S31-S38)。在本具体示例中,由于定义侧中间代码的语言规范信息与引用侧中间代码的语言规范信息之间不存在差别(都是C+语言),因此不执行步骤S32,而是执行步骤S34,因为相关函数是多重定义函数。在本具体示例中,如图14所示,函数名被改变为诸如_ _L1、_ _L2的函数名,它们是具有单独函数名的外部函数名并且在程序中未被多重定义,并在此后保持每个语言规范和函数代码名。这里将多重定义函数叙述为本具体示例中的一个例子,然而,函数名可以被改变为程序中具有单独函数名并且在程序中未被多重定义的外部函数,其中以类似于多重定义函数的方式使用名字空间和模板(步骤S36和S38)。
结果是,执行步骤S34,步骤S39的判断结果为真,并且再次执行部分语言规范判定步骤S10。在步骤S10的第二次执行中,由于多重定义函数的函数名被改变为_ _L1、_ _L2,所以,相关函数不被认可为多重定义函数。接下来,在步骤S21记录表示语言规范为C语言的信息,并且作为C语言的函数代码名被赋给相关函数(图15)。在第二步骤S11的执行中没有造成特定改变,并且处理前进到步骤S12及其后的处理步骤。
图16示出本发明未应用到本具体示例的情况下的代码生成结果,和本发明应用到本具体示例的情况下的代码生成结果。如图16清晰所示,较之未应用本发明的情况,在应用本发明的情况下,任何冗余代码都被删除了。
具体示例3
示出了调试方法的具体示例。在本具体示例中,假设根据本发明编译方法记录在中间代码中的语言规范信息也记录在调试信息中。图17示出执行调试程序的监视器。当部分语言规范显示命令被输入时,执行部分语言规范显示步骤N10。在本具体示例中,由于假设语言规范信息记录在调试信息中,因此执行步骤N22,并且基于记录在调试信息中的语言规范信息,一起显示在所输入程序中设置的至少两个范围当中每个范围中的语言规范及其程序来源。图18示出语言规范显示的示例。该显示例仅仅示出示例,而且任何方式都是可接受的,只要显示关于语言规范的信息。
接下来,判断分析目标是否为由模板生成的实例(步骤N23)。在本具体示例中,在分析目标是A<int>obj的情况下,因为实例生成自模板,所以判断结果为真,并且如图19所示,显示其中模板被开发的源程序。该显示例仅仅示出示例,而且任何方式都是可接受的,只要显示关于其中模板被开发的源程序的信息。
接下来,判断子集的语言规范是否被定义为被认可的规范(步骤N25)。在本具体示例中,由于定义的是作为C++语言的子集规范的C语言,因此判断结果为真。然后,如图20所示,在语言规范被判断为C++语言的范围内,偏离C语言语言规范(模板工具性程序)的一部分的内容被显式地描述。该显示示例仅仅示出示例,而任何方式都是可接受的,只要显示关于偏离子集语言规范的那部分内容的信息。
如从图18-20清晰所见,当使用根据本发明的调试方法时,程序员可以轻易地掌握程序的哪一部分基于何种语言规范进行编译以及源程序的哪一部分应该在其被改变为子集语言规范时被校正。结果是,可以有效率地执行调试和微调操作。
虽然详细描述了本发明的优选实施例,但是应该理解,可以对本发明进行多种修改,并且本发明意在所附权利要求中覆盖所有落入本发明真正精神和范围中的这些修改。
Claims (22)
1、一种用于将输入程序转换成目标程序的编译方法,包括:
部分语言规范判定步骤,用于判定在输入程序中设置的至少两个特定范围的每个特定范围中的语言规范;
判断步骤,用于判断所述特定范围中的语言规范之间是否存在差别;和
部分代码校正步骤,用于在判断出所述特定范围中的语言规范之间存在差别时,对特定范围之一中的至少一部分代码进行校正。
2、根据权利要求1所述的编译方法,其中
在所述部分语言规范判定步骤中,基于在特定范围中使用的编程语言的工具性程序判定所述语言规范。
3、根据权利要求1所述的编译方法,其中
在所述部分语言规范判定步骤中,在所述输入程序中存在语言规范控制语句的情况下,基于所述语言规范控制语句判定所述语言规范。
4、根据权利要求1所述的编译方法,其中
在所述部分语言规范判定步骤中,在语言规范控制指令被提供给用于编译所述输入程序的编译系统的情况下,基于所述语言规范控制指令判定所述语言规范。
5、根据权利要求1所述的编译方法,其中
在所述部分代码校正步骤中,在所有函数中的定义语言规范与引用语言规范之间存在差别的情况下,具有子集语言规范的函数代码名被改变为具有超集语言规范的函数代码名。
6、根据权利要求1所述的编译方法,其中
在所述部分代码校正步骤中,所有被多重定义的外部函数都被改变为具有单独函数名并且在程序中未被多重定义的外部函数,并且当所有被多重定义的外部函数都被改变为具有该单独函数名并且在程序中未被多重定义的该外部函数时,再次执行部分语言规范判定步骤。
7、根据权利要求1所述的编译方法,其中
在所述部分代码校正步骤中,所有属于一名字空间的外部函数都被改变为具有单独函数名并且在程序中不属于所述名字空间的外部函数,并且当所有属于所述名字空间的外部函数都被改变为具有所述单独函数名并且在程序中不属于所述名字空间的所述外部函数时,再次执行部分语言规范判定步骤。
8、根据权利要求1所述的编译方法,其中
在所述部分代码校正步骤中,所有由一模板生成的外部函数都被改变为具有单独函数名并且在程序中不是由该模板生成的外部函数,并且当所有由该模板生成的外部函数都被改变为具有所述单独函数名并且在程序中不是由该模板生成的所述外部函数时,再次执行部分语言规范判定步骤。
9、一种用于调试输入程序的调试方法,包括:
部分语言规范认可步骤,用于认可在输入程序中设置的至少两个特定范围的每个特定范围中的语言规范;和
部分语言规范显示步骤,用于一起显示每个特定范围中所认可的语言规范及其程序来源。
10、根据权利要求9所述的调试方法,进一步包括模板开发显示步骤,用于在分析目标是由所述模板生成的实例的情况下,显示其中模板被开发的源程序。
11、根据权利要求9所述的调试方法,进一步包括用于显示违背子集语言规范的部分的步骤,其中在子集语言规范被定义在所认可的语言规范中的情况下,偏离子集语言规范的一部分程序的内容被显式地显示。
12、一种用于将输入程序转换成目标程序的编译程序,该编译程序使计算机执行:
部分语言规范判定工具性程序,用于判定在输入程序中设置的至少两个特定范围的每个特定范围中的语言规范;
用于判断所述特定范围中的语言规范之间是否存在差别的工具性程序;和
部分代码校正工具性程序,用于在判断出所述特定范围之间存在差别的情况下,对特定范围之一中的至少一部分代码进行校正。
13、根据权利要求12所述的编译程序,其中
所述部分语言规范判定工具性程序基于在特定范围中使用的编程语言的工具性程序判定所述语言规范。
14、根据权利要求12所述的编译程序,其中
所述部分语言规范判定工具性程序在输入程序中存在语言规范控制语句的情况下,基于所述语言规范控制语句判定所述语言规范。
15、根据权利要求12所述的编译程序,其中
所述部分语言规范判定工具性程序在语言规范控制指令被提供给用于编译所述输入程序的编译系统的情况下,基于所述语言规范控制指令判定所述语言规范。
16、根据权利要求12所述的编译程序,其中
所述部分代码校正工具性程序在所有函数中的定义语言规范与引用语言规范之间存在差别的情况下,将具有子集语言规范的函数代码名改变为具有超集语言规范的函数代码名。
17、根据权利要求12所述的编译程序,其中
所述部分代码校正工具性程序将所有被多重定义的外部函数都改变为具有单独函数名并且在程序中未被多重定义的外部函数,并且当所有被多重定义的外部函数都被改变为具有该单独函数名并且在程序中未被多重定义的该外部函数时,再次执行部分语言规范判定工具性程序。
18、根据权利要求12所述的编译程序,其中
所述部分代码校正工具性程序将所有属于一名字空间的外部函数都改变为具有单独函数名并且在程序中不属于所述名字空间的外部函数,并且当所有属于所述名字空间的外部函数都被改变为具有所述单独函数名并且在程序中不属于所述名字空间的所述外部函数时,再次执行部分语言规范判定功能。
19、根据权利要求12所述的编译程序,其中
所述部分代码校正工具性程序将所有由一模板生成的外部函数都改变为具有单独函数名并且在程序中不是由该模板生成的外部函数,并且当所有由该模板生成的外部函数都被改变为具有该单独函数名并且在程序中不是由该模板生成的该外部函数时,再次执行部分语言规范判定步骤。
20、一种用于调试输入程序的调试程序,所述调试程序使计算机执行:
部分语言规范认可工具性程序,用于认可在输入程序中设置的至少两个特定范围的每个特定范围中的语言规范;和
部分语言规范显示工具性程序,用于一起显示每个特定范围中所认可的语言规范及其程序来源。
21、根据权利要求20所述的调试程序,其中
该程序进一步使该计算机执行一模板开发显示工具性程序,其用于在分析目标是由所述模板生成的实例的情况下,显示其中模板被开发的源程序。
22、根据权利要求20所述的调试程序,其中
该程序进一步使该计算机执行一子集语言规范违背显示步骤,其用于在子集语言规范被定义在所认可的语言规范中的情况下,显式地显示偏离子集语言规范的一部分程序的内容。
Applications Claiming Priority (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2006132380 | 2006-05-11 | ||
JP2006132380A JP2007304840A (ja) | 2006-05-11 | 2006-05-11 | コンパイル方法、デバッグ方法、コンパイルプログラムおよびデバッグプログラム |
Publications (1)
Publication Number | Publication Date |
---|---|
CN101071385A true CN101071385A (zh) | 2007-11-14 |
Family
ID=38686555
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CNA2007101068355A Pending CN101071385A (zh) | 2006-05-11 | 2007-05-10 | 编译方法、调试方法、编译程序和调试程序 |
Country Status (3)
Country | Link |
---|---|
US (1) | US20070266379A1 (zh) |
JP (1) | JP2007304840A (zh) |
CN (1) | CN101071385A (zh) |
Cited By (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102203733A (zh) * | 2008-10-30 | 2011-09-28 | 松下电器产业株式会社 | 编译方法及编译程序 |
CN103677790A (zh) * | 2012-09-26 | 2014-03-26 | 腾讯科技(深圳)有限公司 | 软件的函数修改方法 |
CN105824285A (zh) * | 2016-03-14 | 2016-08-03 | 上海交通大学 | 用于单片机的可编程逻辑控制系统的编程设计方法 |
CN108595183A (zh) * | 2018-04-19 | 2018-09-28 | 北京微播视界科技有限公司 | 代码拼接和调试方法、装置、计算机可读存储介质和终端 |
CN111771187A (zh) * | 2019-01-31 | 2020-10-13 | 华为技术有限公司 | 一种消除代码构建差异的方法及装置 |
CN115617352A (zh) * | 2022-12-02 | 2023-01-17 | 中汽研软件测评(天津)有限公司 | 基于安全编码标准的c代码检测方法、设备和存储介质 |
Families Citing this family (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7451206B2 (en) * | 2002-05-20 | 2008-11-11 | Siemens Communications, Inc. | Send of software tracer messages via IP from several sources to be stored by a remote server |
US20070203909A1 (en) * | 2006-02-28 | 2007-08-30 | Tekelec | Methods, systems, and computer program products for indexing, validating, recovering, and consolidating a database indexed by range-bound numeric data |
JP2008059279A (ja) * | 2006-08-31 | 2008-03-13 | Internatl Business Mach Corp <Ibm> | 文字列出力処理を最適化する技術 |
JP2009169864A (ja) * | 2008-01-18 | 2009-07-30 | Panasonic Corp | コンパイル方法およびコンパイルプログラム |
KR101636517B1 (ko) | 2009-11-13 | 2016-07-06 | 삼성전자주식회사 | 컴퓨팅 시스템 및 컴퓨팅 시스템의 디버그 정보 처리 방법 |
Family Cites Families (22)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2666847B2 (ja) * | 1988-06-06 | 1997-10-22 | 日本電気株式会社 | 異種言語間連絡方式 |
US5097533A (en) * | 1988-11-29 | 1992-03-17 | International Business Machines Corporation | System and method for interfacing computer application programs written in different languages to a software system |
US5504885A (en) * | 1993-06-29 | 1996-04-02 | Texas Instruments Incorporated | O-R gateway: a system for connecting object-oriented application programs and relational databases |
US5500881A (en) * | 1993-07-12 | 1996-03-19 | Digital Equipment Corporation | Language scoping for modular, flexible, concise, configuration descriptions |
JPH07121379A (ja) * | 1993-10-28 | 1995-05-12 | Nec Software Ltd | 複数言語混在コンパイラ |
US5581769A (en) * | 1993-12-29 | 1996-12-03 | International Business Machines Corporation | Multipurpose program object linkage protocol for upward compatibility among different compilers |
US5768564A (en) * | 1994-10-07 | 1998-06-16 | Tandem Computers Incorporated | Method and apparatus for translating source code from one high-level computer language to another |
JP3380390B2 (ja) * | 1996-03-27 | 2003-02-24 | 富士通株式会社 | デバッグ情報表示装置 |
JPH10161904A (ja) * | 1996-12-03 | 1998-06-19 | Toshiba Corp | 複数言語対応のデバッグ装置およびデバッグ方法 |
JP4033952B2 (ja) * | 1997-10-22 | 2008-01-16 | 富士通株式会社 | シンボル名置き換え装置 |
JPH11154093A (ja) * | 1997-11-21 | 1999-06-08 | Toshiba Corp | プログラムコンパイラ及びコンパイラ用プログラムを記録した記録媒体 |
US6202205B1 (en) * | 1998-07-21 | 2001-03-13 | Hewlett-Packard Company | System and method for profile-based, on-the-fly optimization of library code |
JP4130713B2 (ja) * | 1998-10-21 | 2008-08-06 | 松下電器産業株式会社 | プログラム変換装置 |
JP2001154854A (ja) * | 1999-11-25 | 2001-06-08 | Fujitsu Ltd | C++コンパイル装置 |
US7086044B2 (en) * | 2001-03-22 | 2006-08-01 | International Business Machines Corporation | Method, article of manufacture and apparatus for performing automatic intermodule call linkage optimization |
JP2003050700A (ja) * | 2001-08-06 | 2003-02-21 | Matsushita Electric Ind Co Ltd | プログラム変換方法 |
US20030115571A1 (en) * | 2001-12-14 | 2003-06-19 | Telefonaktiebolaget L M Ericsson (Publ) | Construction of a software application from a plurality of programming languages |
JP3956113B2 (ja) * | 2002-06-13 | 2007-08-08 | インターナショナル・ビジネス・マシーンズ・コーポレーション | データ処理装置及びプログラム |
US7346897B2 (en) * | 2002-11-20 | 2008-03-18 | Purenative Software Corporation | System for translating programming languages |
US7707566B2 (en) * | 2003-06-26 | 2010-04-27 | Microsoft Corporation | Software development infrastructure |
US7367023B2 (en) * | 2003-07-10 | 2008-04-29 | International Business Machines Corporation | Method and apparatus for generating computer programming code selectively optimized for execution performance and not optimized for serviceability |
JP2006107338A (ja) * | 2004-10-08 | 2006-04-20 | Matsushita Electric Ind Co Ltd | プログラム処理装置 |
-
2006
- 2006-05-11 JP JP2006132380A patent/JP2007304840A/ja active Pending
-
2007
- 2007-05-08 US US11/797,797 patent/US20070266379A1/en not_active Abandoned
- 2007-05-10 CN CNA2007101068355A patent/CN101071385A/zh active Pending
Cited By (10)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102203733A (zh) * | 2008-10-30 | 2011-09-28 | 松下电器产业株式会社 | 编译方法及编译程序 |
CN103677790A (zh) * | 2012-09-26 | 2014-03-26 | 腾讯科技(深圳)有限公司 | 软件的函数修改方法 |
CN103677790B (zh) * | 2012-09-26 | 2015-03-25 | 腾讯科技(深圳)有限公司 | 软件的函数修改方法 |
CN105824285A (zh) * | 2016-03-14 | 2016-08-03 | 上海交通大学 | 用于单片机的可编程逻辑控制系统的编程设计方法 |
CN105824285B (zh) * | 2016-03-14 | 2018-09-14 | 上海交通大学 | 用于单片机的可编程逻辑控制系统的编程设计方法 |
CN108595183A (zh) * | 2018-04-19 | 2018-09-28 | 北京微播视界科技有限公司 | 代码拼接和调试方法、装置、计算机可读存储介质和终端 |
CN108595183B (zh) * | 2018-04-19 | 2019-12-06 | 北京微播视界科技有限公司 | 代码拼接和调试方法、装置、计算机可读存储介质和终端 |
CN111771187A (zh) * | 2019-01-31 | 2020-10-13 | 华为技术有限公司 | 一种消除代码构建差异的方法及装置 |
CN111771187B (zh) * | 2019-01-31 | 2021-12-10 | 华为技术有限公司 | 一种消除代码构建差异的方法及装置 |
CN115617352A (zh) * | 2022-12-02 | 2023-01-17 | 中汽研软件测评(天津)有限公司 | 基于安全编码标准的c代码检测方法、设备和存储介质 |
Also Published As
Publication number | Publication date |
---|---|
US20070266379A1 (en) | 2007-11-15 |
JP2007304840A (ja) | 2007-11-22 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN101071385A (zh) | 编译方法、调试方法、编译程序和调试程序 | |
US7937692B2 (en) | Methods and systems for complete static analysis of software for building a system | |
US8091071B2 (en) | Method and system for template-based code generation | |
CN101339532B (zh) | 一种Web应用系统的自动化测试方法及装置 | |
US8745595B2 (en) | Information processing apparatus and method of acquiring trace log | |
US5966536A (en) | Method and apparatus for generating an optimized target executable computer program using an optimized source executable | |
JP4057938B2 (ja) | コンパイラ、コンパイル方法、及びプログラム開発ツール | |
US7689973B2 (en) | Language for development of test harness files | |
US20100095159A1 (en) | Apparatus and method for automatic testing of software or digital devices | |
US20020198868A1 (en) | System and method for specification tracking in a Java compatibility testing environment | |
US20110126179A1 (en) | Method and System for Dynamic Patching Software Using Source Code | |
JP2007141173A (ja) | コンパイルシステム、デバッグシステムおよびプログラム開発システム | |
US20060230393A1 (en) | Universal string analyzer and method thereof | |
US20120304154A1 (en) | Software application fine-tuning method, system, and corresponding computer program product | |
JP2005523516A (ja) | 複数のカーネルバージョン上でランするカーネルモジュールを修正する装置及び方法 | |
US20070074185A1 (en) | Identifier expressions | |
CN102426534B (zh) | 一种实现测试脚本语言转换成可执行指令的方法及系统 | |
US7716656B2 (en) | Nullable and late binding | |
CN109857637A (zh) | 一种基于注解的Java语言方法覆盖率和方法输入输出统计方法及装置 | |
WO2023133932A1 (zh) | 一种基于动态传递参数的ate装置和传输方法 | |
AU2004260392A1 (en) | System and method for implementing quality control rules formulated in accordance with a quality control rule grammar | |
US20150020051A1 (en) | Method and apparatus for automated conversion of software applications | |
CN102203733A (zh) | 编译方法及编译程序 | |
EP1388063B1 (en) | System and method for automated assertion acquisition in a java compatibility testing | |
CN101751321B (zh) | 一种动态可视化查看变量的实现方法及系统 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
AD01 | Patent right deemed abandoned |
Effective date of abandoning: 20071114 |
|
C20 | Patent right or utility model deemed to be abandoned or is abandoned |