CN1313926C - 模板编译方法 - Google Patents
模板编译方法 Download PDFInfo
- Publication number
- CN1313926C CN1313926C CNB200410056064XA CN200410056064A CN1313926C CN 1313926 C CN1313926 C CN 1313926C CN B200410056064X A CNB200410056064X A CN B200410056064XA CN 200410056064 A CN200410056064 A CN 200410056064A CN 1313926 C CN1313926 C CN 1313926C
- Authority
- CN
- China
- Prior art keywords
- function
- template
- definition
- parameter
- function definition
- 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.)
- Expired - Fee Related
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
Landscapes
- Engineering & Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
本发明提供一种模板编译方法,由同一函数定义生成判定步骤(S105),解析函数定义代码和模板参数之间的依赖性,在没有依赖性的情况下,由函数定义公共化步骤(S106)定义公共函数,并删除公共化前的多个函数定义。然后,由函数调用置换步骤(S107),将公共化前的函数置换成到公共函数的调用。这样,由模板生成的多个函数定义代码中,通过使相同的函数定义代码的共有化,可以缩小因模板结构而增加的代码量。
Description
技术领域
本发明涉及一种将采用具有模板结构的高级语言所编写的程序转换成目的代码的编译方法。
背景技术
在近年的软件开发中,程序已经变得大规模化,随之,易维护、可重用性高的面向对象语言受人关注。
代表性的面向对象语言中可以举出C++语言。C++语言具有模板结构,可进行易维护和可重用性高的通用程序设计。而且,被称作STL(StandardTemplate Library)的标准模板库通常由编译程序提供,今后利用模板结构的程序设计会增加得越来越多。
图12表示编译利用了模板结构的C++程序时的生成代码一例。
如图12的源代码(a)以及(b)所示,用C++来定义表示类群和函数群的模板,根据提供模板参数可以很容易生成函数定义。在源代码(c)中,对于(a)或(b)的模板,通过提供模板参数int型和long,生成A<int>型、A<long>型的类、以及返回值为void型、调用参数为int型和long型的函数A<int>::f、A<long>::f,同时定义A<int>型的对象‘a’、A<long>型的对象‘b’。源代码(d)中,对生成的成员函数A<int>::f或A<long>::f进行调用。
图12的生成代码,是采用过去的编译方法对源代码进行编译得到的结果。模板中,提供int、long型参数后的结果,分别生成函数A<int>::f的定义代码(f)和函数A<long>::f的定义代码(g),而且函数h的定义代码(e)中,(f)、(g)的定义通过call语句调用。这里,call命令的操作符的标号,是表示函数定义的头地址的标号。如上所述,通过定义模板,提供模板参数,可以很容易生成多个类、函数。
过去的编译方法中,如果对模板提供不同模板参数,必须分别对各个参数值的函数(包含静态函数、外部函数、虚拟、非虚拟成员函数)生成定义不同的代码。比如,在上述图(12)中,对于int型模板参数,生成定义代码(f);对于long型模板参数,生成定义代码(g)。为此,根据[由模板生成的函数定义的代码量]×[模板参数的种类],总体代码量明显增大了。
但是,用模板生成的函数,有些情况下,不是因模板参数不同就生成完全不同的代码,而是有时也生成相同的代码。在上述图(12)的例中,函数A<int>::f和A<long>::f的模板参数虽然不同,但是生成的定义代码(f)和(g)却完全相同。
作为过去的技术,为防止代码量增加,提出一种程序记述方法,将程序公共部分,作为未指定类型的执行类,从具有虚拟调用参数化的模板的指定类型的接口类中分离出来(例如,参考专利文献1)。
然而,在上述过去的技术中,强制要求程序员要意识到将程序的公共部分作为未指定类型的的执行类进行程序的记述,这对程序员来说负担很大。
专利文献:特开平9——231077号公报(图8)
发明内容
本发明的目的在于提供一种模板编译方法,程序员不用注重最佳程序的记述,而可以缩小由于模板结构增加的代码量。
为达到上述目的,在本发明中,由模板生成的多个函数定义代码中,成为同一代码的多个函数定义代码通过CPU自动判定,实现成为这些同一代码的多个函数定义代码的公共化。
即,本发明之一,提供一种模板编译方法,将采用具有模板结构的高级语言所记述的输入程序转换成目的代码,其特征在于,包括:同一函数定义生成判定步骤,其判定在上述输入程序所包含的多个函数定义中模板对不同的模板参数是否生成同一函数定义;函数定义公共化步骤,当判定由上述同一函数定义生成判定步骤生成同一函数定义时,其将生成该同一函数定义的多个函数定义置换成仅仅一个公共函数定义;和函数调用置换步骤,当由上述函数定义公共化步骤置换成公共函数定义时,其将该公共化之前的上述多个函数的调用置换成上述公共函数定义的调用。
本发明之二,在本发明之一所述的模板编译方法中,其特征在于,上述同一函数定义生成判定步骤,在上述多个函数定义中,上述模板是函数模板,并且对在函数定义部分中是否存在依赖模板参数的部位进行解析。
本发明之三,在本发明之二所述的模板编译方法中,其特征在于,上述同一函数定义生成判定步骤,在上述解析结果、模板为函数模板的上述多个函数定义中,在函数定义部分不存在依赖模板参数的部位的情况下,生成至少包含文件名、模板函数名、以及实例化函数名的不依赖函数信息。
本发明之四,在本发明之一所述的模板编译方法中,其特征在于,上述同一函数定义生成判定步骤,在上述多个函数定义中,上述模板是类模板,并且对在成员函数定义部分中是否存在依赖模板参数的部位进行解析。
本发明之五,在本发明之四所述的模板编译方法中,其特征在于,上述同一函数定义生成判定步骤,在上述解析结果、模板为类模板的上述多个函数定义中,在成员函数定义部分不存在依赖模板参数的部位的情况下,生成至少包含文件名、模板函数名、以及实例化函数名的不依赖函数信息。
本发明之六,在本发明之一所述的模板编译方法中,其特征在于,上述同一函数定义生成判定步骤,在上述多个函数定义中,对上述模板为函数模板并且在函数定义部分中是否存在依赖模板参数的类型转换,是否存在依据依赖模板参数的调用参数的函数调用,以及以类型大小相同的模板参数进行实例化的函数定义是否已经存在,分别进行解析。
本发明之七,在本发明之六所述的模板编译方法中,其特征在于,上述同一函数定义生成判定步骤,当在上述解析结果、函数定义部分不存在依赖模板参数的类型变换,不存在依据依赖模板参数的调用参数的函数调用,并且以类型相同的模板参数进行实例化的函数定义已经存在的情况下,生成包含文件名、模板函数名、参数大小、以及实例函数名的特定参数同一函数信息。
本发明之八,在本发明之一所述的模板编译方法中,其特征在于,上述同一函数定义生成判定步骤,在上述多个函数定义中,对上述模板为类模板并且在成员函数定义部分中是否存在依赖模板参数的类型转换,是否存在依据依赖模板参数的调用参数的函数调用,以及以类型大小相同的模板参数进行实例化的函数定义是否已经存在,分别进行解析。
本发明之九,在本发明之八所述的模板编译方法中,其特征在于,上述同一函数定义生成判定步骤,当在上述解析结果、成员函数定义部分不存在依赖模板参数的类型变换,不存在依据依赖模板参数的调用参数的函数调用,并且以类型相同的模板参数进行实例化的函数定义已经存在的情况下,生成包含文件名、模板函数名、参数大小、以及实例函数名的特定参数同一函数信息。
本发明之十,在本发明之三或者之五所述的模板编译方法中,其特征在于,上述函数定义公共化步骤,接受上述同一函数定义生成判定步骤生成的不依赖函数信息;在上述不依赖函数信息中,由同一模板生成的实例化函数名登录公共函数名;将由上述同一模板生成的实例化函数的函数定义代码变更成上述公共函数的函数定义代码。
本发明之十一,在本发明之七或者之九所述的模板编译方法中,其特征在于,上述函数定义公共化步骤,接受由上述同一函数定义生成判定步骤生成的特定参数同一函数信息;在上述特定参数同一函数信息中,对由同一模板的同一参数大小生成的实例化函数名登录公共函数名;将由上述同一模板的同一参数大小生成的实例化函数的函数定义代码,变更成上述公共函数的函数定义代码。
本发明之十二,在本发明之一所述的模板编译方法中,其特征在于,上述函数调用置换步骤,将使用公共化前的函数的起始地址的函数调用命令,置换成上述函数定义公共化步骤中使用公共函数定义的起始地址的函数调用命令。
本发明之十三,在本发明之一所述的模板编译方法中,其特征在于,上述函数调用置换步骤,在函数调用为虚拟函数调用时,将登录在虚拟函数表中的上述公共化前的函数的起始地址,置换成上述函数定义公共化步骤中的公共函数定义的起始地址。
本发明之十四,在本发明之十三所述的模板编译方法中,其特征在于,上述函数调用置换步骤,将登录在上述虚拟函数表中的上述公共化前的函数的起始地址置换成上述公共函数定义的起始地址的结果,和在登录内容相同的多个虚拟函数表存在的情况下,将该多个虚拟函数表置换成登录内容相同的一个公共虚拟函数表。
如上所述,在本发明之一~之十四中,首先,对于输入程序的多个函数定义,判定模板对不同模板参数是否生成同一函数定义,其判定结果是生成同一函数定义的情况下,将这些多个函数定义置换成一个公共函数定义,同时将对这些多个函数定义的调用置换成对上述公共函数定义的调用。
因此,在输入程序中,即使在对模板提供的参数相互不同的多个函数定义存在的情况下,这些多个函数定义生成同一定义代码时,在得到的输出代码中,这些多个函数定义不存在重复的同一定义代码,因而可以生成代码少且效率良好的目的代码。
如以上说明,依据本发明之一~之十四的模板编译方法,在输入程序中,即使在对模板提供的参数相互不同的多个函数定义存在的情况下,这些多个函数定义生成同一定义代码时,在得到的输出代码中,这些多个函数定义不存在重复的同一定义代码,因而可以生成代码少且效率良好的目的代码。
尤其,依据本发明之二的模板编译方法,即使对于由函数模板生成的不依赖模板参数的函数,也能够生成效率高的目的代码。
依据本发明之四的模板编译方法,即使对于由类模板生成的不依赖模板参数的成员函数,也能生成效率高的目的代码。
依据本发明之六的模板编译方法,即使对于由函数模板生成的不依赖特定模板参数组合的函数,也能够生成效率高的目的代码。
依据本发明之八的模板编译方法,即使对于由类模板生成的不依赖特定模板参数组合的成员函数,也能生成效率高的目的代码。
依据本发明之十二以及之十三的模板编译方法,即使对于非虚拟函数或虚拟函数的调用代码,也能生成效率高的代码。
并且,依据本发明之十四的模板编译方法,即使对于虚拟函数表的代码,也能生成效率高的目的代码。
附图说明
图1是有关本发明的实施方式的模板编译方法的编译步骤图。
图2是该编译步骤中的同一函数定义生成步骤的处理流程图。
图3是该编译步骤中的函数定义公共化步骤的处理流程图。
图4是该编译步骤中的函数调用置换步骤的处理流程图。
图5是程序存储部储存的程序图。
图6(a)表示同一函数定义步骤内抽出的模板信息的图;
(b)表示同一函数定义步骤内生成的非依赖参数函数信息的图;
(c)表示同一函数定义步骤内生成的特定参数同一函数信息的图。
图7(a)表示函数定义公共化步骤内登录了公共函数名的函数定义名信息;(b)表示函数定义公共化步骤内公共化前的函数定义代码被删除后,登录了公共函数定义代码的函数定义代码信息的图。
图8(a)表示函数调用置换步骤内抽出的函数调用信息、和对公共函数置换的图;(b)表示函数调用置换步骤内抽出的虚拟函数表信息、和对公共函数置换的图。
图9(a)表示函数调用置换步骤内虚拟调用时的参照目标由虚拟函数表向公共虚拟函数表置换的图;(b)表示函数调用置换步骤内将虚拟函数表的实例置换成公共虚拟函数表的图。
图10表示使用本发明实施方式的模板编译方法时的输出结果的图。
图11表示使用过去的编译方法时的输出结果的图。
图12表示使用模板的程序例和其输出代码的图。
图中:D101-程序存储部,S102-输入步骤,S103-文句解析步骤,S105-同一函数定义生成判定步骤,S106-函数定义公共化步骤,S107-函数调用置换步骤,S109-中间代码生成步骤,S110-最优化步骤,S111-资源分配步骤,S112-输出步骤,D113-生成代码存储部。
具体实施方式
下面参照附图说明本发明的编译方法一实施方式。
图1是本发明的实施方式的编译步骤的构成图。
图1中,该编译步骤包括:输入步骤S102、文句解析步骤S103、同一函数定义生成判定步骤S105、函数定义公共化步骤S106、函数调用置换步骤S107、中间代码生成步骤S109、最优化步骤S110、资源分配步骤S111以及输出步骤S112。该编译步骤中的各步骤,是具备CPU的编译装置依据编译程序进行的处理。
程序存储部D101,保存编译对象的输入程序。
输入步骤S102,按顺序输入程序存储部D101储存的全部程序,并传递给文句解析步骤S103。
文句解析步骤S103,解析从输入步骤S102接受的程序的文句,生成符号表以及结构树等。
同一函数定义生成判定步骤S105,在文句解析步骤S103生成的信息中,抽出模板相关信息,解析模板是否对不同的模板参数生成同一函数定义。
函数定义公共化步骤S106,在文句解析步骤S103生成的信息中,抽出函数定义相关信息,而且从同一函数定义判定步骤S105接受解析结果,将对不同的模板参数生成同一函数定义的多个函数定义置换成仅仅一个公共函数定义。
函数调用置换步骤S107,在文句解析步骤S103生成的信息中,抽出函数调用相关信息,而且从函数定义公共化步骤S106中接受置换结果,依据公共化的结果,将公共化前的函数调用置换成公共函数定义的调用。
中间代码生成步骤S109,以文句解析步骤S103生成的结构树为基础,生成中间代码。在生成与由模板生成的函数定义以及虚拟函数表相关的中间代码时,在实行同一函数定义生成步骤S105,和函数定义公共化步骤S106,函数调用置换步骤S107后,参考置换的信息,生成对应的中间代码。
最优化步骤S110,对于由中间代码生成步骤S109生成的中间代码,实行各种最优化。
资源分配步骤S111,对在由最优化步骤S110最优化后的中间代码中包含的全部变量,分配寄存器或存储器等的硬件资源。
输出步骤S112,由资源分配步骤S111将资源分配后的中间代码转换成目的代码,然后向生成代码存储部D113输出。
生成代码存储部D113,储存由上述步骤S102~S112的编译步骤所转换的目的代码。
还有,关于输入步骤S102、文句解析步骤S103、中间代码生成步骤S109、最优化步骤S110、资源分配步骤S111、输出步骤S112,由于非本发明的主要之点,因此省略其详细说明。
以下,对同一函数定义生成判定步骤S105的处理,适用图5所示程序的情况为例,参考图2进行说明。
同一函数定义生成判定步骤S105的处理,按照步骤a1~a11进行。以下,依照标号的顺序进行说明。
在步骤a1,从文句解析步骤S103生成的信息中,抽出模板相关的信息。根据文句解析步骤S103,由于解析了全部输入文件中的模板信息,因此只抽出模板相关的信息。在图5所示的程序中,对于全部的输入文件template1.cc、template2.cc,各文件中定义的模板,由于template1.cc是函数模板g,template2.cc是类模板B,,因此得到图6(a)的抽出结果。而且,图5的输入文件template1.cc、template2.cc的第一行的[#include]文句,意思是展开其中的引号“”所指文件的内容。
在步骤a2,在抽出的全部模板信息中,对类模板的成员函数,反复进行循环1(步骤a2~a6)的处理。图6(a)中由于[2]和[3]是类模板的成员函数,对这种成员函数[2]和[3]反复进行循环1的处理。
在步骤a3,对成员函数的代码,是否具有完全不依赖于模板参数的模板代码进行调查。在“否”的情况下移至步骤a4,在“是”的情况下移至步骤a5。如果对图6(a)的成员函数[2]进行步骤a3的判定时,成员函数[2]的代码,与模板参数T的值无关,而成为“return b;”,由于不依赖于T的值,步骤a3的判定为“是”之后,接着移至步骤a5。成员函数[3]的代码,也与模板参数值T无关,而成为“return y;”,由于完全不依赖于T的值,步骤a3的判定为“是”,接着移至步骤a5。
在步骤a4,只对特定的模板参数值的组合调查是否存在生成了同一代码的函数。在后述步骤a7的循环2中进行的处理的步骤a9和步骤a4的处理是相同的。图6(a)的成员函数[2]以及[3],由于步骤a3中判定为“是”,所以不进行步骤a4的处理。详细处理情况见步骤a9的说明。
在步骤a5,对于在步骤a4判定为“是”的成员函数生成不依赖参数函数信息。图6(a)的成员函数[2][3],为不依赖参数函数,因此生成至少由文件名、模板函数名、由模板参数实体化(实例化)的实例化函数名构成的图6(b)的不依赖参数函数信息。
在步骤a6中,移至步骤a2的处理,反复进行循环1的处理。
在步骤a7中,在抽出的全部模板信息中,对函数模板,反复进行循环2的处理。图6(a)中[1]是函数模板。对该函数模板[1]实行循环2的处理。
在步骤a8中,对函数的代码,是否具有完全不依赖于模板参数的模板代码进行调查。在“否”的情况下,移至步骤a9,在“是”的情况下,移至步骤a10。对图6(a)的函数模板[1]进行步骤a8的判定后,根据模板参数T的值,由于虚拟调用参数a、b的类型不同,[1]的代码,依赖于模板参数。然后,步骤a8的判定是“否”,接着移至步骤a9。
在步骤a9,只对特定的模板参数值的组合调查是否存在生成了同一代码的函数。步骤a2的循环1中进行的步骤a4的处理和步骤a9的处理是相同的。
上述步骤a4和步骤a9的处理,根据步骤b1~b4进行。以下依照标号的顺序进行说明。
在步骤b1,判定函数代码中,是否存在显式或隐式类型转换。在“是”的情况下转到步骤b2,在“否”的情况下跳出步骤a4或者步骤a9。在对图6(a)的函数模板[1]进行步骤b1的判定后,函数模板[1]的代码“returna+b;”,由于不存在类型变换,步骤b1的判定为“是”,接着移至步骤b2。
在步骤b2,判定函数代码中,依赖参数的调用参数的函数调用是否存在。在“是”的情况下移至步骤b3,在“否”的情况下跳出步骤a4或者步骤a9的处理。在对图6(a)的[1]进行步骤b2的判定后,[1]的代码、“returna+b;”其中由于不存在函数调用,步骤b2的判定为“是”,接着移至步骤b3。
在步骤b3,判定实例化的参数值中,是否存在以类型大小相同的参数所生成的函数定义。在“是”的情况下移至步骤b4,在“否”的情况下跳出步骤a4或者步骤a9。在对图6(a)的[1]进行步骤b3的判定后,对于[1]的模板,实例化的模板参数为int型和long型。编译环境中,这些类型大小是相同的。在此,假定都为4个字节的大小。由存在于以类型大小相同的参数所生成的函数定义,因此移至步骤b4。
在步骤b4,如果步骤b1~b3的判定中全部为“是”,则根据判定后的函数定义生成特定参数同一函数信息。图6(a)的[1],从步骤b1到步骤b3的判定全为“是”,模板参数值为int的情况和long的情况下都生成同一代码。生成至少由文件名、模板函数名、参数大小、实例化函数名构成的如图6(c)的特定参数同一函数信息。
在步骤a10,对在步骤a8中判定为“是”的函数生成不依赖参数函数信息。图6(a)的[1],因为步骤a8判定为“否”,则不进行步骤a10的处理。
在步骤a11,移至步骤a7的处理后,反复进行循环2的处理。
以上,在同一函数定义生成判定步骤S105的处理适用于图10所示程序的情况,生成图6(b)所示不依赖参数函数信息以及图6(c)所示特定参数同一函数信息。这些结果传递给函数定义公共化步骤S106。
接着,对函数定义公共化步骤S106的处理,参考图3进行说明。
函数定义公共化步骤S106的处理,按照步骤c1~c8进行。以下根据标号顺序进行说明。
在步骤c1,从同一函数定义生成步骤S105接受的信息中,对不依赖参数函数信息,反复进行循环1(步骤c1~c4)的处理。即,本例中,对图6(b)的不依赖参数函数信息,反复进行上述循环1的处理。
在步骤c2,对于由同一模板生成的实例化函数名登录公共函数名,然后移至步骤c3。例如,对于图6(b)通过实行步骤c2,登录图7(a)的[x]部分。
在步骤c3,将各实例化函数的定义从文句解析结果中消除,并将公共函数的定义登录到文句解析结果,然后移至步骤c4。通过对图7(a)的函数定义名信息[x]实行步骤c3,按照图7(b)的[x]的部分所体现的那样,实例化函数的函数定义代码被删除,重新登录公共函数的函数定义代码。
在步骤c4,移至步骤c1的处理,反复进行循环1的处理。
在步骤c5,从同一函数定义生成步骤S105接受的信息中,对特定参数同一函数信息,反复进行循环2(步骤c5~c8)的处理。对图6(c)的特定参数同一函数信息反复进行循环2的处理。
在步骤c6,对根据同一模板的同一参数大小所生成的实例化函数名登录公共函数名,然后移至步骤c7。通过对图6(c)实行步骤c6,登录图7(a)所示的[y]的部分。
在步骤c7,从文句解析结果中将各实例化函数的定义消除,将公共函数的定义登录至函数定义部,然后移至步骤c8。通过对图7(a)所示的公共函数的定义名信息[y]实行步骤c7,按照图7(b)的[y]的部分所体现,实例化函数的函数定义代码被删除,公共函数的函数定义代码重新登录到文句解析结果中。
在步骤c8,移至步骤c5的处理,反复进行循环2的处理。
以上,在函数定义公共化步骤S106的处理适用于图6(b)以及图6(c)的情况下,生成了图7(a)所示的函数定义名和图7(b)所示的函数定义代码,然后这些结果传递给函数调用置换步骤S107。
以下,对函数调用置换步骤S107的处理,参考图4进行说明。
函数调用置换步骤S107的处理,按照步骤d1~d13进行。以下按标号的顺序进行说明。
在步骤d1,在文句解析步骤S103生成的信息中,抽出函数调用相关的信息。而且,在对各类的虚拟函数表信息存在的情况下,也将该信息抽出。根据文句解析步骤S103,由于全部的输入文件中的函数调用信息被解析,因此只将有关函数调用的信息以及虚拟函数表信息被抽出。在图5所示的程序中,由于template1.cc的函数func1,调用由模板生成的函数;template2.cc的函数func2,调用模板生成的类的成员函数;因此得出如图8(a)所示的函数调用信息的抽出结果。而且,在函数func2中,由于对类A继承的类进行虚拟函数调用,因此得到了如图8(b)所示的虚拟函数表信息的抽出结果。
在步骤d2,对调用模板生成函数的全部函数调用信息,反复进行循环1的处理。图8(a)中,由于函数func1和func2均调用由模板生成的函数,因此要分别对两者进行循环1的处理。
在步骤d3,将登录公共函数名的函数调用置换成公共函数调用。图8(a)中,分别将符号(#1)的函数调用置换成符号(#2)的公共函数调用;将符号(#3)的函数调用置换成符号(#4)的公共函数调用;将符号(#5)的函数调用置换成符号(#6)的公共函数调用。
在步骤d4,对函数调用是否为虚拟的函数调用进行判定。在“是”的情况下移至步骤d5,在“否”的情况下移至步骤d13。图8(a)中,由于符号(#4)是虚拟的函数调用,因此移至步骤d5。符号(#2)或符号(#6)是普通的函数调用,因此移至步骤d13。
在步骤d5,在虚拟函数表中,对于将登录了公共函数名的函数进行登录的全部虚拟函数表,反复进行循环2的处理。图8(b)中,对类B<int>的虚拟函数表以及类B<long>的虚拟函数表,反复进行循环2的处理。
在步骤d6,将登录了虚拟函数表的公共化后的函数置换成公共函数。实际上,虽然登录的是到函数的地址,在此为使说明简化,单作为函数。图8(b)中,由于在函数定义公共化步骤S106中登录了公共函数,所以以符号(#7)和符号(#9)登录的函数,分别被置换成公共函数,如符号(#8)和符号(#10)所示。
在步骤d7,移至步骤d5的处理,反复进行循环2的处理。
在步骤d8,对实行置换的虚拟函数表,反复进行循环3的处理。图8(b)中,对虚拟函数表vtb1_B<int>和vtb1_B<long>反复进行循环3的处理。
在步骤d9中,对在虚拟函数表中登录的内容是否存在经过步骤d6的置换处理而相等的内容进行判定。在“是”的情况下移至步骤d10,在“否”的情况下移至步骤d12。图8(b)中,由于vtb1_B<int>和vtb1_B<long>登录的内容完全相等,因此移至步骤d10。
在步骤d10,删除相同的各虚拟函数,并生成公共虚拟函数表。图8(b)的虚拟函数表vtb1_B<int>和vtb1_B<long>,如图9(b)所示,被删除,重新生成公共虚拟函数表vtb1_B。
在步骤d11,将虚拟的函数调用时参考的虚拟函数表置换成公共虚拟函数表。图8(a)的虚拟的调用中参考的vtb1_B<int>和vtb1_B<long>,置换成参照图9(a)所示的公共虚拟函数表vbt1_B。
在步骤d12,移至步骤d8进行处理,反复进行循环3的处理。
以上,在同一调用置换步骤S107的处理适用于如图5所示的程序的情况下,生成图9(a)所示的函数调用信息和图9(b)所示的虚拟函数表信息。
中间代码生成步骤S109,在读取文句解析步骤S103生成的内容的基础上,读取包含在同一函数定义判定步骤S105、函数定义公共化步骤S106,函数调用置换步骤S107中重新生成的内容的全部文句解析数据,最终在生成代码存储部D113中生成目的代码并被储存。
如上,本实施方式的编译步骤中,作为适用图5所示程序的结果所得到的输出代码如图10所示。而且,为便于比较,采用过去的方法进行编译的结果所得到的输出代码如图11所示。图中表明,象图11(c)和(d)、(f)和(g)、(l)和(m)、(n)和(o)那样重复的代码,通过适用本发明的编译步骤,就能得到如图10(c)、(e)、(j)、(k)所示的公共化代码。通过采用本实施方式的编译步骤,即使对模板提供的参数不同的情况下,在生成同一代码时也能生成代码量和实行步骤都少且效率高的目的代码。
如上所述,本发明提供的模板编译方法,即使在输入程序中存在对模板提供的参数相互不同的多个函数定义的情况下,这些多个函数定义生成同一定义代码时,在得到的输出代码中,只让其同一定义代码存在,因此可以生成代码量小效率高的输出代码。
Claims (14)
1、一种模板编译方法,将采用具有模板结构的高级语言所记述的输入程序转换成目的代码,其特征在于,包括:
同一函数定义生成判定步骤,其判定在所述输入程序所包含的多个函数定义中模板对不同的模板参数是否生成同一函数定义;
函数定义公共化步骤,当判定由所述同一函数定义生成判定步骤生成同一函数定义时,其将生成该同一函数定义的多个函数定义置换成仅仅一个公共函数定义;和
函数调用置换步骤,当由所述函数定义公共化步骤置换成公共函数定义时,其将该公共化之前的所述多个函数的调用置换成所述公共函数定义的调用。
2、根据权利要求1所述的模板编译方法,其特征在于,
所述同一函数定义生成判定步骤,在所述多个函数定义中,所述模板是函数模板,并且对在函数定义部分中是否存在依赖模板参数的部位进行解析。
3、根据权利要求2所述的模板编译方法,其特征在于,
所述同一函数定义生成判定步骤,在所述解析结果、模板为函数模板的所述多个函数定义中,在函数定义部分不存在依赖模板参数的部位的情况下,生成至少包含文件名、模板函数名、以及实例化函数名的不依赖函数信息。
4、根据权利要求1所述的模板编译方法,其特征在于,
所述同一函数定义生成判定步骤,在所述多个函数定义中,所述模板是类模板,并且对在成员函数定义部分中是否存在依赖模板参数的部位进行解析。
5、根据权利要求4所述的模板编译方法,其特征在于,
所述同一函数定义生成判定步骤,在所述解析结果、模板为类模板的所述多个函数定义中,在成员函数定义部分不存在依赖模板参数的部位的情况下,生成至少包含文件名、模板函数名、以及实例化函数名的不依赖函数信息。
6、根据权利要求1所述的模板编译方法,其特征在于,
所述同一函数定义生成判定步骤,在所述多个函数定义中,对所述模板为函数模板并且在函数定义部分中是否存在依赖模板参数的类型转换,是否存在依据依赖模板参数的调用参数的函数调用,以及以类型大小相同的模板参数进行实例化的函数定义是否已经存在,分别进行解析。
7、根据权利要求6所述的模板编译方法,其特征在于,
所述同一函数定义生成判定步骤,当在所述解析结果、函数定义部分不存在依赖模板参数的类型变换,不存在依据依赖模板参数的调用参数的函数调用,并且以类型相同的模板参数进行实例化的函数定义已经存在的情况下,生成包含文件名、模板函数名、参数大小、以及实例函数名的特定参数同一函数信息。
8、根据权利要求1所述的模板编译方法,其特征在于,
所述同一函数定义生成判定步骤,在所述多个函数定义中,对所述模板为类模板并且在成员函数定义部分中是否存在依赖模板参数的类型转换,是否存在依据依赖模板参数的调用参数的函数调用,以及以类型大小相同的模板参数进行实例化的函数定义是否已经存在,分别进行解析。
9、根据权利要求8所述的模板编译方法,其特征在于,
所述同一函数定义生成判定步骤,当在所述解析结果、成员函数定义部分不存在依赖模板参数的类型变换,不存在依据依赖模板参数的调用参数的函数调用,并且以类型相同的模板参数进行实例化的函数定义已经存在的情况下,生成包含文件名、模板函数名、参数大小、以及实例函数名的特定参数同一函数信息。
10、根据权利要求3或5所述的模板编译方法,其特征在于,
所述函数定义公共化步骤,
接受所述同一函数定义生成判定步骤生成的不依赖函数信息;
在所述不依赖函数信息中,由同一模板生成的实例化函数名登录公共函数名;
将由所述同一模板生成的实例化函数的函数定义代码变更成所述公共函数的函数定义代码。
11、根据权利要求7或者9所述的模板编译方法,其特征在于,
所述函数定义公共化步骤,
接受由所述同一函数定义生成判定步骤生成的特定参数同一函数信息;
在所述特定参数同一函数信息中,对由同一模板的同一参数大小生成的实例化函数名登录公共函数名;
将由所述同一模板的同一参数大小生成的实例化函数的函数定义代码,变更成所述公共函数的函数定义代码。
12、根据权利要求1所述的模板编译方法,其特征在于,
所述函数调用置换步骤,将使用公共化前的函数的起始地址的函数调用命令,置换成所述函数定义公共化步骤中使用公共函数定义的起始地址的函数调用命令。
13、根据权利要求1所述的模板编译方法,其特征在于,
所述函数调用置换步骤,在函数调用为虚拟函数调用时,将登录在虚拟函数表中的所述公共化前的函数的起始地址,置换成所述函数定义公共化步骤中的公共函数定义的起始地址。
14、根据权利要求13所述的模板编译方法,其特征在于,
所述函数调用置换步骤,将登录在所述虚拟函数表中的所述公共化前的函数的起始地址置换成所述公共函数定义的起始地址的结果,和在登录内容相同的多个虚拟函数表存在的情况下,将该多个虚拟函数表置换成登录内容相同的一个公共虚拟函数表。
Applications Claiming Priority (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2003375776A JP2005141380A (ja) | 2003-11-05 | 2003-11-05 | テンプレートコンパイル方法 |
JP2003375776 | 2003-11-05 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN1614563A CN1614563A (zh) | 2005-05-11 |
CN1313926C true CN1313926C (zh) | 2007-05-02 |
Family
ID=34544297
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CNB200410056064XA Expired - Fee Related CN1313926C (zh) | 2003-11-05 | 2004-08-10 | 模板编译方法 |
Country Status (3)
Country | Link |
---|---|
US (1) | US20050097530A1 (zh) |
JP (1) | JP2005141380A (zh) |
CN (1) | CN1313926C (zh) |
Families Citing this family (18)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7464370B2 (en) * | 2003-12-04 | 2008-12-09 | International Business Machines Corporation | Creating a method from a block of code |
JP4768984B2 (ja) * | 2004-12-06 | 2011-09-07 | パナソニック株式会社 | コンパイル方法、コンパイルプログラムおよびコンパイル装置 |
US8291395B2 (en) * | 2006-03-31 | 2012-10-16 | Apple Inc. | Fast function call dispatching |
KR101455777B1 (ko) * | 2007-02-28 | 2014-10-28 | 루돌프 테크놀로지스 인코퍼레이티드 | 부식 가능성이 있는 샘플의 금속부에 대한 피코초 초음파를 이용한 특성화 |
US8191038B1 (en) * | 2007-10-09 | 2012-05-29 | Google Inc. | Using a templating language to produce a host language factory for a safe subset of a templated language |
JP2009169864A (ja) * | 2008-01-18 | 2009-07-30 | Panasonic Corp | コンパイル方法およびコンパイルプログラム |
US20110010696A1 (en) * | 2009-07-09 | 2011-01-13 | Sun Microsystems, Inc. | Duplicate virtual function table removal |
JP2011028648A (ja) * | 2009-07-28 | 2011-02-10 | Renesas Electronics Corp | オブジェクトコード生成システム、及びオブジェクトコード生成方法 |
JP2011203960A (ja) * | 2010-03-25 | 2011-10-13 | Fujitsu Ltd | テンプレートコンパイル方法及びテンプレートコンパイル装置 |
CN103443763B (zh) * | 2012-08-08 | 2016-10-05 | 英特尔公司 | 包含对重写虚拟函数的调用的支持的isa桥接 |
CN103176801B (zh) * | 2013-03-18 | 2016-11-23 | 北京首开世纪科技有限公司 | 一种表项操作接口函数的生成方法及装置 |
JP6651977B2 (ja) | 2016-05-12 | 2020-02-19 | 富士通株式会社 | 情報処理装置、コンパイル方法、およびコンパイルプログラム |
US10296307B2 (en) * | 2017-05-16 | 2019-05-21 | International Business Machines Corporation | Method and system for template extraction based on source code similarity |
US10698791B2 (en) * | 2018-07-28 | 2020-06-30 | International Business Machines Corporation | Handling request data with type safety in a remote service |
CN109933365B (zh) * | 2018-12-28 | 2022-08-19 | 蜂巢能源科技有限公司 | 一种函数调用树的生成方法及装置 |
CN110389753B (zh) * | 2019-06-06 | 2024-01-23 | 五八有限公司 | 原生应用的链式调用方法、装置、电子设备及存储介质 |
CN112905164B (zh) * | 2019-12-04 | 2024-10-18 | 北京沃东天骏信息技术有限公司 | 一种项目代码处理方法和装置 |
CN115686459B (zh) * | 2022-10-31 | 2023-07-25 | 北京力控元通科技有限公司 | 基于Java语言的模型生成方法、装置、设备及可读存储介质 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5901314A (en) * | 1995-09-25 | 1999-05-04 | International Business Machines Corporation | Method for reducing the size of computer programs |
JP2001273150A (ja) * | 2000-03-27 | 2001-10-05 | Matsushita Electric Ind Co Ltd | プログラム変換装置 |
US6519768B1 (en) * | 1999-03-04 | 2003-02-11 | International Computers Limited | Instruction translation method |
Family Cites Families (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CA2178898C (en) * | 1996-06-12 | 2000-02-01 | David Joseph Streeter | Sequencing and error detection of template instantiations during compilation of c++ programs |
US6405368B1 (en) * | 1999-04-16 | 2002-06-11 | Brian Freyburger | Method for separate compilation of templates |
US6760905B1 (en) * | 2000-09-21 | 2004-07-06 | Curl Corporation | Lazy compilation of template-generated classes in dynamic compilation execution environments |
US6968541B1 (en) * | 2000-10-04 | 2005-11-22 | International Business Machines Corporation | Apparatus and method for template instantiation with a cross compiler |
CA2355989A1 (en) * | 2001-08-27 | 2003-02-27 | Ibm Canada Limited-Ibm Canada Limitee | Compiling source code files having multiple |
-
2003
- 2003-11-05 JP JP2003375776A patent/JP2005141380A/ja not_active Withdrawn
-
2004
- 2004-08-10 US US10/914,108 patent/US20050097530A1/en not_active Abandoned
- 2004-08-10 CN CNB200410056064XA patent/CN1313926C/zh not_active Expired - Fee Related
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5901314A (en) * | 1995-09-25 | 1999-05-04 | International Business Machines Corporation | Method for reducing the size of computer programs |
US6519768B1 (en) * | 1999-03-04 | 2003-02-11 | International Computers Limited | Instruction translation method |
JP2001273150A (ja) * | 2000-03-27 | 2001-10-05 | Matsushita Electric Ind Co Ltd | プログラム変換装置 |
Also Published As
Publication number | Publication date |
---|---|
US20050097530A1 (en) | 2005-05-05 |
CN1614563A (zh) | 2005-05-11 |
JP2005141380A (ja) | 2005-06-02 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN1313926C (zh) | 模板编译方法 | |
CN1134730C (zh) | 用于减少预装类的脚印的系统和方法 | |
US7543271B2 (en) | Compiling source code using generic classes | |
CN1834922A (zh) | 程序变换方法及程序变换系统 | |
CN1105802A (zh) | 增量建立系统 | |
CN1647042A (zh) | 定制软件抽象的方法 | |
CN101036127A (zh) | 源码检查器、方法、程序以及存储介质 | |
CN1278231C (zh) | 将抽象句法表示法1数据模型化成对象模型的方法及系统 | |
CN1752934A (zh) | 编译器、编译方法以及编译程序 | |
CN1371499A (zh) | 传统数据结构的对象特性元模型仿真器 | |
CN1896992A (zh) | 基于应用定制解析xml文档的方法及装置 | |
CN101036123A (zh) | 自动翻译程序和程序翻译服务器 | |
CN1834907A (zh) | 在运行时期间优化计算机程序的系统与方法 | |
CN1313927C (zh) | 智能卡运行环境的控制方法 | |
CN1744038A (zh) | 一种基于统一构件封装件结构的构件组装方法 | |
CN1866283A (zh) | 实现规则系统触发的系统及方法 | |
CN111506314B (zh) | 项目开发的方法、装置、服务器及介质 | |
CN1547116A (zh) | 软件中语言资源本地化的实现方法 | |
CN1845069A (zh) | 一种网络环境下根据用户需求生成软件服务的方法 | |
CN1889043A (zh) | 计算机编程中使用人类自然语言的方法 | |
US20050055682A1 (en) | Authoring and using generic classes in JAVA language code | |
CN1900910A (zh) | 二进制翻译中经由跳转表的多目标分支语句的识别方法 | |
CN1975669A (zh) | Xml语言描述的业务逻辑映射到应用语言的方法 | |
CN1637708A (zh) | 编译方法、编译装置及编译程序 | |
CN1902586A (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 | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant | ||
C17 | Cessation of patent right | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20070502 Termination date: 20100810 |