一种应用于Java到C++语言程序翻译中外部引用的翻译方法

文档序号:6331934阅读:253来源:国知局

专利名称::一种应用于Java到C++语言程序翻译中外部引用的翻译方法
技术领域
:本发明涉及计算机领域高级语言代码翻译中的关键技术,为一种应用于Java到C++语言程序翻译中外部引用的翻译方法。
背景技术
:软件代码移植是目前解决计算机软件跨平台应用以及在不同终端设备上正常运行的主要技术手段和方法,高级语言代码翻译技术是解决计算机软件代码移植的一个重要研究方向。Java语言是一种跨平台,适合于分布式计算环境的面向对象编程语言。具有面向对象、分布式、健壮安全、平台独立、可移植、高性能、多线程、动态性等特性。在面向对象的跨平台应用、网络通信和企业级应用以及嵌入式应用等方面得到广泛的发展。健壮安全基础上的平台无关性是Java语言的主要优点,而对虚拟机的依赖和程序运行性能上的缺陷,是Java语言的主要不足和缺点。Java程序的运行依赖于Java平台,Java平台是一种运行在其它硬件平台之上的纯软件平台,包括两个部分=Java虚拟机(JVM)和Java应用程序编程接口(API)。作为独立于硬件平台的环境,虽经过技术的发展,Java程序基于Java平台的运行效率仍比本机代码慢。C++语言是一种优秀的面向对象程序设计语言,它在C语言的基础上发展而来,在支持面向对象编程的同时与C语言保持兼容。具有与C语言兼容、代码结构合理、程序运行效率高、面向对象、可重用性高、可扩展性、可维护性等特性。C++语言具有与C语言相同的更加贴近硬件底层的操作和控制能力,使开发者的设计思想更容易表达、实现、理解和维护,而效率并未受到影响。更贴近硬件底层,是C++语言的优点,但同时也为各平台间的移植增加了难度,而其强大的底层操控性,也对程序员的编程水平提出了更高的要求。与Java语言相比,C++语言具有以下优点准许直接访问物理地址,能进行位运算,可以直接对硬件进行操作,而Java语言对内存的操作则很难把握;C++程序的依赖性小,程序的运行不需要额外的诸如虚拟机之类的支持,一般用来编写大型系统;C++代码被最终编译成本地机器码,可直接由中央处理单元(CPU)执行,相比Java这种先生成中间代码再由虚拟机执行的语言,效率高了很多。在实际应用中,Java和C++是当前两大主流的开发语言,因为各自的优势和特点在各自不同的应用领域发挥着非常重要的作用。Java因其语言简单、易学易用、跨平台和健壮安全性在应用领域备受开发者青睐和喜爱,但是跨平台的特性在复杂的嵌入式环境中要实现真正意义上的统一非常困难,同时对虚拟机的过分依赖和程序运行性能方面的不足也影响和限制了Java语言在应用领域尤其是嵌入式设备应用领域的应用与普及。因此,如果能够将Java语言程序翻译为更灵活、更高效、更易支持的C++语言程序,从而大幅提高程序的执行效率,开拓扩展其应用的范围,将极大地提高Java程序的应用价值。在从Java到C++语言程序翻译的过程中,外部引用的翻译是其中的重要组成部分,尤其是其它部分的基础和程序正确编译运行实现的保证,本发明通过大量研究和深入比较Java语言和C++语言之间的异同,提出了一种应用于Java到C++语言程序翻译中外部引用的翻译方法。就语言本身和语法而言,Java语言从C语言和C++语言继承了许多成份,如Java语言的变量声明、操作符形式、参数传递、流程控制等方面与C语言和C++语言完全相同。同时,在指针和内存管理、多继承的支持、全局变量、全局函数、操作符重载、自动类型转换、编译预处理、头文件、字符串、无条件转移语句(goto)、包(package)、编译处理方法、交叉引用、标准应用程序编程接口(API)类库和第三方类库等方面Java和C++语言又有许多差另IJ,下面将重点对与本发明相关的Java语言和C++语言这两种语言之间的差别进行描述。在编译处理方法方面java语言和C++语言都采用独立编译技术,对每个文件或编译单元进行单独编译,但在处理编译单元对外部引用的查找和处理方面,有较大差异。Java编译器可以查看其它文件或编译单元,Java编译器会根据需要找到当前编译单元所需要的外部引用的具体位置并进行编译处理;C++编译器在编译的过程中只处理当前文件或编译单元,不查看和处理当前编译单元之外的任何文件,采用包含编译预处理命令(include)将外部引用加载到当前文件或编译单元,形成独立的编译环境。在头文件方面=Java不支持头文件,所有的字段及方法等定义均以类成员的形式封装在类体之内,所有源程序文件后缀均以.java结尾;C++语言中用头文件来定义类的原型、全局变量、库函数等,以帮助编译单元的外部引用的实现,头文件的后缀以.h结尾。在编译预处理方面Java不支持预处理功能,Java编译器没有预处理模块和预处理过程;C++在编译过程中都有一个预编译阶段,即众所周知的预处理器,C++语言通过包含编译预处理命令(《include)用包含头文件的方式将外部引用加载到当前文件或编译单元,在C++语言程序编译过程中的预处理阶段,由包含编译预处理命令(iiinclude)所指定的头文件,将被加载到当前文件或编译单元。在包(package)方面Java使用包对一组相关的类型,提供访问保护和名称空间管理,一方面可通过包成员使用时命名规则的限定确保成员名的唯一性,另一方面,在方便代码开发管理的同时,便于与标准的Java应用程序编程接口(API)和第三方类库分开管理。Java应用程序编程接口(API)按照相关性将类(class)和接口(interface)分为多个库,这些库也被称为包。Java语言通过特定关键字,采用package语句实现包的创建,对于同属一个包中的其它的成员,无需特殊声明,可直接使用,而对于其它包中的成员则可通过直接使用该成员的完全限定名或是导入(import)该成员到本文件的方式进行包成员的使用,为了避免命名冲突,包的名称按照惯例一般采用因特网域名的反向顺序作为包名称;而在C++语言中,没有包的概念,与包机制相类似的是命名空间(namespace),但并不完全等同,与包机制所不同的是命名空间对于同属一个命名空间的其它的成员也不能直接使用,而需要用包含编译预处理命令(《include)将外部引用加载到当前文件或编译单元。在交叉引用方面Java因为其编译器更为灵活的查找方式,使得程序中的各个类之间可以任意交叉易用,而不需要做任何处理或者修改即可被正确编译;C++语言因为其受限于先定义后使用的原则,需要对交叉引用的情况进行前置声明或包含处理才能被编译器正确编译。标准应用程序编程接口类库和第三方类库方面Java标准应用程序编程接口(API)类库和第三方类库一般以Java编译后的.class文件形式提供给用户,这些.class文件以Java固定格式压缩的Jar包形式存在于虚拟机环境或者Java开发环境路径中,在正确配置编译器查找路径后,便可以与访问本项目其它源码一样采用导入(import)或者完全限定名方式对其成员进行外部引用;C++标准应用程序编程接口类库和第三方类库可以以静态链接库或者动态链接库的形式提供,通过包含(include)对应的头文件(.h)进行引用。在Java语言编写的程序中,大部分均包含有外部引用,使用外部引用进行Java程序设计在实际应用中相当普遍,因此,需要一种应用于Java到C++语言程序翻译中外部引用的翻译方法。因为Java与C++语言之间语言本身和语法上的差别,导致了Java到C++语言程序的翻译相当困难,存在很多关键的技术难点,Java到C++语言程序翻译中外部引用的翻译是其中的重要组成部分。本发明所述的方法将着重解决Java到C++语言程序翻译过程中外部引用翻译中的重点、难点。
发明内容本发明的目的是提供一种应用于Java到C++语言程序翻译中外部引用的翻译方法,能有效地解决因为Java语言和C++语言之间的差异给Java到C++语言程序翻译过程中尤其是外部引用的翻译造成的困难,从而解决
背景技术
中的问题。为了实现上述发明目的,本发明采用以下技术方案,它包括以下步骤步骤1)、将Java编译单元中简单名称方式的外部引用改为完全限定名方式;步骤2)、使用编译单元拆分装置拆分Java编译单元,使每个编译单元只包含一个成员,即只包含一个类或接口的定义;步骤3)、使用成员更名装置对Java编译单元及成员进行更名;步骤4)、使用编译单元迁移装置将各Java编译单元迁移至缺省包;步骤5)、使用导入列表生成装置为每个Java编译单元生成导入列表;步骤6)、使用C++头文件中头文件导出装置为翻译后生成的C++头文件生成包含语句和前置声明;步骤7)、使用C++源文件中头文件导出装置为翻译后生成的C++源文件生成包含语句。在采用上述技术方案的同时,本发明还可采用或组合采用以下进一步的技术方案使用编译单元拆分装置拆分Java编译单元,具体操作包括a、创建新的编译单元;b、组织在原来的包中;C、复制内容到新的编译单元中;d、删除原编译单元中所有非公有的成员。使用成员更名装置对Java编译单元及成员进行更名,具体操作包括a、生成自定义规则的新成员名;b、对成员进行改名;C、对编译单元进行改名;d、将所有原成员的引用更新为新成员名。在对Java编译单元及成员进行更名操作步骤中成员更名装置所采用的第一自定义规则为新的名称由包名与成员名共同组成,包名中以点字符分隔的各部分之间以及包名与成员名之间采用编译器和集成开发环境允许的分隔符进行分隔。使用编译单元迁移装置进行编译单元迁移操作,具体操作包括a、判断命名冲突;b、如果存在命名冲突,则使用成员更名装置进行成员更名;C、移动编译单元;d、原包名改为新的包名;e、将所有原包名引用处更新为新包名。使用成员更名装置进行成员更名操作中成员更名装置所采用的第二自定义规则为新的名称由原成员名加上一个随机数组成,其之间采用编译器和集成开发环境允许的分隔符进行分隔。使用C++头文件中头文件导出装置为翻译后生成的C++头文件生成包含语句和前置声明,具体操作包括a、对父类或父接口的处理;b、对实现的接口的处理;C、对Java标准API类库和第三方类库中的类或接口的外部引用的处理;d、对其它导入项的处理;e、生成C++头文件包含语句和前置声明。其中对Java标准API类库和第三方类库中的类或接口的外部引用的处理方法如下使用Java标准API类库和第三方类库对应的头文件查找装置查找映射表,将得到的对应的C++头文件列表添加到C++头文件的头文件列表中。使用C++源文件中头文件导出装置为翻译后生成的C++源文件生成包含语句,具体操作包括a、对父类或父接口的处理;b、对实现的接口的处理;C、对Java标准API类库和第三方类库中的类或接口的外部引用的处理;d、对其它导入项的处理;e、将同名头文件添加到头文件列表中;f、生成C++源文件包含语句。其中对Java标准API类库和第三方类库中的类或接口的外部引用的处理方法如下使用Java标准API类库和第三方类库对应的头文件查找装置查找映射表,将得到的对应的C++头文件列表添加到C++源文件的头文件列表中。本发明提出了一种应用于Java到C++语言程序翻译中外部引用的翻译方法,解决Java到C++语言程序翻译过程中外部引用的翻译问题,在从Java到C++语言程序的翻译中,针对Java程序中的外部引用进行相应处理,从而使得包含了外部引用的Java程序,经过程序翻译得到C++程序之后可由C++编译器正确编译,从而扩大了Java到C++语言程序翻译所能处理的Java程序的类型和应用范围,保证了Java到C++语言程序翻译的正确率,节省了大量的需要程序员手工改动的额外工作和大量的时间,提高了Java到C++语言程序翻译的翻译效率。为了更好的理解本发明,下面简要介绍一下本发明说明书中采用的部分术语的含义编译单元、完全限定名、简单名称、Java编译单元的成员、导入列表、导入记录、头文件列表、前置声明列表、哈希映射表、键、值等。编译单元Java语言和C++语言均采用的是独立编译技术,编译单元指的是编译器进行编译处理时的文件对象。完全限定名在Java编译单元中,以包名为前缀的成员名叫做该成员的完全限定名。简单名称在Java编译单元中,当采用了导入(import)方式对外部引用进行导入之后,即可对外部引用的成员采用不加包名前缀的成员名进行使用,不加包名前缀的成员名叫做该成员的简单名称。Java编译单元的成员为Java编译单元中定义的类或者接口。导入列表是对Java编译单元所使用的外部引用的成员名称进行记录的一种数据结构。该数据结构由导入记录构成,可进行导入记录的查找、插入、删除等操作。导入记录导入列表的组成部分,是外部引用的类或接口的名称的记录。头文件列表是对C++编译单元全部外部引用需要包含的头文件的名称进行记录的一种数据结构。该数据结构由头文件名称记录构成,可进行头文件名称记录的查找、插入、删除等操作。前置声明列表是对C++编译单元中需要进行前置声明的成员名称进行记录的一种数据结构。该数据结构由前置声明的成员名称记录构成,可进行前置声明的成员名称记录的查找、插入、删除等操作。哈希映射表(Hashtable)是根据关键码值(Keyvalue)而直接进行访问的数据结构。通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。键关键码值(Keyvalue)。值表中的位置,即哈希地址。上述技术方案中,所使用的各装置表述如下a、编译单元拆分装置该装置将遍历欲拆分编译单元,查找所有的成员定义,首先为每个非公有(非public)的成员创建一个新的编译单元,新的编译单元的文件名与其所包含的非公有的成员的名字保持一致,然后,将这些单独的编译单元组织在原来的包中,即包名均使用原公有(public)成员的包名,新生成编译单元保存在与原编译单元同一文件夹中,最后从原编译单元中复制非公有成员的内容到新的编译单元中,并删除原编译单元中所有非公有的成员,仅保留原公有(public)的成员。b、成员更名装置根据自定义规则自动生成新成员名,得到新成员名后,首先对将要改名的成员进行更改成员名操作,更改其成员名为新成员名;然后将该成员所在的编译单元的文件名同步更新为新成员名;最后遍历全部Java源代码,查找所有对将要改名成员的引用,将所有其引用更新为新成员名。C、编译单元迁移装置完成编译单元在不同包之间的迁移,首先该装置遍历迁移后的新包中的文件并判断是否有和欲迁移编译单元的命名冲突,如果有冲突,则使用成员更名装置对欲迁移的成员进行成员更名,成员更名装置所采用的第二自定义规则为新的名称由原成员名加上一个随机数组成,其之间采用编译器和集成开发环境允许的分隔符进行分隔。在无命名冲突情况下,将对应的编译单元从原来的目录结构中移动到新的包目录结构中,然后将原包名改为新的包名,最后,遍历所有编译单元,对所有原来旧的包名的引用处,均更新为新的包名。d、导入列表生成装置该装置首先为该编译单元建立导入列表,然后在该编译单元中查找并处理每个对外部类或外部接口以及其成员的引用,如果在导入列表中,尚不存在该外部类或外部接口的导入记录,则将该外部引用的类或接口添加到导入列表中。对于编译单元本包中的类或接口引用和集成开发环境默认的类或接口的外部引用同样生成对应的导入记录并添加到导入列表中。对于Java标准API类库和第三方类库中的类或接口的外部引用,生成其对应的完全限定名的导入记录并添加到导入列表中。对于静态导入形式的引用的处理,与对外部类或外部接口的成员的引用处理方法相同,并将其引用到的Java编译单元的成员添加到导入列表中。e、Java标准API类库和第三方类库对应的头文件查找装置该装置包含一个存储Java标准API类库和第三方类库成员名和C++头文件列表的对应关系映射表,通过查找该映射表,可以得到Java标准API类库和第三方类库成员对应的C++编译单元所需要包含的C++头文件列表。该关系映射表的数据结构为哈希映射表,键为Java标准API类库和第三方类库成员名字符串,值为需要包含的C++头文件列表。在查找该哈希映射表时,以Java标准API类库和第三方类库成员名字符串作为输入,即可得到需要包含的C++头文件列表。f、C++头文件中头文件导出装置该装置以导入列表为依据,对Java编译单元中的Java成员,判断其是否有父类或父接口,如果有父类或父接口,继续判断该父类或父接口是否存在于Java标准API类库或第三方类库中,如果是,则使用Java标准API类库和第三方类库对应的头文件查找装置查找其对应的C++头文件列表并添加到C++头文件的头文件列表中;如果该父类或父接口不属于Java标准API类库或第三方类库,则直接使用该父类或父接口的名称加.h构建新的包含(include)项,添加到C++头文件的头文件列表中;从导入列表中删除该父类或父接口的导入记录。处理完父类或父接口后,继续判断该Java成员是否有实现接口,如果有实现接口,则对全部实现的接口进行与父类或父接口操作类似的操作。判断该接口是否存在于Java标准API类库或第三方类库中,如果是,则使用Java标准API类库和第三方类库对应的头文件查找装置查找其对应的C++头文件列表并添加到C++头文件的头文件列表中;如果该接口不属于Java标准API类库或第三方类库,则直接使用该接口名加.h构建新的包含(include)项,添加到C++头文件的头文件列表中;从导入列表中删除该接口的导入记录。处理完接口后,查看导入列表,查找Java标准API类库或第三方类库中的类或接口的外部引用的导入记录,对全部的Java标准API类库或第三方类库中的类或接口,使用Java标准API类库和第三方类库对应的头文件查找装置查找其对应的C++头文件列表并添加到C++头文件的头文件列表中,从导入列表中删除Java标准API类库或第三方类库中的类或接口的导入记录。然后对导入列表中剩余的每个导入记录,逐项记录并生成前置声明列表。最后该装置先将为C++头文件的头文件列表中的每一项,生成C++头文件(.h)中的标准包含(include)语句,并放置到C++头文件(.h)顶部区域,然后为前置声明列表中的每一项生成其外部引用的标准前置声明表达式,并放置在C++头文件(.h)的包含(include)语句之后。g、C++源文件中头文件导出装置该装置以导入列表为依据,对Java编译单元中的Java成员,判断其是否有父类或父接口,如果有父类或父接口,继续判断该父类或父接口是否存在于Java标准API类库或第三方类库中,如果是,则使用Java标准API类库和第三方类库对应的头文件查找装置查找其对应的C++头文件列表并添加到C++源文件的头文件列表中;如果该父类或父接口不属于Java标准API类库或第三方类库,则直接使用该父类或父接口的名称加.h构建新的包含(include)项,添加到C++源文件的头文件列表中;从导入列表中删除该父类或父接口的导入记录。处理完父类或父接口后,继续判断该Java成员是否有实现接口,如果有实现接口,则对全部实现的接口进行与父类或父接口操作类似的操作。判断该接口是否存在于Java标准API类库或第三方类库中,如果是,则使用Java标准API类库和第三方类库对应的头文件查找装置查找其对应的C++头文件列表并添加到C++源文件的头文件列表中;如果该接口不属于Java标准API类库或第三方类库,则直接使用该接口名加.h构建新的包含(include)项,添加到C++源文件的头文件列表中,从导入列表中删除该接口的导入记录。处理完接口后,对导入列表中剩余的每个导入记录,判断该导入记录是否存在于Java标准API类库或第三方类库,如果是,则使用Java标准API类库和第三方类库对应的头文件查找装置查找其对应的C++头文件列表并添加到C++源文件的头文件列表中,如果不属于Java标准API类库或第三方类库,则直接使用该成员名加.h构建新的包含(include)项,添加到C++源文件的头文件列表中。处理完剩余的导入项后,将与该源文件(.cpp)同名的头文件(.h)添加到该源文件的头文件列表中。最后该装置将为C++源文件的头文件列表中的每一项,生成C++源文件(.cpp)中的标准包含(include)语句,并放置到C++源文件的顶部区域。图1示出了编译单元拆分装置的处理流程图;图2示出了成员更名装置的处理流程图;图3示出了编译单元迁移装置的处理流程图;图4示出了C++头文件中头文件导出装置的处理流程图;图5示出了C++源文件中头文件导出装置的处理流程图;图6为实施例中的将Java编译单元中简单名称方式的外部引用改为完全限定名方式的操作示意图;图7为实施例中的拆分Java编译单元的操作示意图;图8为实施例中的对Java编译单元及成员进行更名操作的操作示意图;图9为实施例中的将Java编译单元迁移至缺省包的操作示意图;图10为实施例中的为翻译后生成的C++头文件生成包含语句和前置声明的操作示意图;图11为实施例中的为翻译后生成的C++源文件生成包含语句的操作示意图;图12示出了本发明方法的总体流程图。具体实施例方式下面结合附图对本发明的方法的具体实施方式做进一步说明。参照附图,本发明包括以下步骤步骤101)、将Java编译单元中简单名称方式的外部引用改为完全限定名方式。遍历每个Java编译单元,查找因导入了特定成员而采用简单名称方式的外部引用,并将简单名称方式改写为完全限定名方式。对于当前编译单元所在包中的类或接口简单名称方式的外部引用和系统默认的类或接口的简单名称方式的外部引用,进行相同处理,将简单名称方式改写为完全限定名方式。本步骤处理仅针对本项目各编译单元中的类或接口的外部引用,对于Java标准API类库和第三方类库中的类或接口的外部引用,在步骤105-107中由其它装置进行处理。步骤102)、拆分Java编译单元,使每个编译单元只包含一个成员,即只包含一个类或接口的定义。遍历每个Java编译单元,首先查找在一个编译单元中包含了多个成员的编译单元,接着将该编译单元通过编译单元拆分装置拆分为多个单独的编译单元,使得每个单独的编译单元只包含原编译单元中的一个成员。从而保证将每个单独的Java编译单元翻译为对应的C++头文件和C++源文件后,在C++头文件中只包含一个类或者接口的定义,在C++源文件中只包含一个类的实现。本步骤显著而有效地避免了可能出现的关联性问题,使得代码结构更清晰,更利于应用转换和引用等操作。步骤103)、对Java编译单元及成员进行更名。遍历每个Java编译单元,对每个编译单元通过成员更名装置进行更名,此处采用第一自定义规则为新的名称由包名与成员名共同组成,包名中以点字符分隔的各部分之间以及包名与成员名之间采用编译器和集成开发环境允许的分隔符进行分隔,从而保证名称的唯一性。步骤104)、Java编译单元迁移至缺省包。遍历每个Java编译单元,将各编译单元通过编译单元迁移装置全部迁移到缺省包中。所述的缺省包,为集成开发环境默认的无显示包声明情况下编译单元所处的包,其在目录结构中为集成开发环境默认的源代码文件夹。步骤105)、为Java编译单元生成导入列表。遍历每个Java编译单元,通过导入列表生成装置为每个编译单元生成导入列表。步骤106)、使用C++头文件中头文件导出装置为翻译后生成的C++头文件(.h)生成包含(include)语句和前置声明。遍历每个Java编译单元,生成C++头文件,复制一个步骤105生成的导入列表的拷贝,并以该拷贝列表为依据,通过C++头文件中头文件导出装置为Java到C++语言程序翻译后生成的C++头文件(.h)生成包含(include)语句和前置声明,其中生成的C++头文件的文件名与Java编译单元名是一致的。由于Java语言程序中类对象的使用是一种等同于指针的方式,因此在翻译为对应的C++语言程序后,可以等价翻译为类指针的定义形式,由此对于类的交叉引用的问题,本发明中的C++头文件中头文件导出装置采用了添加前置声明的方法进行处理。本发明方法采用的是C++程序中成员定义及声明与成员的具体实现分开存放的处理方式,因此本发明方法中的头文件(.h),仅包含成员定义和声明,不包含成员的具体实现,成员的具体实现部分位于本发明方法生成的源文件Ccpp)中。步骤107)、使用C++源文件中头文件导出装置为翻译后生成的C++源文件(.cpp)生成包含(include)语句。遍历每个Java编译单元,生成C++源文件,复制一个步骤105生成的导入列表的拷贝,并以该拷贝列表为依据,通过C++源文件中头文件导出装置为Java到C++语言程序翻译后生成的C++源文件(.cpp)生成包含(include)语句,其中生成的C++源文件的文件名与Java编译单元名是一致的。本发明方法采用的是C++程序中成员定义及声明与成员的具体实现分开存放的处理方式,因此本发明方法中的头文件(.h),仅包含成员定义和声明,不包含成员的具体实现,成员的具体实现部分位于本发明方法生成的源文件(.cpp)中。本发明为实现技术方案,可采用以下装置a、编译单元拆分装置如图1所示,该装置将遍历欲拆分编译单元,查找所有的成员定义,首先为每个非公有(非public)的成员创建一个新的编译单元,新的编译单元的文件名与其所包含的非公有的成员的名字保持一致,然后,将这些单独的编译单元组织在原来的包中,即包名均使用原公有(public)成员的包名,新生成编译单元保存在与原编译单元同一文件夹中,最后从原编译单元中复制非公有成员的内容到新的编译单元中,并删除原编译单元中所有非公有的成员,仅保留原公有(public)的成员。该装置可在本发明的步骤102中被调用。b、成员更名装置如图2所示,根据自定义规则自动生成新成员名,得到新成员名后,首先对将要改名的成员进行更改成员名操作,更改其成员名为新成员名;然后将该成员所在的编译单元的文件名同步更新为新成员名;最后遍历全部Java源代码,查找所有对将要改名成员的引用,将所有其引用更新为新成员名。该装置可在本发明的步骤103中被调用。C、编译单元迁移装置如图3所示,完成编译单元在不同包之间的迁移,首先该装置遍历迁移后的新包中的文件并判断是否有和欲迁移编译单元的命名冲突,如果有冲突,则使用成员更名装置对欲迁移的成员进行成员更名,成员更名装置所采用的第二自定义规则为新的名称由原成员名加上一个随机数组成,其之间采用编译器和集成开发环境允许的分隔符进行分隔。在无命名冲突情况下,将对应的编译单元从原来的目录结构中移动到新的包目录结构中,然后将原包名改为新的包名,最后,遍历所有编译单元,对所有原来旧的包名的引用处,均更新为新的包名。该装置可在本发明的步骤104中被调用。d、导入列表生成装置该装置首先为该编译单元建立导入列表,然后在该编译单元中查找并处理每个对外部类或外部接口以及其成员的引用,如果在导入列表中,尚不存在该外部类或外部接口的导入记录,则将该外部引用的类或接口添加到导入列表中。对于编译单元本包中的类或接口引用和集成开发环境默认的类或接口的外部引用同样生成对应的导入记录并添加到导入列表中。对于Java标准API类库和第三方类库中的类或接口的外部引用,生成其对应的完全限定名的导入记录并添加到导入列表中。对于静态导入形式的引用的处理,与对外部类或外部接口的成员的引用处理方法相同,并将其引用到的Java编译单元的成员添加到导入列表中。该装置可在本发明的步骤105中被调用。e、Java标准API类库和第三方类库对应的头文件查找装置该装置包含一个存储Java标准API类库和第三方类库成员名和C++头文件列表的对应关系映射表,通过查找该映射表,可以得到Java标准API类库和第三方类库成员对应的C++编译单元所需要包含的C++头文件列表。该关系映射表的数据结构为哈希映射表,键为Java标准API类库和第三方类库成员名字符串,值为需要包含的C++头文件列表。在查找该哈希映射表时,以Java标准API类库和第三方类库成员名字符串作为输入,即可得到需要包含的C++头文件列表。该装置可在本发明的步骤106、107中被调用。f、C++头文件中头文件导出装置如图4所示,该装置以导入列表为依据,对Java编译单元中的Java成员,判断其是否有父类或父接口,如果有父类或父接口,继续判断该父类或父接口是否存在于Java标准API类库或第三方类库中,如果是,则使用Java标准API类库和第三方类库对应的头文件查找装置查找其对应的C++头文件列表并添加到C++头文件的头文件列表中;如果该父类或父接口不属于Java标准API类库或第三方类库,则直接使用该父类或父接口的名称加.h构建新的包含(include)项,添加到C++头文件的头文件列表中;从导入列表中删除该父类或父接口的导入记录。处理完父类或父接口后,继续判断该Java成员是否有实现接口,如果有实现接口,则对全部实现的接口进行与父类或父接口操作类似的操作。判断该接口是否存在于Java标准API类库或第三方类库中,如果是,则使用Java标准API类库和第三方类库对应的头文件查找装置查找其对应的C++头文件列表并添加到C++头文件的头文件列表中;如果该接口不属于Java标准API类库或第三方类库,则直接使用该接口名加.h构建新的包含(include)项,添加到C++头文件的头文件列表中;从导入列表中删除该接口的导入记录。处理完接口后,查看导入列表,查找Java标准API类库或第三方类库中的类或接口的外部引用的导入记录,对全部的Java标准API类库或第三方类库中的类或接口,使用Java标准API类库和第三方类库对应的头文件查找装置查找其对应的C++头文件列表并添加到C++头文件的头文件列表中,从导入列表中删除Java标准API类库或第三方类库中的类或接口的导入记录。然后对导入列表中剩余的每个导入记录,逐项记录并生成前置声明列表。最后该装置先将为C++头文件的头文件列表中的每一项,生成C++头文件(.h)中的标准包含(include)语句,并放置到C++头文件(.h)顶部区域,然后为前置声明列表中的每一项生成其外部引用的标准前置声明表达式,并放置在C++头文件(.h)的包含(include)语句之后。该装置可在本发明的步骤106中被调用。g、C++源文件中头文件导出装置如图5所示,该装置以导入列表为依据,对Java编译单元中的Java成员,判断其是否有父类或父接口,如果有父类或父接口,继续判断该父类或父接口是否存在于Java标准API类库或第三方类库中,如果是,则使用Java标准API类库和第三方类库对应的头文件查找装置查找其对应的C++头文件列表并添加到C++源文件的头文件列表中;如果该父类或父接口不属于Java标准API类库或第三方类库,则直接使用该父类或父接口的名称加.h构建新的包含(include)项,添加到C++源文件的头文件列表中;从导入列表中删除该父类或父接口的导入记录。处理完父类或父接口后,继续判断该Java成员是否有实现接口,如果有实现接口,则对全部实现的接口进行与父类或父接口操作类似的操作。判断该接口是否存在于Java标准API类库或第三方类库中,如果是,则使用Java标准API类库和第三方类库对应的头文件查找装置查找其对应的C++头文件列表并添加到C++源文件的头文件列表中;如果该接口不属于Java标准API类库或第三方类库,则直接使用该接口名加.h构建新的包含(include)项,添加到C++源文件的头文件列表中,从导入列表中删除该接口的导入记录。处理完接口后,对导入列表中剩余的每个导入记录,判断该导入记录是否存在于Java标准API类库或第三方类库,如果是,则使用Java标准API类库和第三方类库对应的头文件查找装置查找其对应的C++头文件列表并添加到C++源文件的头文件列表中,如果不属于Java标准API类库或第三方类库,则直接使用该成员名加.h构建新的包含(include)项,添加到C++源文件的头文件列表中。处理完剩余的导入项后,将与该源文件(.cpp)同名的头文件(.h)添加到该源文件的头文件列表中。最后该装置将为C++源文件的头文件列表中的每一项,生成C++源文件(.cpp)中的标准包含(include)语句,并放置到C++源文件的顶部区域。该装置可在本发明的步骤107中被调用。如图6所示,标号601为一个Java编译单元,其名称为ClassA.java,它可以包含如下程序语句importcom.yoray.graphics.Rectangle;......RectanglemyRect=null;......标号602为一个Java编译单元,其名称为ClassA.java。Java编译单元601经步骤101处理后,得到Java编译单元602。具体的说,601中所包含的简单名称方式的外部引用RectanglemyRect=null;经过步骤101处理后,被改为Java编译单元602中完全限定名方式的外部引用com.yoray.graphics.RectanglemyRect=null;如图7所示,标号701为一个拆分前的Java编译单元,其名称为ClassA.java,它可以包含如下程序语句packagecom.yoray.java2cpppublicclassClassA{......}classClassD{......}标号702为拆分后的Java编译单元,其名称为ClassA.java;标号703为拆分后的Java编译单元,其名称为ClassD.java,703保存在与702同一文件夹中。拆分前的Java编译单元701经步骤102处理后,得到拆分后的Java编译单元702和703。具体的说,701中所包含的成员classClassD{......}经步骤102处理后,得到新的编译单元703,它可以包含如下程序语句packagecom.yoray.java2cppclassClassD{......}701本身经步骤102处理后,得到编译单元702,它可以包含如下程序语句packagecom.yoray.java2cpppublicclassClassA{......}如图8所示,标号801为一个Java编译单元,其名称为ClassA.java,它可以包含如下程序语句packagecom.yoray.java2cpppublicclassClassA{......}f示#802为一个Java^l^^-jt,com_yoray_java2cpp_ClassA.java。更名前的Java编译单元801经步骤103处理后,得到更名后的Java编译单元802。具体的说,801中所包含的成员ClassA,经步骤103处理后,其成员名转换为802中的新成员名com_yoray_java2cpp_ClassA;801的文件名,经步骤103处理后,转换为802的文件名com_yoray_java2cpp_ClassA.java。802中包含如下程序语句packagecom.yoray.java2cpppublicclasscom_yoray_java2cpp_ClassA{......}如图9所示,标号901为一个Java编译单元,其名称为com_yoray_java2cpp_ClassA.java,它可以包含如下程序语句packagecom.yoray.java2cpppublicclasscom_yoray_java2cpp_ClassA{com.yoray.graphics.com_yoray_graphics_RectanglemyRect=null;......}f示#902为一个Java^l^^-jt,com_yoray_java2cpp_ClassA.java。迁移前的Java编译单元901经步骤104处理后,得到迁移至缺省包后的Java编译单元902。具体的说,901中可以包含如下程序语句com.yoray.graphics,com—yoray—graphics—RectanglemyRect=null;该语句在601中的形式为RectenglemyRect=null;经过步骤101的处理,被改写为com.yoray.graphics.RectanglemyRect=null;经过步骤103的处理,该语句在802中的形式为com.yoray.graphics,com—yoray—graphics—RectanglemyRect=null;经过步骤104的处理,该语句在902中的形式为com_yoray_graphics_RectanglemyRect=null;在902中可以包含如下程序语句publicclasscom—yoray—java2cpp—ClassA{com_yoray_graphics_RectanglemyRect=null;......}然后使用导入列表生成装置为每个Java编译单元生成导入列表。在一个迀移至缺省包后的Java编译单元com—yoray—java2cpp—ClassA.java中可以包含如下程序语句importcom_yoray_graphics_Rectangle;importcom_yoray_java2cpp_test_ClassB;importjava.lang.Runnable;publicclasscom_yoray_java2cpp_ClassAextendscom_yoray_java2cpp_test_ClassBimplementscom_yoray_java2cpp_InterfaceC,Runnable{......com—yoray—graphics—RectanglemyRect=null;......}经步骤105处理后,得到com_yoray_java2cpp_ClassA.Java编译单元的导入列表,其中包含的内容为com_yoray_java2cpp_test_ClassBcom_yoray_java2cpp_InterfaceCjava.lang.Runnablecom—yoray—graphics—Rectangle如图10所示,标号1001为一个已迀移至缺省包的Java编译单元,其名称为com—yoray_java2cpp_ClassA.java,它可以包含如下程序语句importcom_yoray_graphics_Rectangle;importcom_yoray_java2cpp_test_ClassB;importjava.lang.Runnable;publicclasscom_yoray_java2cpp_ClassAextendscom_yoray_java2cpp_test_ClassBimplementscom_yoray_java2cpp_InterfaceC,Runnable{......com_yoray_graphics_RectanglemyRect=null;......}标号1002为Java编译单元com—yoray—java2cpp—ClassA.java的导入列表,其中包含的内容为com_yoray_java2cpp_test_ClassBcom_yoray_java2cpp_InterfaceCjava.lang.Runnablecom—yoray—graphics—Rectangle标号1003为C++头文件的包含语句和前置声明,C++头文件的名称为Com_yoray_java2cpp_ClassA.hoJava编译单元1001及其导入列表1002经步骤106处理后,得到C++头文件的包含(include)语句和前置声明1003。具体的说,1001中的类com_yoray_java2cpp_ClassA其父类com_yoray_java2cpp_test_ClassB经步骤106处理后,得到1003中的包含语句#include〃com_yoray_java2cpp_test_ClassB.h“1001ψ^com_yoray_java2cpp_C1assA$JJ,^Pcom_yoray_java2cpp_InterfaceC和Runnable经步骤106处理后,得到1003中的包含语句#include〃com_yoray_java2cpp_InterfaceC.h“#include〃java_lang_Runnable.h"其中,在处理实现的接口时,对于导入列表中的Java标准API类库和第三方类库中的成员java.lang.Rurmable,使用Java标准API类库和第三方类库对应的头文件查找装置查找哈希映射表得到其对应的C++头文件列表为jaVa_lang_Rurmable.h,并将其添加到C++头文件的头文件列表中,经步骤106的处理得到1003中的包含语句#include〃java_lang_Runnable.h"1002中的com_yoray_graphics_Rectangle经步骤106处理后,得到1003中的前置声明classcom_yoray_graphics_Rectangle;1003可以包含如下语句和前置声明#include“com_yoray_java2cpp_test_ClassB.h"#include”com_yoray_java2cpp_InterfaceC.h"#include”java_lang_Runnab1e.h"classcom_yoray_graphics_Rectangle;......如图11所示,标号1101为一个已迀移至缺省包的Java编译单元,其名称为com—yoray_java2cpp_ClassA.java,它可以包含如下程序语句importcom_yoray_graphics_Rectangle;importcom_yoray_java2cpp_test_ClassB;importjava.lang.Runnable;publicclasscom_yoray_java2cpp_ClassAextendscom_yoray_java2cpp_test_ClassBimplementscom_yoray_java2cpp_InterfaceC,Runnable{......com_yoray_graphics_RectanglemyRect=null;......}标号1102为Java编译单元com—yoray—java2cpp—ClassA.java的导入列表,其中包含的内容为com_yoray_java2cpp_test_ClassBcom_yoray_java2cpp_InterfaceCjava.lang.Runnablecom—yoray—graphics—Rectangle标号1103为C++源文件的包含语句,C++源文件的名称为com—yoray—java2cpp—ClassA.cpp0Java编译单元1101及其导入列表1102经步骤107处理后,得到C++源文件的包含语句1103。具体的说,1101中的类com—yoray_java2cpp_ClassA其父类com—yoray_java2cpp—test—ClassB经步骤107处理后,得到1103中的包含语句#include“com_yoray_java2cpp_test_ClassB.h"1101中的类com—yoray—java2cpp—ClassA实现的接口com_yoray_java2cpp_InterfaceC和Runnable经步骤107处理后,得到1103中的包含语句#include”com_yoray_java2cpp_InterfaceC.h"#include"java_lang_Runnable.h"其中,在处理实现的接口时,对于导入列表中的Java标准API类库和第三方类库中的成员java.lang.Rurmable,使用Java标准API类库和第三方类库对应的头文件查找装置查找哈希映射表得到其对应的C++头文件列表为jaVa_lang_Rurmable.h,并将其添加到C++源文件的头文件列表中,经步骤107的处理得到1103中的包含语句#include〃java_lang_Runnable.h"1102中的com_yoray_graphics_Rectangle经步骤107处理后,得到1103中的包含语句#include〃com_yoray_graphics_Rectangle.h"此外,步骤107将得到与1103同名的头文件的包含语句#include〃com_yoray_java2cpp_ClassA.h"1103可以包含如下语句#include〃com_yoray_java2cpp_test_ClassB.h“#include〃com_yoray_java2cpp_InterfaceC.h“#include〃java_lang_Runnable.h"#include〃com_yoray_graphics_Rectangle.h"#include〃com_yoray_java2cpp_ClassA.h"......对于C++程序中重复包含(include)的问题,现已经有很多方法可以解决这个问题,针对不同的编译环境,如采用增加条件编译命令或者采用编译预处理命令(#pragmaonce)等方法予以解决,因不属于本发明研究范畴,这里仅简略介绍。以上所述的实施例,仅为本发明的优选实施例之一,并不用于限制本发明。对于本领域的技术人员而言,本发明的实施例可以有多种表现形式上的变化,凡在本发明的思想、方法和原则之内,所作的任何修改、等同替换、改进等任何表现形式上的变化,均应包含在本发明的保护范围之内。权利要求一种应用于Java到C++语言程序翻译中外部引用的翻译方法,包括以下步骤步骤1)、将Java编译单元中简单名称方式的外部引用改为完全限定名方式;步骤2)、使用编译单元拆分装置拆分Java编译单元,使每个编译单元只包含一个成员,即只包含一个类或接口的定义;步骤3)、使用成员更名装置对Java编译单元及成员进行更名;步骤4)、使用编译单元迁移装置将各Java编译单元迁移至缺省包;步骤5)、使用导入列表生成装置为每个Java编译单元生成导入列表;步骤6)、使用C++头文件中头文件导出装置为翻译后生成的C++头文件生成包含语句和前置声明;步骤7)、使用C++源文件中头文件导出装置为翻译后生成的C++源文件生成包含语句。2.如权利要求1所述的一种应用于Java到C++语言程序翻译中外部引用的翻译方法,其特征为使用编译单元拆分装置拆分Java编译单元,具体操作包括a、创建新的编译单元;b、组织在原来的包中;C、复制内容到新的编译单元中;d、删除原编译单元中所有非公有的成员。3.如权利要求1所述的一种应用于Java到C++语言程序翻译中外部引用的翻译方法,其特征为使用成员更名装置对Java编译单元及成员进行更名,具体操作包括a、生成自定义规则的新成员名;b、对成员进行改名;C、对编译单元进行改名;d、将所有原成员的引用更新为新成员名。4.如权利要求3所述的一种应用于Java到C++语言程序翻译中外部引用的翻译方法,其特征为在对Java编译单元及成员进行更名操作步骤中成员更名装置所采用的第一自定义规则为新的名称由包名与成员名共同组成,包名中以点字符分隔的各部分之间以及包名与成员名之间采用编译器和集成开发环境允许的分隔符进行分隔。5.如权利要求1所述的一种应用于Java到C++语言程序翻译中外部引用的翻译方法,其特征为使用编译单元迁移装置进行编译单元迁移操作,具体操作包括a、判断命名冲突;b、如果存在命名冲突,则使用成员更名装置进行成员更名;C、移动编辑单元;d、原包名改为新的包名;e、将所有原包名引用处更新为新包名。6.如权利要求5所述的一种应用于Java到C++语言程序翻译中外部引用的翻译方法,其特征为使用成员更名装置进行成员更名操作中成员更名装置所采用的第二自定义规则为新的名称由原成员名加上一个随机数组成,其之间采用编译器和集成开发环境允许的分隔符进行分隔。7.如权利要求1所述的一种应用于Java到C++语言程序翻译中外部引用的翻译方法,其特征为使用C++头文件中头文件导出装置为翻译后生成的C++头文件生成包含语句和2前置声明,具体操作包括a、对父类或父接口的处理;b、对实现的接口的处理;C、对Java标准API类库和第三方类库中的类或接口的外部引用的处理;d、对其它导入项的处理;e、生成C++头文件包含语句和前置声明。8.如权利要求7所述的一种应用于Java到C++语言程序翻译中外部引用的翻译方法,其特征为对Java标准API类库和第三方类库中的类或接口的外部引用的处理为使用Java标准API类库和第三方类库对应的头文件查找装置查找映射表,将得到的对应的C++头文件列表添加到C++头文件的头文件列表中。9.如权利要求1所述的一种应用于Java到C++语言程序翻译中外部引用的翻译方法,其特征为使用C++源文件中头文件导出装置为翻译后生成的C++源文件生成包含语句,具体操作包括a、对父类或父接口的处理;b、对实现的接口的处理;C、对Java标准API类库和第三方类库中的类或接口的外部引用的处理;d、对其它导入项的处理;e、将同名头文件添加到头文件列表中;f、生成C++源文件包含语句。10.如权利要求9所述的一种应用于Java到C++语言程序翻译中外部引用的翻译方法,其特征为对Java标准API类库和第三方类库中的类或接口的外部引用的处理为使用Java标准API类库和第三方类库对应的头文件查找装置查找映射表,将得到的对应的C++头文件列表添加到C++源文件的头文件列表中。全文摘要本发明提供一种应用于Java到C++语言程序翻译中外部引用的翻译方法。包括以下步骤将Java编译单元中简单名称方式的外部引用改为完全限定名方式;拆分Java编译单元,使每个Java编译单元只包含一个成员定义;对Java编译单元及成员进行更名;Java编译单元迁移至缺省包;为Java编译单元生成导入列表;生成C++头文件的包含语句和前置声明;生成C++源文件的包含语句。本发明在保证代码功能性不变的前提下,提供了一种自动化的、高可靠性的Java到C++语言程序翻译中外部引用的翻译方法,具有较好的运行效率。文档编号G06F9/44GK101968736SQ20101028001公开日2011年2月9日申请日期2010年9月13日优先权日2010年9月13日发明者阮锋,魏利锋申请人:杭州元睿信息技术有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1