编译方法以及编译程序的制作方法

文档序号:6480358阅读:199来源:国知局
专利名称:编译方法以及编译程序的制作方法
技术领域
本发明涉及编译方法以及编译程序,尤其涉及将以面向对象语言 描述的至少具有一个类的输入程序转换为目标程序的编译方法以及编 译程序。
背景技术
近些年,在软件开发中程序的规模逐渐趋向大规模化。为此,可 维护性以及再利用性高的面向对象语言引人瞩目。在此,面向对象语 言是指一种语言,其描述对象的动作,并将对象的动作及该对象组合 起来作为程序来描述。并且,对象是指数据以及操作该数据的过程(方 法)被一体化而成的单位。
面向对象语言例如有"〔++"。 '(++"是在过程性的编程语言"(:"的 基础上添加了对面向对象编程的支持的编程语言。并且,"〔++"作为取 代在长年编程中所广泛使用的"c"而引起了人们的注意,并且,逐渐从 "(:"移向了"〔++"编程。
不过,虽然'^++"与"<:"相比各种功能得到了强化,但是生成了冗 长的代码。因此,提出了各种削减这种冗长的代码的技术(例如,专
利文献1或专利文献2)。
在专利文献i中公开的方法是,删除有关对象没被生成的类的函数。
在此,类是指,在面向对象编程中,对汇集了数据以及作为该数 据的操作过程的方法的对象雏形进行定义。通过这种定义,从而可以 将同种的对象归结在一起处理。
8在专利文献2中公开了不生成不进行调用的方法的函数定义的方法。
在此,函数是指,接受被称为变元的数据,执行规定的处理,并 回答结果的一连串的指令群。函数成为以众多的编程语言构成程序的 要素。
专利文献l日本特开2005-18425号公报 专利文献2日本特开2006-285584号公报 然而,在上述专利文献l公开的方法中,被限定在不生成对象的 类,而在生成对象的类中的冗长函数就不能被删除。并且,在上述专 利文献2公开的方法中,被限定在不进行调用的方法,而对于进行调 用并存在冗长的函数定义的情况就不能对应了。

发明内容
本发明鉴于上述课题,目的在于提供一种编译方法以及编译程序, 其可以在不受是否有类对象(class object)的生成或是否有调用的影响 下,对生成的冗长的函数进行删除。
为了解决上述的课题,本发明所涉及的编译方法,将以面向对象 语言描述的,且至少具有一个类的输入程序转换为目标程序,其中包 括虚拟继承解析步骤,解析所述输入程序中的所述类是否以虚拟继 承被定义;特殊函数共通化步骤,在所述虚拟继承解析步骤的解析结 果为,所述类没有以虚拟继承被定义的情况下,生成将所述类的多个
构造函数以及多个析构函数的至少一方共通化的代码;以及生成步骤,
生成包含在特殊函数共通化步骤生成的所述代码的目标程序。
根据此方法,从而可以在不受是否有类对象的生成或是否有调用 的影响下,对没有以虚拟继承定义的类删除生成的冗长的函数(尤其 是构造函数和析构函数),从而提高代码生成效率。据此,可以在不受 是否有类对象的生成或调用的影响下,实现能够删除被生成的冗长的 函数的编译方法。最好是,在所述虚拟继承解析步骤,根据所述输入程序中所描述 的类定义,解析所述类是否以虚拟继承被定义了。
根据此方法,可以针对程序中被定义的类中的没有以虚拟程序定 义的类,删除被生成的冗长的构造函数和析构函数,从而提高代码生 成效率。
而且,最好是,在所述虚拟继承解析步骤,根据语言规范控制语 句,来解析所述类是否以虚拟继承被定义了,所述语言规范控制语句 是遵从语言规范在所述输入程序中被描述的控制语句。
根据此方法,例如可以通过程序员将按照邦ragma指令的语言规 范控制语句描述到输入程序,从而可以不必解析原来输入程序中所描 述的类定义,针对没有以虚拟继承定义的类删除被生成的冗长的构造 函数和析构函数,从而使代码生成效率提高。
而且,最好是,在所述虚拟继承解析步骤,根据语言规范控制指 令,来解析所述类是否以虚拟继承被定义了,所述语言规范控制指令 是遵从编译所述输入程序的编译系统的语言规范而被描述的控制指
根据此方法,例如可以通过程序员提供按照编译系统的选项的语 言规范控制指令,从而可以不必解析原来输入程序中所描述的类定义, 针对没有以虚拟继承定义的类删除被生成的冗长的构造函数和析构函 数,从而使代码生成效率提高。
而且,最好是,在所述特殊函数共通化步骤,生成将没有以虚拟 继承被定义的所述类的多个构造函数中的完全构造函数和部分构造函 数共通化的代码,所述完全构造函数是指,在生成构成类对象的完全 类对象时被调用的构造函数,而不是在生成部分类对象时被调用的构 造函数,所述部分构造函数是指,在生成构成类对象的部分类对象时 被调用的构造函数。在所述特殊函数共通化步骤,生成将没有以虚拟 继承被定义的所述类的多个析构函数中的完全析构函数和部分析构函 数共通化的代码,所述完全析构函数是指,在生成构成类对象的完全
10类对象时被调用的析构函数,而不是在生成部分类对象时被调用的析 构函数,所述部分析构函数是指,在生成构成类对象的部分类对象时 被调用的析构函数。
而且,最好是,在所述特殊函数共通化步骤,将没有以虚拟继承 被定义的所述类的多个构造函数中的完全构造函数和部分构造函数的 某一方的调用指令替换为另一方的调用指令,并通过删除作为被替换 的调用指令的构造函数的所述一方的构造函数的代码,从而生成将所 述类的完全构造函数和部分构造函数共通化的代码。在所述特殊函数 共通化歩骤,将没有以虚拟继承被定义的所述类的多个析构函数中的 完全析构函数和部分析构函数的某一方的调用指令替换为另一方的调 用指令,并通过删除作为被替换的调用指令的析构函数的所述一方的 析构函数的代码,从而生成将所述类的完全析构函数和部分析构函数 共通化的代码。
而且,最好是,在所述特殊函数共通化步骤,删除没有以虚拟继 承被定义的所述类的多个构造函数中的完全构造函数和部分构造函数 中某一方的代码,并通过将表示完全构造函数的开头地址的标记和表 示部分构造函数的开头地址的标记配置到没有被删除的另一方代码的 开头,从而生成将所述类的完全构造函数和部分构造函数共通化的代 码。在所述特殊函数共通化步骤,删除没有以虚拟继承被定义的所述 类的多个析构函数中的完全析构函数和部分析构函数中某一方的代 码,并通过将表示完全析构函数的开头地址的标记和表示部分析构函 数的开头地址的标记配置到没有被删除的另一方代码的开头,从而生 成将所述类的完全析构函数和部分析构函数共通化的代码。
根据此方法,可以删除被生成的冗长的函数的完全构造函数和部 分构造函数的某一方,从而使代码生成效率提高。
并且,本发明不仅可以作为具有这些特征性的步骤的编译方法来 实现,而且还可以作为将这些编译方法中所包含的特征性步骤作为单 元的编译装置来实现,而且,还可以作为使计算机执行该编译方法中
11所包含的特征性步骤的编译器(编译程序)来实现。并且,不言而喻,
这些编译程序还可以通过光盘(Compact Disc-Read OnlyMemory : CD—ROM)等记录介质或互联网等传输介质来流通。
通过本发明,可以提供一种编译方法以及编译程序,其可以在不受是否有类对象的生成或是否有调用的影响下,删除生成的冗长的函数。据此可以达到提高代码生成效率的效果。


图1是由本发明的实施例所涉及的编译器执行的处理内容的一个例子的流程图。
图2是在虚拟继承解析步骤S10执行的处理内容的第一个例子的流程图。
周3是在虚拟继承解析步骤S10执行的处理内容的第二个例子的流程图。
图4是在虚拟继承解析步骤S10执行的处理内容的第三个例子的流程图。
图5是在特殊函数共通化步骤Sll执行的处理内容的第一个例子的流程图。
图6是在特殊函数共通化步骤Sll执行的处理内容的第二个例子的流程图。
图7是示出在程序存储部1存储的源程序的一个例子的图。图8是示出以以往的方法进行编译的情况下的汇编程序输出结果的图。
图9是示出以以往的方法进行编译的情况下的汇编程序输出结果的图。
图10是示出以以往的方法进行编译的情况下的汇编程序输出结果的图。
图11是示出是否为共通化对象的共通化对象判定标志的内容的示例图。
图12是示出以本发明的方法进行编译的情况下的汇编程序输出结果的图。
图13是示出以本发明的方法进行编译的情况下的汇编程序输出结果的图。
图14是示出以本发明的方法进行编译的情况下的汇编程序输出结果的图。
图15是示出以本发明的方法进行编译的情况下的汇编程序输出
结果的图。
图16是示出以本发明的方法进行编译的情况下的汇编程序输出
结果的图。
图17是示出以本发明的方法进行编译的情况下的汇编程序输出
结果的图。
符号说明
1程序存储部
2生成代码存储部
具体实施例方式
以下参照附图对本发明的实施例所涉及的编译方法进行说明。
另外,以下的实施例仅为本发明的一个具体的例子,但本发明的技术范围并非受此所限。
图1是编译器执行的处理内容的一个例子的流程图。在此,编译器是指,将人以编译语言描述的软件的设计图(源程序)转换为计算机能够执行的形式(对象代码)的软件(编译程序)。
首先,编译器执行输入步骤(S1),例如读取程序存储部1中所存储的程序头文件以及源程序。
之后,编译器执行语法分析步骤(S2),即分析在输入步骤S1读取的源程序的语法,并生成符号表和语法树。
在此,符号表是一个列表,由在分析时检测出的所有标识符和这些标识符在程序中的位置以及属性构成,并且,符号表也是编译器判断标识符的使用方法时所利用的列表。并且,语法树是表示编程语言的语法的树结构。
之后,编译器根据生成的语法树,执行生成中间代码的中间代码生成步骤(S3)。
之后,编译器执行最佳化步骤(S4),即对在中间代码生成步骤
S3生成的中间代码进行各种最佳化。
之后,编译器执行资源分配步骤(S5),即对在最佳化步骤S4被最佳化了的中间代码中所包含的所有变数,分配寄存器或存储器等硬件资源。
之后,执行输出步骤(S6),即将在资源分配步骤S5被进行了资源分配的中间代码转换为对象代码,并作为对象程序输出到生成代码存储部2。在输出步骤S6输出的对象程序被存储到生成代码存储部2。
最佳化步骤S4如图1所示,包括虚拟继承解析步骤SIO、特殊函数共通化步骤Sll、以及其他的最佳化步骤S12。
虚拟继承解析步骤S10解析中间代码,并解析在程序中存在的类是否以虚拟继承被定义。
在此,虚拟继承是用于,在进行从多个父类中继承类的性质的多重继承的同时,避开基类的重复继承的类继承方法。例如,有两个继承了某个类的类,在多重继承这两个类的情况下,继承两次最原始的类(基类)。在虚拟继承中,将继承了两次的作为最原始的基类,作为虚拟基本类来声明,并通过不区别虚拟基本类的实例,从而可以防止继承的重复。
在特殊函数共通化步骤Sll,按照虚拟继承解析步骤S10的解析结果,将生成的冗长的多个构造函数或多个析构函数共通化。
在此,构造函数是指,在以面向对象的编程语言生成新的对象之
14时被调用并进行内容的初始化等的函数,也称为构造符。并且,析构函数是指,在以面向对象的编程语言删除对象时被调用并进行后处理等的函数,也称为析构符。
有关虚拟继承解析步骤SIO以及特殊函数共通化步骤Sll的详细内容待以后叙述。
并且,其他的最佳化步骤S12是一般的最佳化步骤,不是本发明
的着重点,因此省略说明。
并且,对于输入步骤Sl、语法分析步骤S2、中间代码生成步骤S3、资源分配步骤S5、对象输出步骤S6、以及其他最佳化步骤S12,由于与以往的处理相同,不是本发明的着重点。因此省略详细说明。
并且,在本发明的虚拟继承解析步骤SIO以及特殊函数共通化步骤Sll,并非仅限定于中间代码生成步骤S3和资源分配步骤S5之间的最佳化步骤S4内,若编译步骤内的区间为能够解析并进行共通化的状态,则可以分别在某个区间(S1至S6的区间内)内被执行。
以下,对本发明的着眼点即虚拟继承解析步骤SIO以及特殊函数共通化步骤S11进行说明。
图2是在虚拟继承解析步骤SIO被执行的处理内容的第一个例子的流程图。
在虚拟继承解析步骤SIO,对每个与在输入步骤Sl被输入的源程序(输入程序)相对应的类定义重复进行以下的处理(图2中的循环A),即对在中间代码生成步骤S3生成的中间代码内所描述的每个类定义重复进行以下的处理(图2中的循环A)。
首先,对输入程序确认是否存在作为解析对象的类定义。
在解析对象(类定义)存在的情况下,中间代码内所描述的类(包含被继承的类)通过虚拟继承,来解析是否进行了类定义(S1021)。
在通过虚拟继承类定义没有被进行的情况下(S1021的"否"的情况),将解析了的该类的所有构造函数或析构函数作为共通化的对象(S1022)。例如可以以表示作为共通化对象的共通化判定标志等来控制。
在通过虚拟继承进行了类定义的情况下(S1021的"是"的情况),不将解析了的该类的所有构造函数或析构函数作为共通化的对象
(S1023)。例如可以以表示不作为共通化对象的共通化判定标志等来控制。
之后,对输入程序确认是否存在是解析对象而未被解析的其他的类定义。在是解析对象而未被解析的其他的类定义存在的情况下,直到作为解析对象的类定义不存在为止,重复进行循环A。在是解析对象而未被解析的其他的类定义不存在的情况下,循环A结束,从而处理也结束。
如以上所述,在虚拟继承解析步骤SIO,解析中间代码,并解析程序中所存在的类是否通过虚拟继承被定义。
并且,关于表示是否为共通化对象的信息的形态,只要在特殊函数共通化步骤Sll能够被参考,即可以是中间代码内的数据,也可以是与类相关联的独立的数据。
图3是在虚拟继承解析步骤SIO执行的处理内容的第二个例子的流程图。
在虚拟继承解析步骤S10与图2同样,对每个与输入程序相对应的类定义重复进行以下的处理(图3中的循环B)。
首先,对输入程序确认是否存在作为解析对象的类定义。
在解析对象(类定义)存在的情况下,解析在输入程序中的描述中的语言规范,是否通过语言规范控制语句被控制为不包含虚拟继承的语言规范(S1031)。在此,语言规范控制语句是指,根据语言规范在输入程序中描述的控制语句。例如,通过将用于指示使像邦ragma这样的语言规范中的特殊功能有效的控制语句在源程序中描述,从而控制向编译器直接提供有关语言规范的信息。
在通过语言规范控制语句,被控制为不包含虚拟继承的语言规范的情况下(S1031的"否"的情况),将该类中的所有构造函数或析构函
16数作为共通化对象(S1032)。
在不是这种情况时,即在通过语言规范控制语句,未被控制为不
包含虚拟继承的语言规范的情况下(S1031的"是"的情况),则不将该类中的所有构造函数或析构函数作为共通化对象(S1(B3)。
之后,对输入程序确认是否存在是解析对象而未被解析的其他的类定义。在是解析对象而未被解析的其他的类定义存在的情况下,直到作为解析对象的类定义不存在为止,重复进行循环B。在是解析对象而未被解析的其他的类定义不存在的情况下,循环B结束,从而处理也结束。
如以上所述,在虚拟继承解析步骤SIO,解析中间代码,并解析程序中所存在的类是否通过虚拟继承被定义。
图4是在虚拟继承解析步骤S10执行的处理内容的第三个例子的流程图。
在虚拟继承解析步骤S10与图4同样,对每个与输入程序相对应的类定义重复进行以下的处理(图4中的循环C)。
首先,对输入程序确认是否存在作为解析对象的类定义。
在解析对象(类定义)存在的情况下,解析在输入程序中描述的语言规范,是否通过语言规范控制指令,被控制为不包含虚拟继承的语言规范(S1041)。在此,语言规范控制指令是指,根据编译输入程序的编译系统的语言规范,而被描述的控制指令。例如,通过将用于指示使像指令行选项这样的编译器中的特殊功能有效的指令在源程序中描述,从而控制向编译系统直接提供有关语言规范的信息。
在通过语言规范控制指令,被控制为不包含虚拟继承的语言规范的情况下(S1041的"是"的情况),将该类的所有构造函数或析构函数作为共通化对象(S1042)。
在不是这种情况时,即在通过语言规范控制指令,未被控制为不包含虚拟继承的语言规范的情况下(S1041的"否"的情况),则不将该类中的所有构造函数或析构函数作为共通化对象(S1043)。
17之后,对输入程序确认是否存在是解析对象而未被解析的其他的类定义。在是解析对象而未被解析的其他的类定义存在的情况下,直到作为解析对象的类定义不存在为止,重复进行循环C。在是解析对象而未被解析的其他的类定义不存在的情况下,循环C结束,从而处理也结束。
如以上所述,在虚拟继承解析步骤SIO,解析中间代码,并解析程序中所存在的类是否通过虚拟继承被定义。
并且,关于图2到图4说明的虚拟继承解析步骤S10的第一至第三的处理内容,例如可以通过附加优先度,而作为包含图2到图4的所有步骤的一个虚拟继承解析步骤10,也可以自由选择组合。
以下,对特殊函数共通化步骤S11进行说明。
图5是在特殊函数共通化步骤Sll执行的处理内容的第一个例子的流程图。
在特殊函数共通化步骤Sll,按照在虚拟继承解析步骤S10的解析结果,进行对在中间代码生成步骤S3生成的中间代码内所描述的各个类的构造函数的处理(循环D),以及对析构函数的处理(循环E)。
首先,对在虚拟继承解析步骤SIO解析的中间代码内所描述的各个类,进行是否存在构造函数的确认。
在构造函数存在的情况下,判断该构造函数是否为共通化对象(S1151)。
在该构造函数是共通化对象的情况下(S1151的"是"的情况),将针对该构造函数的完全构造函数和部分构造函数的任一方的调用指令替换为另外一方(S1152)。并且,删除被替换的一方(完全或部分)的构造函数的代码(S1153)。
在此,完全构造函数是指,在生成构成类对象的完全类对象时被调用的构造函数,而不是在生成构成类对象的部分类对象时被调用的构造函数。并且,部分结构函数是指,在生成构成类对象的部分类对象时被调用的构造函数。
18之后,对在虚拟继承解析步骤SIO解析的中间代码内所描述的各个类,进一步进行是否存在构造函数的确认。进而,在构造函数存在的情况下,对各个类的构造函数重复进行循环D所示的处理内容。在构造函数不存在的情况下,循环D结束,从而循环D所示的处理也结束。
并且,在S1151若该构造函数不是共通化对象则不进行任何处理(S1151的"否"的情况)。并且,结束循环D的处理。
接着,对循环E所示的析构函数进行处理。首先,对在虚拟继承解析步骤SIO解析的中间代码内所描述的各个类,进行是否存在析构函数的确认。
在析构函数存在的情况下,判断该析构函数是否为共通化对象(S1154)。
在该析构函数是共通化对象的情况下(S1154的"是"的情况),将针对该析构函数的完全析构函数和部分析构函数的任一方的调用指令替换为另外一方(S1155)。并且,删除被替换的一方(完全或部分)的析构函数的代码(S1156)。
在此,完全析构函数是指,在生成构成类对象的完全类对象时被调用的析构函数,而不是在生成构成类对象的部分类对象时被调用的析构函数。并且,部分析构函数是指,在生成构成类对象的部分类对象时被调用的析构函数。
之后,对在虚拟继承解析步骤SIO解析的中间代码内所描述的各个类,进一步进行是否存在析构函数的确认。进而,在析构函数存在的情况下,对各个类的析构函数重复进行循环E所示的处理内容。在析构函数不存在的情况下,循环E结束,从而循环E所示的处理也结束。
并且,在S1154若该析构函数不是共通化对象则不进行任何处理(S1154的"否"的情况)。并且,结束循环E的处理。
如以上所述,在特殊函数共通化步骤Sll,按照虚拟继承解析步骤S10的解析结果,使被生成的冗长的多个构造函数或多个析构函数共通化。据此,可以删除被生成的冗长的函数的完全构造函数和部分构造函数的某一方,从而提高代码生成效率。
图6是在特殊函数共通化步骤Sll执行的处理内容的第二个例子的流程图。
与图5同样,在特殊函数共通化步骤Sll,按照在虚拟继承解析
步骤S10的解析结果,进行对在中间代码生成步骤S3生成的中间代码内所描述的各个类的构造函数的处理(循环E),以及对析构函数的处理(循环G)。
首先,对在虚拟继承解析步骤S10解析的中间代码内所描述的各个类,进行是否存在构造函数的确认。
在构造函数存在的情况下,判断该构造函数是否为共通化对象
(51161) 。
在该构造函数是共通化对象的情况下(S1161的"是"的情况),将针对该构造函数的完全构造函数和部分构造函数的任一方的代码删除
(51162) 。并且,将表示完全构造函数的开头地址的标记和表示部分构造函数的开头地址的标记配置到另一方代码的开头(S1163)。
之后,对在虚拟继承解析步骤S10解析的中间代码内所描述的各个类,进一步进行是否存在构造函数的确认。进而,在构造函数存在的情况下,对各个类的构造函数重复进行循环F所示的处理内容。在构造函数不存在的情况下,循环F结束,从而循环F所示的处理也结束。
并且,在S1161若该构造函数不是共通化对象则不进行任何处理(S1161的"否"的情况)。并且,结束循环D的处理。
接着,对循环G所示的析构函数进行处理。首先,对在虚拟继承解析步骤S10解析的中间代码内所描述的各个类,进行是否存在析构函数的确认。
在析构函数存在的情况下,判断该析构函数是否为共通化对象(51164) 。
在该析构函数是共通化对象的情况下(SI 164的"是"的情况),将针对该析构函数的完全析构函数和部分析构函数的任一方的代码删除
(51165) 。并且,将表示完全析构函数的开头地址的标记和表示部分析构函数的开头地址的标记配置到另一方代码的开头(S1165)。
之后,对在虚拟继承解析步骤SIO解析的中间代码内所描述的各个类,进一步进行是否存在析构函数的确认。进而,在析构函数存在的情况下,对各个类的析构函数重复进行循环G所示的处理内容。在析构函数不存在的情况下,循环G结束,从而循环G所示的处理也结束。
并且,在SI 164若该析构函数不是共通化对象则不进行任何处理(S1164的"否"的情况)。并且,结束循环G的处理。
如以上所述,在特殊函数共通化步骤Sll,按照虚拟继承解析步骤SIO的解析结果,使被生成的冗长的多个构造函数或多个析构函数共通化。据此,可以删除被生成的冗长的函数的完全构造函数和部分构造函数的某一方,从而提高代码生成效率。
如以上所述,通过执行包括虚拟继承解析步骤SIO和特殊函数共通化步骤Sll的最佳化步骤S4,从而可以在不受是否有类对象的生成或是否有调用的影响下,对没有以虚拟继承定义的类删除生成的冗长的函数(尤其是构造函数和析构函数),从而提高代码生成效率。据此,可以在不受是否有类对象的生成或调用的影响下,实现能够删除被生成的冗长的函数的编译方法。(实施例)
以下以使用€++语言的例子来对本发明的编译方法进行说明。图7示出了程序存储部1中所存储的源程序的一个例子。以下,对输入了图7所示的源程序的情况下的编译方法进行说明。在此,前提条件是,<6兄€口?>以〔++模式编译。
在图7所示的源文件〈ex,cpp〉中定义了四个對X、 Y、 Z、 U)。在
21图7中,对于四个类(X、 Y、 Z、 U)的各个构造函数定义,分别以(1) (4)示出。同样,对于四个类(X、 Y、 Z、 U)的各个析构函数定义,分别 以(5) (8)示出。
图8至图10示出了以以往的方法进行编译的情况下的汇编输出结 果。并且,图8至图10示出的是以gcc version 3.3.6 release编译
器附加了最佳化选项时的汇编输出结果。在此,为了便于说明,将以".L" 开始的标记除外。
在以往的方法中,如图8至图IO所示,各个类的构造函数定义和 析构函数定义,被分别无条件地转换为完全构造定义以及部分构造定 义和完全析构函数定义以及部分析构函数定义的代码。图7中所示出 的构造函数以及析构函数,和图8至图10所示出的完全构造函数以及 部分构造函数,和完全析构函数以及部分析构函数的对应关系如以下 "表1"和"表2"所示。 (表l )
构造函数完全构造函数部分构造函数
(1)X::X()_ZN1XC1Ev一ZNlXC2Ev
(2)Y::Y()一ZN1YC1Ev一ZNlYC2Ev
(3)Z::Z()一ZN1ZC1Ev—ZNlZC2Ev
(4)U::U()_ZN1UC1Ev—ZNlUC2Ev
表2 )
析构函数完全析构函数部分析构函数
(5)X:: X()一ZN1XD1Ev—ZNlXD2Ev
(6)Y:: Y()一ZN1YD1Ev—ZNlYD2Ev
(7)Z:: Z()~~一ZN1ZD1Ev_ZNlZD2Ev
(8)U:: U()~~> _ZN1UD1Ev_ZNlUD2Ev通过图8至图10可知,"—ZN1XC1Ev"以及"—ZlXC2Ev"的代码、 "_ZN1ZC1Ev"以及"—ZNlZC2Ev"的代码、"—ZN1XD1Ev"以及 "—ZlXD2Ev"的代码、和ZNlZDlEv"以及"—ZNlZD2Ev"的代码均是
由完全相同的汇编代码生成,并且被生成的代码是冗长的。
以下,以使用〔++语言的例子,示出本实施例中的编译方法。 在中间代码生成步骤生成的中间代码在虚拟继承解析步骤SIO,
按照每个类定义,由图2所示的循环A的处理内容来执行。在本实施
例中,图7所示的四个类定义(X、 Y、 Z、 U)成为对象。
在图7中,类X由于类定义没有通过虚拟继承被执行,因此类X
的构造函数"X::X()"以及析构函数"X:: X()"作为共通化对象被记录。 图11示出了表示是否为共通化对象的共通化对象判定标志的内容。
如图11所示,在类X的构造函数中间代码以及类X的析构函数 中间代码的共通化对象判定标志中,记录"TRUE"。这样,通过记录表 示作为共通化对象的共通化判定标志,从而类X的构造函数"X::X()"以 及析构函数"X:: X()"作为共通化对象被记录。
并且,在图7中,由于类Y利用关键字"virtuar从类X通过虚拟 继承,类定义被执行,因此类Y的构造函数"Y::Y()"以及析构函数"Y:: Y()"不作为共通化对象记录。
在此,例如图11所示,通过在类Y的构造函数中间代码以及类Y 的析构函数中间代码的共通化对象判定标志中记录"FALSE",从而记
录不是共通化对象。
并且,在图7中,类Z从类X继承,由于不是虚拟继承,并且被 继承的类X也没有通过虚拟继承被执行类定义,因此类Z的构造函数 "Z::Z()"以及析构函数"Z:: Z()"作为共通化对象被记录。
在此,例如图11所示,通过在类Z的构造函数中间代码以及类Z 的析构函数中间代码的共通化对象判定标志中记录"TRUE",从而记录 是共通化对象。
23并且,在图7中,类U从类Y和类Z继承,虽然&有进行虚拟继 承,但被继承的类Y是通过虚拟继承而被定义的。因此,类U的构造 函数"U::U()"以及析构函数"U:: U()"不作为共通化对象被记录。
在此,例如图11所示,通过在类U的构造函数中间代码以及类U 的析构函数中间代码的共通化对象判定标志中记录"FALSE",从而记 录不是共通化对象。
并且,图ll所示的共通化对象判定标志是表示是否为共通化对象 的信息的一个形态,只要能够在特殊函数共通化步骤Sll能够被参考, 即可以是上述例子中的中间代码内的数据,也可以是与类相关联起来 的独立的数据。
接着,按照上述的虚拟继承解析步骤SIO中的解析结果,特殊函 数共通化步骤S11被执行。
在图5的特殊函数共通化步骤Sll执行的处理内容的第一个例子 中,执行了循环D的处理内容和循环E的处理内容。在本实施例中, 在特殊函数共通化步骤Sll,通过参考图11所示的共通化判定标志, 从而可以根据虚拟继承解析步骤SIO的解析结果,将生成的冗长的多 个构造函数或多个析构函数共通化。根据图11,类X以及类Z的构造 函数和析构函数成为共通化对象。
因此,在完全构造函数和部分构造函数的某一方的调用指令被替 换为另一方的调用指令之后,删除被替换后的构造函数的代码。
在本实施例中,将部分构造函数的调用替换为完全构造函数的调 用,并删除部分构造函数(循环D的处理)。关于析构函数也进行同样 的处理(循环E的处理)。进行上述处理的结果在图12至图14示出。
图12至图14示出了以本发明的方法进行编译的情况下的汇编输 出结果。
图中的A标记以及下线部分所示出的是,被替换的完全构造函数 调用指令以及完全析构函数调用指令。
并且,方框内的部分是在特殊函数共通化步骤Sll,被删除的部
24分构造函数代码以及部分析构函数代码。
从图12至图14的汇编输出结果可知,冗长的代码已被删除。 并且,对特殊函数共通化步骤Sll的图6中的第二个例子进行以
下说明。在图6中的特殊函数共通化步骤Sll执行的处理内容的第二 个例子中,首先,执行循环F的处理内容和循环G的处理内容。与图 5同样,在本实施例中,在特殊函数共通化步骤Sll,通过参考图ll 所示的共通化判定标志,从而可以根据虚拟继承解析步骤SIO的解析 结果,将被生成的冗长的多个构造函数或多个析构函数共通化。根据 图11,类X以及类Z的构造函数和析构函数成为共通化对象。
因此,在删除完全构造函数和部分构造函数的某一方的代码后, 将表示完全构造函数的开头地址的标记和表示部分构造函数的开头地 址的标记配置到另一方的代码的开头。在本具体例子中,删除部分构 造函数(循环F的处理)。关于析构函数也进行同样的处理(循环G的 处理)。进行了上述处理的结果在图15至图17中示出。
图15至图17示出了以本发明的方法进行编译的情况下的汇编输 出结果。
图中方框内的部分是被删除的部分构造函数代码以及部分析构函 数代码,女记号以及下线部分是表示新被配置的部分构造函数或部分 析构函数的开头地址的标记。
根据图15至图17的汇编输出结果,可以得知冗长的代码已被删除。
另外,虚拟继承解析步骤S10为图3以及图4所示的处理内容的 情况下,除通过由用户控制的语言规范是否包含虚拟继承,来将构造 函数或析构函数作为共通化对象以外,与图2的形态一样。
作为图3所示的处理内容的具体例子,例如在程序中,保证在 EC++(embedded—C++)语言规范内描述的编译指示如"#pragma
—611^6(1(16(1一€++"语言规范控制语句存在的情况下,由于虚拟继承不
属于EC十+语言规范,因此将所有的类的构造函数以及析构函数作为共
25通化对象。因此,与上述的实施例同样,通过执行特殊函数共通化步 骤Sll,从而可以删除冗长的代码。
作为图4所示的处理内容的具体例子,例如当发出指定以EC++ 语言模式对编译器进行编译的选项的情况下,由于虛拟继承不属于
EC十+语言规范,因此将所有的类的构造函数以及析构函数作为共通化 对象,所述选项例如是"-embedded_c++"。因此,与上述同样,通过 进行特殊函数共通化步骤Sll,从而可以删除冗长的代码。
如以上所述,根据本发明的编译方法以及编译程序,通过执行包 括虚拟继承解析步骤S10和特殊函数共通化步骤Sll的最佳化步骤 S4,从而可以不受是否有类对象的生成或调用的影响,就可以实现能 够删除被生成的冗长的函数的编译方法。
以上虽然通过实施例,对本发明的编译方法以及编译程序进行了 说明,但本发明并非受实施例所限。只要不超脱本发明的主旨,以本 实施例执行的本领域技术人员能够想到的各种变形例,或组合在不同 的实施例中的处理内容并构筑的形态,均包含在本发明的范围内。
本发明可以利用于编译方法以及编译程序,尤其可以利用于移动 电话或个人数字助理(Personal Digital Assistant : PDA)等,需要代
码大小较小的对象代码的组装设备中所使用的程序的编译方法以及编 译程序。
权利要求
1. 一种编译方法,将以面向对象语言描述的、且至少具有一个类的输入程序转换为目标程序,其特征在于,包括虚拟继承解析步骤,解析所述输入程序中的所述类是否以虚拟继承被定义;特殊函数共通化步骤,在所述虚拟继承解析步骤的解析结果为,所述类没有以虚拟继承被定义的情况下,生成将所述类的多个构造函数以及多个析构函数的至少一方共通化的代码;以及生成步骤,生成包含在特殊函数共通化步骤生成的所述代码的目标程序。
2. 如权利要求l所述的编译方法,其特征在于, 在所述虚拟继承解析步骤,根据所述输入程序中所描述的类定义,解析所述类是否以虚拟继承被定义了 。
3. 如权利要求l所述的编译方法,其特征在于, 在所述虚拟继承解析步骤,根据语言规范控制语句,来解析所述类是否以虚拟继承被定义了,所述语言规范控制语句是遵从语言规范 在所述输入程序中被描述的控制语句。
4. 如权利要求l所述的编译方法,其特征在于, 在所述虚拟继承解析步骤,根据语言规范控制指令,来解析所述类是否以虚拟继承被定义了 ,所述语言规范控制指令是遵从编译所述 输入程序的编译系统的语言规范而被描述的控制指令。
5. 如权利要求l所述的编译方法,其特征在于,在所述特殊函数共通化步骤,生成将没有以虚拟继承被定义的所 述类的多个构造函数中的完全构造函数和部分构造函数共通化的代 码,所述完全构造函数是指,在生成构成类对象的完全类对象时被调 用的构造函数,而不是在生成部分类对象时被调用的构造函数,所述 部分构造函数是指,在生成构成类对象的部分类对象时被调用的构造 函数。
6. 如权利要求5所述的编译方法,其特征在于, 在所述特殊函数共通化步骤,生成将没有以虚拟继承被定义的所述类的多个析构函数中的完全析构函数和部分析构函数共通化的代 码,所述完全析构函数是指,在生成构成类对象的完全类对象时被调 用的析构函数,而不是在生成部分类对象时被调用的析构函数,所述 部分析构函数是指,在生成构成类对象的部分类对象时被调用的析构 函数。
7. 如权权利要求1所述的编译方法,其特征在于, 在所述特殊函数共通化步骤,将没有以虚拟继承被定义的所述类的多个构造函数中的完全构造函数和部分构造函数的某一方的调用指 令替换为另一方的调用指令,并通过删除作为被替换的调用指令的构 造函数的所述一方的构造函数的代码,从而生成将所述类的完全构造 函数和部分构造函数共通化的代码。
8. 如权利要求7所述的编译方法,其特征在于, 在所述特殊函数共通化步骤,将没有以虚拟继承被定义的所述类的多个析构函数中的完全析构函数和部分析构函数的某一方的调用指 令替换为另一方的调用指令,并通过删除作为被替换的调用指令的析 构函数的所述一方的析构函数的代码,从而生成将所述类的完全析构 函数和部分析构函数共通化的代码。
9.如权利要求1所述的编译方法,其特征在于,在所述特殊函数共通化步骤,删除没有以虚拟继承被定义的所述 类的多个构造函数中的完全构造函数和部分构造函数中某一方的代 码,并通过将表示完全构造函数的开头地址的标记和表示部分构造函 数的开头地址的标记配置到没有被删除的另一方代码的开头,从而生 成将所述类的完全构造函数和部分构造函数共通化的代码。
10.如权利要求9所述的编译方法,其特征在于, 在所述特殊函数共通化步骤,删除没有以虚拟继承被定义的所述 类的多个析构函数中的完全析构函数和部分析构函数中某一方的代 码,并通过将表示完全析构函数的开头地址的标记和表示部分析构函 数的开头地址的标记配置到没有被删除的另一方代码的开头,从而生 成将所述类的完全析构函数和部分析构函数共通化的代码。
11 . 一种编译程序,进行下述编译,将以面向对象语言描述的, 且至少具有一个类的输入程序转换为目标程序,并使计算机执行以下步骤:虚拟继承解析步骤,解析所述输入程序中的所述类是否以虚拟继承被定义;特殊函数共通化步骤,在所述虚拟继承解析步骤的解析结果为, 所述类没有以虚拟继承被定义的情况下,生成将所述类的多个构造函 数以及多个析构函数的至少一方共通化的代码;以及生成步骤,生成包含在特殊函数共通化步骤生成的所述代码的目 标程序。
12.如权利要求l l所述的编译程序,其特征在于, 在所述虚拟继承解析步骤,根据所述输入程序中所描述的类定义,4解析所述类是否以虚拟继承被定义了。
13.如权利要求l l所述的编译程序,其特征在于, 在所述虚拟继承解析步骤,根据语言规范控制语句,来解析所述 类是否以虚拟继承被定义了,所述语言规范控制语句是遵从语言规范 在所述输入程序中被描述的控制语句。
14.如权利要求l l所述的编译程序,其特征在于, 在所述虚拟继承解析步骤,根据语言规范控制指令,来解析所述 类是否以虚拟继承被定义了,所述语言规范控制指令是遵从编译所述 输入程序的编译系统的语言规范而被描述的控制指令。
15.如权利要求l l所述的编译程序,其特征在于, 在所述特殊函数共通化步骤,生成将没有以虚拟继承被定义的所 述类的多个构造函数中的完全构造函数和部分构造函数共通化的代 码,所述完全构造函数是指,在生成构成类对象的完全类对象时被调 用的构造函数,而不是在生成部分类对象时被调用的构造函数,所述 部分构造函数是指,在生成构成类对象的部分类对象时被调用的构造 函数。
16.如权利要求l 5所述的编译程序,其特征在于, 在所述特殊函数共通化步骤,生成将没有以虚拟继承被定义的所 述类的多个析构函数中的完全析构函数和部分析构函数共通化的代 码,所述完全析构函数是指,在生成构成类对象的完全类对象时被调 用的析构函数,而不是在生成部分类对象时被调用的析构函数,所述 部分析构函数是指,在生成构成类对象的部分类对象时被调用的析构 函数。
17.如权利要求l l所述的编译程序,其特征在于, 在所述特殊函数共通化步骤,将没有以虚拟继承被定义的所述类 的多个构造函数中的完全构造函数和部分构造函数的某一方的调用指 令替换为另一方的调用指令,并通过删除作为被替换的调用指令的构 造函数的所述一方的构造函数的代码,从而生成将所述类的完全构造 函数和部分构造函数共通化的代码。
18.如权利要求l 7所述的编译程序,其特征在于,在所述特殊函数共通化步骤,将没有以虚拟继承被定义的所述类 的多个析构函数中的完全析构函数和部分析构函数的某一方的调用指 令替换为另一方的调用指令,并通过删除作为被替换的调用指令的析 构函数的所述一方的析构函数的代码,从而生成将所述类的完全析构 函数和部分析构函数共通化的代码。
19 .如权利要求1 1所述的编译程序,其特征在于, 在所述特殊函数共通化步骤,删除没有以虚拟继承被定义的所述类的多个构造函数中的完全构造函数和部分构造函数中某一方的代 码,并通过将表示完全构造函数的开头地址的标记和表示部分构造函 数的开头地址的标记配置到没有被删除的另一方代码的开头,从而生 成将所述类的完全构造函数和部分构造函数共通化的代码。
20.如权利要求l 9所述的编译程序,其特征在于, 在所述特殊函数共通化步骤,删除没有以虚拟继承被定义的所述类的多个析构函数中的完全析构函数和部分析构函数中某一方的代 码,并通过将表示完全析构函数的开头地址的标记和表示部分析构函 数的开头地址的标记配置到没有被删除的另一方代码的开头,从而生 成将所述类的完全析构函数和部分析构函数共通化的代码。
21. —种编译装置,执行下述编译方法,将以面向对象语言描 述的,且至少具有一个类的输入程序转换为目标程序,其特征在于, 包括虚拟继承解析单元,解析所述输入程序中的所述类是否以虚拟继 承被定义;特殊函数共通化单元,在所述虚拟继承解析单元的解析结果为, 所述类没有以虚拟继承被定义的情况下,生成将所述类的多个构造函数以及多个析构函数的至少一方共通化的代码;以及生成单元,生成包含在特殊函数共通化单元生成的所述代码的目 标禾呈序。
全文摘要
提供一种编译方法以及编译程序,可以在不受是否有类对象的生成或是否有调用的影响下,删除生成的冗长的函数,所述编译方法,将以面向对象语言描述的,且至少具有一个类的输入程序转换为目标程序,其中包括虚拟继承解析步骤,解析所述输入程序中的所述类是否以虚拟继承被定义;特殊函数共通化步骤,在所述虚拟继承解析步骤的解析结果为,所述类没有以虚拟继承被定义的情况下,生成将所述类的多个构造函数以及多个析构函数的至少一方共通化的代码;以及生成步骤,生成包含在特殊函数共通化步骤生成的所述代码的目标程序。
文档编号G06F9/45GK101488095SQ200910003488
公开日2009年7月22日 申请日期2009年1月15日 优先权日2008年1月18日
发明者浅尾忍 申请人:松下电器产业株式会社
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1