代码转换的制作方法

文档序号:6567965阅读:987来源:国知局

专利名称::代码转换的制作方法
技术领域
:本发明涉及可执行代码从一种语言到另一种语言的转换。具体来说,本发明涉及代码的自动转换。
背景技术
:遗留系统(legacysystem)是陈旧的计算机系统或通常包含以COBOL、PL/I和其它古老的编程语言写成的几十亿行代码的应用程序。转换涉及将遗留的应用程序源代码转换为现代语言的进程,例如将应用程序从COBOL转换到J2EE上的Java,或将RPG写成的应用程序转换为.NET上的c#。有时也将转换称作现代化。将遗留的应用程序转换,i]独立的现代的技术平台具有很多优点一维护遗留应用程序的知识产权;一使得将来更容易且以较少花费对应用程序进行改进;—应用程序可以现代化为能够提供网页(Web-enablement);而且一应用程序可保持原始的样式、感觉和功能,从而使对职工的培训最小化。转换通常使用基于工作台的应用程序现代化的方法,也就是说,转换基于一系列完全不同的工具,且通常牵涉很多对代码的人工转换。A.特里可夫(ATerekhov)和C.费霍夫(CVerhoef)在他们的名称为"实现语言转换(TheRealitiesofLanguageConversion)"(圣彼德堡州立大学(StPetersburgStateUniversity))的论文中陈述自动化的语言变换看起来简单,但当实际应用时是一个极其复杂的问题n他们以这样的陈述进行总结不存在像筒单变换这样的事情,人们应该限制他们对转换工程的质量和语义上等价的期望。
发明内容本发明的第一方案为一种创建包括多个节点的树的.方法,该树待用于可执行代码到不同编程语言的转换中,该方法包括接收所述可执行代码;识别所述代码的每一可执行段;为所述代码的每一可执行段分配一个节点,其中每一节点属于一组预定节点类型之一,所述每一预定节点类型定义编程语言的一项唯一的通用可执行操作,每一节点的结构和内容由其节点类型定义的通用操作来确定;和链接多个节点以创建该树。通过将各执行段削减到其基本含义,各种语言之间的语法区别就不会在创建的树中反映出来,该树随后用于将代码转换到不同的编程语言。如果代码的两个部分实现同一组可执行操作,即便它们是由不同语言写成的,代码的这两个部分也会生成相同的树。这样,由于相同的方法可以应用于多种编程语言,因此使代码转换变得容易,并避免了对独立的中间语言的需求。所述唯一的通用可执行操作可以是对另一代码组元的引用;赋值语句;数据处理语句;条件语句;或循环语句。对于每一节点类型,其结构包括一个或更多个子节点,其中每一子节点属于一组预定子节点类型之一,所述每一子节点类型定义其通用可执行操作的一个可能组元。例如,定义赋值语句的可执行操作的节点类型,可以构建为包括子节点类型的第一子节点以及子节点类型的第二子节点,该第一子节点类型定义赋值操作的目标组元,第二子节点类型定义赋值操作赋值组元。对于每一子节点类型,其结构包括一个或更多个再子节点,其中每一再子节点属于一组预定再子节点类型之一,所述每一再子节点类型定义其通用可执行操作的组元的一个可能子组元。例如,上述第二子节点可以具有一组预定再子节点类型,其可包括一个定义变量或数学表达式的再子节点。在该树中,所述可执行代码中使用的变量会与定义变量的子节点类型相关地出现在该树中。在该树中,所述可执行代码中使用的数学等式会与定义所述等式中使用的数学表达式的子节点类型相关联地出现在该树中。在该树中,所述可执行代码中使用的常量会与定义常量的子节点类型相关地出现在该树中。每一节点可包括识别信息,例如分配给所述可执行代码中的可执行段的行号。通过向每一节点分配链接信息来将该节点链接到该树上,所述链接信息与将该节点链接到该树上所需的其它节点有关,例如该节点的父节点和子节点的详情。每一节点可具有唯一的标识符。一个节点可通过拥有该节点相关的父节点或子节点的唯一的ID,来链接到该树。每一节点可进一步包括多个方法,这多个方法涉及如何执行用于协助处理树的各种动作。每一节点可进一步包括一个标记器,该标志器能够由所述用于协助处理树的多种方法使用;例如,指示一方法在该节点上已经被执行。所述方法可进一步包括识别所述声明数据的每一声明段;为所述代码的每一声明段分配一个节点,该节点属于定义声明的节点类型;以及将该声明节点链接到该树。所迷声明数据可以是与所述可执行代码相关联的另一代码。所述声明数据可以包括变量声明、函数声明或程序声明。所述声明节点包括以下任一个或更多个如上所述的识别信息;如上所述的链接信息;如上所述的多个方法;以及唯一的标识符。本发明的第二方案为一种建立解析器以创建包括多个节点的树的方法,该树待用于可执行代码从第一编程语言到第二编程语言的转换中,该方法包括针对所述第一编程语言,从以所述第一编程语言编写的代码中识别出定义可执行操作的语法;为识别出的语法分配节点类型,其中每一节点类型为一组预定节点类型之一,所述每一预定节点类型定义编程语言的一项唯一的通用可执行操作;每一节点类型的结构和内容由其节点类型定义的通用操作来确定;重复该方法,直至针对所述第一操作语言的所有可执行操作的语法都已经被识别并且都已被分配节点类型。本发明的第三方案提供了一种解析器,其用于执行本发明第一方案的方法。该解析器可以依据本发明第二方案的方法来建立。本发明的第四方案为一种能够使计算机系统运行以执行本发明第一方案的方法的应用软件。本发明的第五方案为一种能够使计算机系统运转以执行本发明第二方案的方法的应用软件。本发明的第六方案为一种将可执行代码转换为不同编程语言的计算机系统,该计算机系统具有输入工具,用于接收所述可执行代码;存储工具,用于存储所接收的代码和应用软件;和处理工具,用于使用所述应用软件来执行本发明第一方案的方法。该计算机系统可以进一步包括输出工具,其用于以不同的编程语言输出所述可执行代码。本发明的第七方案为一种将可执行代码从第一编程语言转换为第二编程语言的计算机系统,该计算机系统包括存储工具,用于存储所述可执行代码和应用软件;以及处理工具,用于使用所述应用软件执行本发明第二方案的方法。本发明的第八方案为一种将可执行代码从第一编程语言转换为第二编程语言的方法,所述方法包括以本发明的第一方案所述的方法创建树;针对树上的每个节点,将定义的可执行操作转录为第二编程语言的语法。本发明的第九方案为一种将代码转换为不同编程语言的方法,该方法包括接收所述代码;将涉及多个重建进程的识别数据存储于数据存储器中,所述多个重建进程待在所述抽象语法树上运行以重建该树,从而协助所述到不同语言的代码转换;在所述抽象语法树上自动运行在所述数据存储器中识别出的重建进程;在该重建的树上自动运行配置进程,以将所述代码转换为所述不同的编程语言;评估转换后的代码,并基于该评估,识别出另一待在所述抽象语法树上运行以协助所述到不同语言的代码转换的重建进程;将所述另一重建进程的识别数据存储到所述数据存储器中;以及重复所述运行步骤。利用每次迭代,对原始代码进行重复转换并分析,从而使得转换后的代码在质量上更好,且更具有可维护性。各次迭代生成与新语言的体系结构更兼容并适应的转换后的代码。仅在转换处理中给出高自动化水平时,该代码转换的迭代方案才成为可能。如果在运行步骤中包括人工数据转换,则获取最佳代码的迭代方案的代价和付出可能受到限制。进一步地,通过执行在数据存储器中识别出的进程,在迭代之间可以对转换进行动态的重新限定.代码可以从代码的拥有者那里接收。该方法还可以包括接收数据词典、元数据或与所接收的代码有关的所有其它文件.抽象语法树可以是依据本发明第一和第二方案所述的树。该抽象语法树可以使用本发明第一方案描述的方法来创建。该方法可以进一步包括将所述抽象语法树存储在所述数据存储器中的步骤。所述创建抽象语法树的步骤进一步包括从所述抽象语法树上提取声明元素,并将之存储于数据存储器中。所述声明元素是利用多个挖掘进程从所述抽象语法树上提取的,所述多个挖掘进程对所述抽象语法树进行挖掘以识别该树中的声明元素。所述每一声明元素的属性还可存储在所述数据存储器中。所述方法可进一步包括将分析数据存储于所述数据存储器中,所述分析数据涉及如何使用以及在何处使用所述代码的元素。将所述代码转换为抽象语法树的步骤可以进一步包括将所述抽象语法树保存到数据存储器中。所述方法包括将关于所述代码的元数据存储于所述数据存储器中的步骤,可以将所述元数据人工写入数据存储器中,所述元数据可以包括关于所述代码的原始语言和/或所述不同的编程语言的信息,所述元数据可以包括关于所述代码的原始语言和/或所述不同的编程语言的内建组元的信息。所述元数据还可以包括涉及重建的另外的信息,例如所需可维护性、经转换的代码的运行时复杂性和效率。可替换地,或另外,可以使用多个挖掘进程,从所述抽象语法树上提取所述元数据,该挖掘进程可以对所述抽象语法树进行挖掘,以便确定代码的元数据。所述重建进程可包括以下一个或更多个对循环加以识别并重建为期望循环结构的进程;对特定可执行段加以识别并重建为更精细结构的进程;对所述抽象语法树中的GOTO语句加以识别,并重建树以移除这些语句的进程;对该树中的成组节点的复本加以识别,并重建以便将该组节点创建为函数或过程的进程;对一个或更多个变量的作用域加以识别的进程;对所述抽象语法树中的特定节点组加以识別,并重排这些节点的结构的进程;对所述抽象语法树中的特定节点组加以识别,并替换这些节点的进程,例如使用函数调用;将数据结构改变为第三标准形式的进程;遍历该树以识别界面的进程;以及遍历该树并分析变量的用途,以改进其变量类型的进程。所述方法可进一步包括编写所述待在抽象语法树上运行的重建进程。所述方法可进一步包括对存储于所述数据存储器中的信息执行审计,以识别有无信息丢失。所述自动运行在所述数据存储器中识别出的重建进程的步骤,还使用存储在所述数据存储器中的与代码相关的声明信息和元数据信息。所述进程可以同时运行。所述自动运行配置进程的步骤,还可使用存储在所述数据存储器中的与代码相关的信息。对转换后的代码的评估基于以下任意一项或更多项所述代码的秩复杂性;代码的行数;已被替换的进程的数目;转换后的代码的人工评估;以及配置后的代码的准确性。所述评估转换后的代码的步骤,可以以所述抽象语法树为基础。所述评估转换后的代码包括生成异议报告,所述异议报告识别所述转换后的代码中可能无法产生所需结果的部分。在评估转换后的代码之前,所述方法可包括将所述转换后的代码存储于所述数据存储器中的步骤。这可能包括将该方法前一次迭代的转换后的代码替换为最新版转换后的代码。所述数据存储器是同一数据存储器。本发明的第十方案为一种能够执行依据本发明第八方案的方法的应用软件。本发明的第十一方案为一种被编程为执行本发明第八方案的方法的计算机系统。该计算机系统用于转换代码,该计算机系统具有输入工具,用于接收所述代码;存储工具,用于存储应用软件和接收的代码;以及处理工具,用于使用所述应用软件执行本发明第八方案的方法。所述计算机系统进一步包括用于存储以上所述信息的数据存储器。现在将参考附图描述本发明的最佳方式,其中图1为转换系统的组元的原理图2(a)至图2(c)为本发明的技术处理的流程图;图3为转换引擎;图4为IF语句节点的需要的结构;图5为由两行C代码创建的语法树实例;图6示出C代码片段的分析;图7为基于相同的两行C代码,使用本发明创建的标准树的实例;图8为知识库类层次结构的实例;图9示出逻辑树的实例;图10为伪代码的实例;以及图11为转换为C语言的伪代码。具体实施例方式本发明一个方面的方法包括重复执行的多个步骤。每次迭代的目的在于尽可能地生成质量最佳且配置准确的代码。只有自动化的树重建和配置不使迭代成为可能。如果这些步骤是人工进行的,那么即使可以确定更好的方法或较佳的结果,转换的重复步骤也会由于成本和时间问题而有所限制。迭代方案通过在每次迭代时对转换的代码进行改进来保证最可行的转换代码.进一步地,即使配置进程已经开始,也可以实现对转换的代码的要求。现在参考图1描述转换系统的组元。转换引擎划分为迭代执行的三组串行进程。输入处理组元20对输入语言进4亍词法分析(lex)并解冲斤为一组语言符号(token)和抽象的逻辑树。语言符号被应用于变量和操作符(operator)。操作符和变量为开发的广谱语言(WSL,widespectrumlanguage)的一部分,该语言实际上是现有语言的父集。所有组元都存储在知识库中,供多个进程同时访问。增强处理器(enrichmentprocessor)组元22存储由称作遍历器(walker)的小型代码组元执行的多个进程,这些小型代码组元具有这样的能力穿行于标准树(StandardTree),并执行多个任务,例如针对信息对树进行挖掘,对树进行重建以及将树配置为另一种语言。所有的重建都限制为格式转换,这允许在不改变功能的情况下进行重建。重建的实例是依赖于在前执行的程序中的其它语句,识别出GOTO语句可以转换为DOWHILE语句。输出处理组元24遍历重建的标准树和知识库,以目标语言生成可配置的代码。所有处理可以在计算机系统的一个或更多个处理器上执行。计算机系统具有能够安装的、使处理器执行本发明的方法的软件。计算机系统包括接收代码的输入工具,例如能够接纳存储有代码的CD或可以接纳存储有代码的便携式硬驱动的CD驱动器。计算机系统还包括像Quipoz知识库(下面进一步详细描述)一样运行的合适的存储工具。该存储工具对例如执行该方法的软件、待转换的代码以及转换过程中的代码进行存储。该计算机系统可以包括分立的计算机,这些计算机都具有可以在其上交叉分配本发明的处理的处理器。遍历器知道在元数据知识库(meta-datarepository)中指定的元数据需求(metadatarequirement)t这使得可以在迭代之间对转换目标进行动态地重新限定。图2(a)至图2(c)是转换系统对应用程序进行转换时所使用的技术处理的流程图。这些处理通过釆用独特的组元实现各自的目标,以下对这些组元进行更充分地描述。首先必须对源进行采集30=可以采用多种不同的格式将应用程序源发送到转换系统。多lt普通的语言,例如COBOL,是完全顺向的一这些语言的每个程序是作为一个文件接收的,每个程序包含该程序运行所需的所有信息变量定义、文件关系等。这种语言称作"以程序为中心的"(Program-Centric)语言。其它语言,尤其是4GL,就不是这么简单了。通常,译码器(coder)使用集成的开发环境,其包括为用户定制的屏幕,用于输入只对一个特殊功能特定的数据。客户端通常不会看到单一"程序"一而是看到一系列组元。由于转换必须使用程序列表(这种程序列表本身不可编译,且经常缺少关键的关系信息,或具有遍布在代码中的注释),或必须尝试对保持在专用数据库中的信息进行译码,所以这些情况很有挑战性。在任一种情况下,都有一些预备工作。通常,所有程序的所有变量定义都存储在一个文件中;所有程序的所有代码存储在另一文件中;所有屏幕(screen)定义存储在再一个文件中,等。这种类型的语言称为"非以程序为中心的"语言。在两种情况下,信息都可以来自其它源。例如,数据词典文件,即使他们已经跟不上时代,但也可以提供一些有价值的信息。该进程中的下一步是进程分析32,其中对接收到的材料进行分析,以便确定动作的顺序(acourseofaction)。如果待转换的语言不是以程序为中心的,那么需要确定是否使用了程序列表或专用数据库。通常,需要将小测试程序发给它们所运行的客户端,从而可以确定在困难情况下该语言的动作。通常在该阶^殳为特定的转换建立属性文件(propertiesfile)。与其它阶段相同,该属性文件包含元数据,这些元数据告知进程所读入的是哪一种语言,配置的是哪一种语言,在哪里找到源代码以及使用哪一个数据库。对所有的工程,进程分析32几乎总是需要进行预处理。例如,如果使用程序列表作为源代码,那么需要进行预处理以便删除分页符和打印机命令。在少数情况下,为了更好地理解语言而使用预处理,以便利用客户端的编码标准。大多数预处理对于语言和源格式是特定的。接着,将各语言组元映射34到标准树。也就是说,需要理解每个语句和声明,并将语句和声明映射到标准树中的相应项目。例如,COBOL中的语句"MOVEATOB"是简单的赋值语句,它被映射为标准树上的这一类项目。下文再进一步详细讨论标准树。为每种语言组元创建36词法分析器(lexer)和解析器。为了对写出词法分析器和解析器的进程进行加速,这些项目通常以称作ANTLR的语言写成。然而,对于为转换系统接收图形表示的屏幕,除非是编码的,否则并不是这种情况。虽然可以在任意时刻制作词法分析器,但是用于对语言进行解析并同时建立标准树的解析器要等到将输入语言映射到标准树之后才能制作。这是由于待创建的标准树的结构改变了对语言进行划分的方式。这是本发明的语言解析器和标准语言解析器之间的关键区别之一。当输入语言进来时,标准语言解析器仅识别输入语言。创建的所有树的外表特征都与该语言相似。然而,本发明使用解析步骤对每个组元进行识别、命名,并创建标准树。作为例子,可以对使用在网络上免费获得的C解析器生成的树和本发明的树进行比较。两者都使用ANTLR创建,然而两者建立的树有很大的不同。标准的C解析器遇到输入源中的"("时,将该"("分类为左括号(LEFT-PARENTHESIS)节点。然而,本发明的解析器更深地挖掘该代码,确定该左括号是表示计算符号、区分待传递到函数调用的一列参数的开始、区分函数声明中的一列参数声明,还是数学等式中加括号的表达式的开始。进一步地,本发明的解析器一旦识别出特定左括号的作用,则确定在当前树中该项目所属的位置——可能不同于在C代码中物理地写入的位置。接着,对需要作为源载入进程的一部分的所有树遍历器(TreeWalker)进行识别38。有时,不可能由解析器完全生成标准树。这是由于在一些特定领域,输入语言与标准树差别极大,所以在一个步骤中直接映射为标准树过于复杂。在这种情况下,创建树遍历器,由树遍历器执行这一进程。由于这些树遍历器在输入语言格式中提取树,并将输入语言格式转换为标准树格式,因此这些树遍历器对输入源语言是特定的,且无法以任何其它输入"语言运行。可以在RPG语言中获取这样的例子。在RPG程序的声明部分,用于下面的程序调用的参数被存储在列表中。然后,在程序的逻辑部分,当存在对另一程序的调用时,调用参数的这些列表。然而,标准树需要将程序调用的所有参数与调用的程序本身相关联。由于这在解析时段很难进行,因此在解析之后采用树遍历器,由树遍历器获得所有参数列表,并将它们放入该程序的调用语句中。一旦写出语言解析器,并写出所有输入树遍历器,那么针对所有输入源40来运行解析器和树遍历器就是一个筒单的问题。该步骤可以配置为针对所有代码或仅针对特定的项目来运行(由InScopeltem控制)。本步骤的结果是将输入语言转换为以标准树来表示的广镨语言(WSL)。一旦将代码解析为标准树格式,则针对解析的代码运行挖掘器42,以便提取声明信息,并存储在知识库中。每个挖掘器仅针对特定的节点类型遍历标准树结构一一通常是声明节点类型。例如,存在一个在程序中查找所有方法声明的挖掘器,一个查找所有程序调用的挖掘器,一个查找所有SQL语句的挖掘器。然后,这些挖掘器将所有的声明信息存储于知识库中。该知识库保存所有命名的项目(例如变量),与它们的属性(例如长度、输入语言数据类型等)以及它们与其它被命名的项目的关系(例如拥有变量MyVar的函数Fxl,引用DBTabicClientDetails的函数Fxl)。一旦完成本步骤,就可以说已经载入了应用程序。下一步骤是识别和理解输入语言的所有内建组元("built-in"component)44。本步骤不需要在此运行,除非即将生成审计报告。有必要对语言的所有内建组元一例如,作为运行环境或语言的一部分所提供的函数进行识别。这些函数在4GL中很普遍。在转换之前,需要对它们进行识别,以便知道必须写入哪些内容。在运行任一审计报告之前也需要对它们进行识别,以便容易发现模块从源中丢失,或该模块是否是由源系统所提供的内建模块。在此需要识别的其它项目是系统常量和变量。例如,大多数语言提供一些全局变量一USERID就是一个例子。它可以在任何地方使用,但是程序员从来不需要对它们进行声明。这是由于它们是固化在系统中的,就像函数一样。全局常量的例子是COBOL中的词SPACES。再一次说明,需要对这些项目进行识别和理解,以便记录如何对它们进行转换的知识。一旦对所有的内建函数、变量和常量进行了识別44,就需要将它们插入到知识库中。通常,这是通过创建具有该系统的名称(例如LINC—GLOBALS)的模块,并将所有函数、变量和常量附到该模块来进行的。然后,当对该系统中的任意程序进行处理时,首先将该全局模块载入到作用域(scope),从而使该程序可以获得所有的变量、函数和常量。需要获取所有与输入系统相关的因素,并输入46到知识库中。获取的信息包括编译器选项;舍入(rounding)选项;字长;语言选项以及代码页数。在该阶段,需要理解语言中项目的作用域如何起作用。考虑以下语言之间的区别在语言1中,程序拥有一个屏幕,实际上在程序中对屏幕上示出的所有变量进行声明,并只是允许该屏幕使用该变量。所以,仅有变量X的一个定义。当更新程序变量X时,X的屏幕变量也得到自动更新。在语言2中,屏幕是独立于程序进行定义的,屏幕包含它们自身的变量。当程序决定包含屏幕时,则程序员必须声明该屏幕所使用的所有变量—所以,存在对变量X的两个声明。在这种情况下,具有名称X的程序变量与具有名称X的屏幕变量相配合。语言3可能与语言2类似,但是程序员不需要在程序中声明屏幕变量一系统假设是这种情况。语言4也与语言2类似一但是屏幕变量独立于程序变量。任何时候引用屏幕变量时,将该屏幕变量称作Screen.X,程序变量X仅称作X。为了正确处理所有这些不同的情况,创建各种语言的作用域载入器(ScopeLoader)48。为作用域载入器指定语言规则,以解决这样的问题,例如"我们有变量X,我们谈到的是屏幕变量还是程序变量"以及"该程序没有声明变量X,但在代码中使用了变量X,该怎么做?"。为了生成审计报告(我们是否需要对客户端说"我们没有X的定义",或仅在应该附到该程序的其它内容中定义变量X)以及为了对代码进行转换代码,理解语言规则,并正确地获得这些作用域载入器都是必须的。关于这个问题已经组装了知识库,从而有可能识别所有丢失的项目。审计报告完全脱离知识库而运行50—因此将所有信息载入到审计报告是很重要的。首先,运行称作引用解析器的进程。该进程查找对项目的所有引用,并试图找到正在讨论的项目。注意引用解析器使用针对源语言的作用域载入器进行该过程。如果引用解析器能够进行该过程,则将这两个项目进行链接。如果引用解析器无法进行该过程,则可能是由于以下三种原因中的一种今该项目是还没有被识别的源系统中的内建函数、变量或常量(参见步骤48);今由于某些原因,我们的早先进程中的一个没有起作用一一可能程序没有解析,或创建的树不标准,因此挖掘器无法正常完成它们的任务,或(如果已经建立了测试,测试结果表明不是这个原因);今客户端还没有提供相关的源。接下来,配置52元数据。在该阶段,已粗略知道如何转换该系统。已经写出一些转换组元,有一些还待写出一但是在该阶段,需要决定使用哪一个组元,并将决定^吏用的组元拖在一起。将简单的工程信息存储在该工程的转换属性(transformation.properties)文件中。其它信息存储在用于配置的控制程序中一该控制程序存储例如运行哪个树遍历器、卩吏用哪个作用域载入器、使用哪个声明记录器(DeclarationWriter)等的信息。然后,以输出语言写出54所有需要的"内建"组元一框架(framework)。如果输入系统具有表示"记录这个变量,用100乘,并显示为红色"的内建函数,则在输出代码中创建完成相同事情的函数。通常,在输入系统中建有15与40之间的任意个数的函数。一些是简单函数,如数据格式化。其它的较复杂,注意数据库访问或屏幕控制。执行为所有声明的项目获取并生成英文名称的一系列进程56。该步骤包括△域分析;△缩写词扩充和转换;△注释分析;△文件分析;以及△上下文分析。就含义和准确性对候选名称进行衡量。允许使用代理,从而使客户端可以影响名称的生成。这是一个迭代的进程,以保证采用最可能的名称。接下来,为内建函数写出BSD转换58。由于为BSD生成的标准英文不够详细,因此不能处理程序的内建函数。例如,函数的标准BSD生成可能表示为"调用内建函数DetermineNextRow",其使用参数CLIENT、DATE、CLIENTID被调用。这种表述不如"从具有主要关键字DATE和CLIENT丄D的表CLIENT中读取记录"的描述性强。由于内建函数被经常使用,所以通常给他们给定极其具体的转换,包含有很高的智能程度。理想地,当转换为一种新的语言时,会使用在该语言中固化的数据类型。然而,在不同的语言中,变量不会表现为相同的方式。以十进制数为例。如果将3.141乘以7.266,系统是将结果存储为22.822506,还是存储为22.822,或者存储为22.823由于每个系统的表现是不同的,因此必须要做的第一件事情之一就是创建与输入系统的数据类(dataclass)表现相同的数据类。一旦对具体的变量进行了分析,就可以说"在任何时候,只给该变量分配了l到IO的整数——它将在两种语言中表现为相同的方式"。在这种情况下,可以将该变量转换为输出语言中的标准数据类型60。然而,这必须按照变量基(variablebasis)针对变量进行。在一些情况下,可能永远无法知道已经使用的是什么值,所以总是需要使用模仿输入系统的数据类。接下来,写出正确仿真屏幕"艮告/程序调用所需要的框架62。这就是创建与输入语言表现相同的框架的时候。例如,输入语言是会话的还是非会话的?这需要框架去完成。一些程序是否发起了运行在背景中的异步任务?这也需要框架去完成。如果该系统在事务处理中停止运转,会发生什么?这还是需要框架去正确处理。然后为输入语言创建到输出语言的转换模板64。这些模板帮助识别需要什么样的树遍历器,以及来自输入系统的哪些声明信息必须传递到新系统中。并非总是创建转换模板,而是它们对语言的分析有极大的帮助。基本上当框架团队中的某人从输入语言中获得几个小程序,将它们人工转换为输出语言,并保证它们能够工作时,创建模板。通常它们将选择这祥的程序访问屏幕访问数据库表处理屏幕上的所有重复记录(滚动表格等)。一旦创建了模板,则转换团队就可以更好的理解如何对代码进行转换,并尽早发现转换过程中的潜在问题。写出需要用于转换代码的树遍历器66。在此要付出大量的时间和精力进行转换。一些能够对所有语言进行标准转换的公共遍历器已经被创建。然而,大多转换需要相当特定的转换,因此需要语言特定的(language-specific)树遍历器u对于所有工程,为了使代码在新的环境下运行,存在必须要进行的转换。除此之外,为了使代码更简洁,或更面向对象等,可以进行一些提高。后面将对树遍历器进行进一步详细的描述。接下来,改换所有声明项目的名称68。所有的程序、变量、文件等都需要输出名称。对于BSD,转换系统使用生成的英文名称(EnglishName),对于所有其它的转换,该系统使用目标名称(TargetName)。使用多个进程确定如何生成目标名称。即使是在创建合法名称之后,还称符合输出语言的命名标准和需求。例如,Java不允许在方法或类的名称中出现破折号"一"。然后使用同音异义字、同义字和唯一性的算法,以保证以输出语言正确生成候选名称。在以上讨论中已提到转换控制程序,但是直到对所有的树遍历器都进行了识别和处理,控制程序才能结束。这由对转换控制程序的设立来完成70。这些控制程序包含各个待运行的树遍历器、待使用的作用域载入器、待使用的数据类型助手(DataTyperHelper)、待使用的声明记录器(DecalarationWriter)以及待使用的逻辑记录器(LogicWriter)的名称。可以将新的变量声明72写入到它们自己的文件(或类)或写入与程序、屏幕或报告逻辑相同的文件中。变量声明使用数据类型助手(DataTypeHelper),以便知道如何对不同的数据类型进行改换并声明。接下来,为输出语言创建屏幕XML文件74。运行进程,以便生成包含关于所有屏幕变量的信息的XML文件。该信息用于在屏幕和程序之间进行映射。然后为每种不同的输入语言写出屏幕创建器。然后创建针对输出语言的DB表类76。通常,每个数据库都有它们自己的输出文件。该进程是相当标准化的一然而,在此可能有不同于输入系统的多个内建方法需要创建。所以,对大多数转换,表格和它们的列的声明是公共的,然而,关于这些表格,可获得的方法的声明会针对各输入系统而改变。接下来,创建针对输出语言的文件类78。文件,像数据库表,的声明是相当标准化的,但是可能需要增加输入语言特定(input-language-specific)的方法。创建针对输出语言的任意重复屏幕表格〔RepeatingScreenTable)的类80。如果使用了BSD配置,则不需要本步骤一然而,对于任何运行的系统,明确地需要这些类。重复屏幕表格一除非已知为在屏幕上显示的可滚动的子文件一很难进行转换。每种输入语言都有定义和处理这些项目的不同方式。一些语言明确地检查并处理每一行;在其它语言中,每一行都是由系统暗中处理的。当前,创建类来匹配这些重复记录,对于输入语言是极其特定的。然后创建报告82,这些报告包括输出语言的报告XML数据和输出语言的报告格式。接下来,写出输出语言所需要的声明信息84。程序被划分为两部分声明信息和可执行逻辑。声明信息存储在知识库中,可执行代码存储在树格式(作为知识库中的BLOB)中,使用知识库信息为每个程序/模块写出声明信息,且以输出语言期望的方式写出。每种输入语言具有不同的内建函数和不同的系统变量等,因此,当写出输出语言时,必需继承不同的基本类。由此,在每个输出程序的顶端,各输入语言需要不同的声明。生成针对输出语言的程序逻辑86。这通常是转换的最容易的部分。树遍历器已将代码模块化为输出语言解析器可以处理的内容。配置器只是走下树,并写出它所看到的。接下来,生成BSD树88。根据保持在知识库中的声明数据(DeclarationData)生成BSD巡戈树(BSDNavigationtree)。该进程可以基于COBOL风4各的知识库而运行。由BSD解析器生成的代码中具有需要的所有信息,但是没有格式化。BSD进程的最后步骤是仔细检查所有生成的代码,并将其布置为可在web浏览器中查看的代码90。接下来,生成所有输入代码的HTML化的版本92,内舍BSD。进程仅将所有的文本代码作为输入,并将它们显示为HTML屏幕。最后,重复步骤38至卯,直到实现转换目标。图3中示出的转换引擎包括使用特殊软件工具的多个进程。对于整个转换进程,可以认为这些工具或组元是通用的,它们由特定的进程调用来实现应用程序的转换。现在将详细描述标准树。首先,树结构存储关于应用程序的信息。必需对语言的每个组元进行识别并定义。通过将各组元减少到其基本含义,本发明能够增大语言中的句法区別,并将各语言变成通用的形式。在标准树上记录有两种完全不同类型的信息包括所有被命名的项目(例如程序、变量、函数、命名的循环、段落等)的声明信息,以及该项目可能具有的所有属性(长度、作用域、可见性、英文名称、描述等)。已对各项目的每个可能的属性进行了定义,因此标准挖掘器进程能够检索所有相关的信息,并将其存储到知识库中。逻辑包括组成程序的可执行段的实际语句。每个语句类型已进行了识别,并将语句的结构映射到树中。是语句节点的结构以及节点类型和节点文本记录了所需的信息。例如,参考图4,在IF语句节点之下总是有带着"IF"的节点文本(Node-text)的条件节点。还可以可选地具有带着"IF,的节点文本的动作节点(Actionnode),且可选地具有带着"ELSE"的节点文本的动作节点。节点结构各节点具有以下属性。节点类型(NodeType)该属性表明该节点是IF语句(IF—STMT)节点,还是变量声明(VARIABLE—DECLARATION)节点等。节点类型控制节点本身的结构。例如,具有IFSTMT的类型的所有节点必需符合以上所示出的结构。今节点文本(NodeText)节点文本存储有关节点的第二信息。有时节点文本充当子类型——例如,ACTION可以是"IF"动作,或"ELSE"动作等。在其它时候,节点文本充当到源语言的链接。例如,在语言LINC中,IF—STMT编码为"DoWhenx=10…Code,..End"在这种情况下,IF—STMT节点具有"DoWhen"的文本。今行号(LineNumber)这是来自输入的源语言的行号。其可用于将树结构向后联系到输入源语言,特别是在调试时使用。为了编码的目的,各节点是为本发明所开发的标准节点的例子。该标准节点类包含以上列出的所有属性,增加将该节点链接到树所需要的属性一父标识(ParentID)、子标识(ChildID)等。除此之外,标准节点类包含有助于树遍历和配置进程的方法。下面解释标准节点。冲示准节点(StandardNode)标准节点是用于模仿标准树(StandardTree)上的各个节点的类的名称。其包含令带有关于特定节点的信息的若干个属性;令将该节点链接到树中正确位置的若干个属性;今用于获取与该节点有关的信息或对该节点进行操作的若千个方法。标准节点包含以下属性节点类型一例如IF一STMT;行号(是指来自输入源代码的行);标志一其可由树遍历器设置,以表示必须对该节点进行修改;标识(ID)以及ParentID、ChildID、左兄弟节点标识(LeftSiblingID)和右兄弟节点标识(RightSiblingID),以便将该节点链接到树中的位置。标准节点包括方法一即每个节点知道如何进行以下处理——例如获耳又下一兄弟;获耳又父;获取第一子;使用特定的类型或文本或两者,查找第一子节点;使用特定的类型或文本或两者,查找第一父节点;使用所有链接制作自身的拷贝;使用所有向下链接(lowerlink)制作自身的拷贝;从树中移除自身;使用另一个替换树中的自身;增加新的子或兄弟标准节点;增加新的子或兄弟节点QS,并向新的标准节点传输控制;查找第一非注释的子或兄弟节点。当创建转换树遍历器或树挖掘器时,几乎普遍使用这些方法。每个节点类型所固有的是其节点结构。例如,IF—STMT结构是其必须有条件(CONDITION)节点,并且能够可选地具有两个动作(ACTION)节点。以文本文件的形式存储该节点结构。是该结构的知识使得该系统能够对节点进行操作,并对树进行遍历。可能对标准节点进行扩展,使其具有对各节点类型特定的节点类。这将影响变量(Variable)节点,例如,存储只对变量特定的信息,并包含仅对变量适用的方法。在这种情况下,变量节点类型会知道变量可接受的结构。而且,可能对标准节点进行扩展,从而可以将更多的转换(Transformation)信息附加到该节点——例如"这一个可能是去拷贝(deduplication)的候选",或"该方法是从三个位置引用的",等。现在将对基于代码处理标准树的一个实例进行描述。大多数解析器只识别在语言中使用的词和符号,且将它们放入树格式一一语法树。当生成该树时,这些解析器不使用任何智能——它们仅输出它们所看到的。另一方面,本发明的解析器在建立树时,向该解析器嵌入了一些智能。本发明的解析器既能识别语言的词和符号,还能进行以下处理将这些符号转换为标准定义,确定项目在语言中的那个位置所起的作用,并在树上创建额外的元素,以便用符号表示概念。为了说明解析器的以上处理,考虑以下C代码片段的例子,并比较可根据该代码创建的两个树由免费获得的C解析器生成的语法树和由本发明的解析器创建的标准树。Varl+=abc.varX*2;calculate(varl》图5示出了由标准C解析器建立的语法树。对第一语句的子树进行了充分扩展。而没有对第二语句的子树进行扩展。关于该树,注意以下几项尽管两个语句是很不同的语句,但是都开始于相同的节点nSatementExpr。在C代码中已出现过的符号照1衣原样一例如STAR和D0T。没有关于这些符号实际上表示什么的暗示。除非a.你知道该树表示C程序,并且b.你了解C语言,否则该树的结构基本上是无意义的。通过比较,本发明的解析器创建对语言的每个组元进行标识和解释的标准树,且不管输入的源语言是C或RPG或其它,该标准树的子树都具有相同的格式。为了创建这样的标准树,解析器必须具有输入语言的每个组元的知识。图6基于样本C代码示出该处理的第一步。接下来,创建该解析器的人将这些语句映射为标准树格式,以确定应该为每个组元创建什么类型的子树。该格式对于所有的语言是标准的,从而使其与源语言最初是表述为Var+=abc.varX*2还是Add(2*varXofabc)toVarl都无关。一旦将该语言映射到标准树格式,则正在写解析器的人就保证创建的树与标准树所需的树相匹配。得到的标准树如图7所示。此时,可以以多种方式使用该标准树。由于对所有的组元进行了命名,因此易于实现分析。例如,通常必需查找变量在代码中设置的所有位置。这可以通过查找在目标节点(Targetnode)之下出现的所有变量节点来实现。易于实现增强。通过多次遍历标准树,将信息存储于知识库中,并检索知识库中的信息,可以将信息添加到树上,或在树上移动信息。例如,可以将额外的信息,例如变量的类型或变量长度,增加到变量节点上一这些信息是存储在知识库中的信息。也易于实现到另一种语言的配置。各语言配置器知道如何以其目标语言写出赋值语句。知识库(Repository)知识库的目的是令获取应用程序的所有声明元素;今存储所有可执行代码及拥有这些可执行代码的声明项目;今存储不同声明项目之间的关系;令激活数据的分析;今记录针对工程的元数据。为此目的,在知识库中存储三种类型的信息(i)声明数据(DeclarativeData);(ii)分析数据(AnalyticalData)以及(iii)元数据(Metadata)。(i)声明数据声明项目可以是程序、或变量、或屏幕等。所有声明数据可以具有与其关联的可执行代码(对变量的初始化代码;对屏幕的合法化代码;针对程序的逻辑),以及在应用程序中,所有内容都必定与某些其它内容有某种联系—例如,程序可能拥有变量,以及程序可能引用另一程序。所有声明项目被称作对象。它们都存储在称作对象节点(ObjectNode)的数据库表中。有些内容是所有声明项目所共有的,例如名称和类型。对于所有声明项目来说为公共的内容存储在对象节点表格中,即输入名称(I叩utName)、目标名称(TargetName),EnglishName(英文名称)等。将附由于大多数语言允许存在相同名称的多个项目(例如,如果它们在不同的库或路径中),因此所有表格,包括对象节点表格,都由对象节点标识(ObjectNodeld)来标识。对象节点必定是几种不同类型中的一种,这几种类型包括模块(程序、函数、方法、段落等)、变量、屏幕、文件、表格、报告等。在这些表中存储与特定对象节点类型相关的所有详例如,变量表存储了输入数据类型(InputDataType)和目标lt据类型(TargetDataType)。不同对象节点之间的关系由对象节点关系表(ONR)来表示。ONR表存储了所有交叉引用及它们的类型。例如,该关系是拥有者(OWNER)关系(在没有拥有者的情况下,被拥有的对象是不存在的)还是引用关系(这象可以在对方不存在的情况下存在,但是可互相引用)?知识库被设计为记录任一声明项目的所有属性。然而,通常在新的语言中,有些不被充分理解或看起来不相关的属性。这些属性仍然要记录,但是由于它们不符合我们的任意一种标准属性,所以没有可以存储它们的列。在这种情况下,将这些信息存储在附到目标节点表(ObjectNodetable)的额外详情表(ExtraDetailstable)中。该额外详情表仅存储关键字、详情及目标节点所引用的Id。关于数据库可获得多种视图,以便容易提取通常需要的信息,并使老式数据库与该数据库之间的过渡变得容易。例如,极普通的需求是查找应用程序中的所有方法。为了从表中选择这些信息,需要目标节点与模块之间有关联,以便查找程序模块(ProgramModule);需要从程序模块到引用的关联,然后需要从程序模块返回到目标节点和模块的关联,以便找到方法模块。这已经由单一观点,程序方法所替代。分析数据(AnalyticalData)分析表格(analyticaltable)用于记录关于如何使用对象以及在哪里使用对象的信息。所存储的分析数据包括引用一一程序A调用程序X,以及程序A使用表格Z。这些表格可用于记录更多的分析信息,以便正确分析变量的使用、数据类型、代码拷贝等。该分析信息包括☆变量在何处使用或被赋值;☆何时出现没有被赋值的待审计的变量;☆何种不同类型的引用被传递到程序/函数;☆在何处对表格进行更新/读取。(ii)元数据现在,知识库中有两个元数据表数据类型转换表(DataTypeTranslationtable)针对所有语言,存储关于所有数据类型的信息。作用域内项目表(InSc叩eltemtable)控制由哪一个任务来处理哪一个对象。元数据能够记录元数据中的能够驱动进程的所有信息。信息访问和修改(InformationAccessandModification)下面的工具使用了信息存储组元的唯一结构。对知识库进4亍访问(AccessingtheRepository)很明显,有访问知识库的两种方法人工或程序化。人工访问知识库实际上只适合于实现选择,或用于实现简单的数据更新。数据库的标准化水平以及自动生成的ID的使用意味着很难通过人工SQL语句向数据库表中插入信息。已在数据库中创建了大量的视图,从而使人工查询易于管理。程序化地访问数据库很容易。当使用类访问数据库时,重要的是理解类和数据库表之间的关系。数据库中的各个表由类表示。每个类知道如何自动保存/更新/删除自身,以及如何处理任何结果错误。已经在每个类中提供了方法,以使程序员能够容易地表示"该变量是由那个程序所拥有的"等。然而,还不止这些,每个类可以控制多个表格。知识库类层次结构示于图8中,其中数据库表是较小的框,类是较大的框。模块类不仅可以控制模块表格,还可以控制对象节点表。这对于所有声明项目表格、变量、屏幕、模块、文件、记录都是正确的。表示这些项目的每个类能够控制对对象节点表、额外详情表和描述表的访问。此外,变量类(Variabledass)还能够控制对修正器表(Modifiertable)和矩阵维度表(Ai'rayDimensiontable)的访问。变量类中的一个单一方法能够更新/插入/删除这些表中的行。知识库数据访问对象(DAO,RepositoryDataAccessObject)类对大量的通用SQL进行压缩,且可以由程序员获得并使用。通常,这些SQL为以下格式检索/插入/更新/删除所有行(Retrieve/insert/update/deleteallrows)今检索/插入/更新/删除具有特定ID的行(Retrieve/insert/update/deletetherowwithaspecificID)检索/插入/更新/删除具有特定输入名称的行(Retrieve/insert/update/'deleteallrowswithaspecificInputName).树遍历器"树遍历器"是给遍历标准树并实施指定的任务一通常以某种方式转换该树一的一组进程的通用名称。树遍历器对于单个任务是极特定的一例如,一个树遍历器可以解析GOTO语句,另一个树遍历器可以限定变量名称,等。树遍历器可被写为以下任一种对输入语言是特定的,在有输入语言特色的树上工作;对输入语言是特定的,在通用树上工作或通用的。对于任一转换,经常需要从树遍历器的所有三种类型中进行选择。尽管事实是他们作用于不同的树,但是,每个树遍历器在结构上基本相同。每个树遍历器扩展了一称作遍历器的类,并具有称作遍历(walk)的基本方法。树遍历器本身并不是主程序,而是由另一程序调用的,该程序将待由树遍历器转换的树传递给树遍历器。各个树遍历器递归向下经过树结构,同时检查每个节点,直到发现感兴趣的一个节点。当树遍历器发现感兴趣的节点,就马上针对该特定节点执行必要的动作,并继续前进。各个树遍历器会向调用程序返回新的转换后的树。可以根据需要将树遍历器写成特定的或通用的。它们可以完成的任务小到改变函数的名称,大到对节点的部分进行完全重新排序,或创建新的节点。树上的每个节点为标准节点的例子,每个节点可以是另一子树的根。树遍历器以下列四种方式中的一种,在树上巡戈并进行必要的修改☆通过使用在任一标准节点上可获得的方法一标准节点;☆根据特定节点类型的固有结构的编码器的知识;☆通过使用节点助手(NodeHelper),该节点助手知道特定节点类型的确切结构,并提供用于获取信息和转换该结构的有用的方法;或☆通过使用向标准节点增加功能性的任意一种搜索和检索方法。该标准节点类提供一些标准方法,供树遍历器使用。该标准节点包括巡戈树遍历器以及修改、创建或删除新的节点和子树所需的所有方法。对于所有不同的节点类型,这些方法是标准的。由此带来的问题是,尽管每个节点有多种方法,但他们都是极通用的。没有标准节点知道他的子树结构应该像什么。例如,正如上面所述的每个单一节点类型具有特定的结构。通用节点类不知道特定类型的结构,因此无法提供基于该结构的方法。例如,通用类不会知道如果节点类型是IF一STMT,那么预期在该节点下有I个条件(CONDITION)节点和可选的两个动作(ACTION)节点。树遍历器以下面两种方式中的一种克服了这个问题一或通过将该结构编码为树遍历器,或使用Helper。如果编码树遍历器的人知道任意给定的节点类型的结构,则他们能够相应地进行编码。大多树遍历器已被写为对具体的节点结构进行预期。然而,有时节点知道自身的结构并具有对具体节点类型所特定的方法是有用的。例如,在调用模块表述(InvokeModuleExpression)中(除非已知为函数调用),树遍历器可能想获取所有参数的列表,或对参数的数目进行计数,等。这些方法对调用模块表述是特定的,所以在标准节点中还没有实现。助手的概念是它提供特定的节点,并提供转换该节点必需的所有方法。助手节点确切地知道特定节点的结构必定像什么。此时,树遍历器必须知道节点的类型,以便确定调用哪个助手。可替换地,助手厂商(HelperFactory)将着眼于任一节点,并提供带有正确的助手的树遍历器。除此之外,定义了额外的树巡戈和搜索类。这些可使用在更特定的转换中,例如OS2C到WindowsC的转换。树遍历器既使用助手,还使用可在标准节点类中获得的标准方法,在树上移动数据,并对该结构和内容进行修改。另外,它们可以针对关于命名的项目的额外信息,查询知识库。如果解析器不能创建标准树格式,或如果需要阐明挖掘器所需要的信息,那么树遍历器只被应用于输入处理。一般来说,在输入侧,最好是能保持代码与其输入语言尽可能的相似。在转换侧是所有的其它树遍历器一增强遍历器和转换遍历器。以下是现有的树遍历器的列表,以及它们所做工作的简单描述:<table><row><column>R'ommonGotoExitNameWalker</column><column>搜索仅前进到模块的退出点(exit-point)的所有GOTO语句,并将这些语句变换为RETURN—STMT。</column></row><row><column>rommonModuleComment—Walker</column><column>搜索直接位于模块声明之前的所有注释块。假设这些注释实际上是描述该模块的,所以同样将它们附到该模块</column></row><row><column>Common—PromotelMEName—Walker</column><column>提取调用模块表述(InvokcModuleExpression)节点UMH).并根据提供的列表检查它们的名称。如果该1ME名称在列表中,则将指定的参数增加为名称的一部分.这有效地从格式方面改变了IME,例如从write(myFile,"hello")改变为myFile.write("hello,,)</column></row><row><column>CommonGOTOWalkers</column><column>试着以任意种方式角年析GOTO语句</column></row><row><column>CoinmonJVloduleOutOfScope—Walker</column><column>使用调用框架方法替换它们,将错误记入日志。这在Java转换中使用,所以如果代码试曰志。</column></row><row><column>CommonRemoveMainAction—Walker</column><column>很多输入语f没有附在程序中的"main"代</column></row><table><table></column><column>码一相反,所有的代码包括在方法中。这是4GL的典型,4GL应用程序固有地知道首先调用哪个方法,所以在代码中没有执行实际的调用。该遍历器查找空的程序动作(ProgramAction),并删除它们。</column></row><row><column>CommonReverseQualifiedNameWalker</column><column>合格的名称是给出关系A.B或A的B的词.合格名称(QIMLFIF"—NAME)节点的結构需要第一个NAME节点是第二个NAME节点的拥有者。然而,有时这在解析过程中不容易实现。所以,在解析输入语言的过程中,当合格名称节点杂乱无序地出现时,使用该遍历器。</column></row><row><column>C'ommonSelfAssignmentWalker</column><column>这是增加类型遍历器。其查找数学等式的所有例子,其中也在该计算(例如,X-X十l)中使用TARGET,且将它们变换为X+=1的格式。可以使用在任何语言中。</column></row><table>其它遍历器可以对输入语言是特定的。在一些例子中,已经开发了对节点进行简化的树遍历器。例如,可能有经常#1行的两行、三行或更多行代码的组,这些代码实际上应该;故转换为函数或转换为不同类型的语句。这种树遍历器对于语言是极特定的。可替换地,遍历器可以被写为提取代码模式的列表和替换代码模式的列表,并且自动进行这些类型的转换。以下是增强遍历器的简单描述<table><row><column>BooleanVariableCheck布尔变量检查)</column><column>(当输入语言没有布尔数据奖型时,在代码中通常有像'IFX="TRUE"'这样表示的条件。其能够修改为使X为布尔类型,并将比较转换为"ifX"的表示。该树遍历器需要使用由变量使用挖掘器(VariableUsageMiner)考口变量值-挖掘器(VariableValueMiner)</column></row><table><table>complextableseeoriginaldocumentpage41</column></row><table>树操作工具(TreeManipulationTools)以树格式存储所有可执行代码。为了操作这些代码,并将这些代码转换为期望的输出,下面是用于辅助的多个特定方法。(i)节点助手节点助手是匹配节点类型的类,知道节点的结构,且包含用于使用和转换该节点的很多有用的方法。当他们在一个地方保存了该节点的结构的知识时,节点助手尤其有用,所以可能容易地实现向该节点结构的转换。节点助手的例子是今NodeHelperIME今NodeHelperVARIABLEDEFINITION今NodeHelperPARAMTERS今NodeHelperMULTIPLEDEFINITION(ii)节点穿行器(NodeTraverser):节点穿行器是以特定方式在树上行进的简单类一一或是从它们开始的地方向上或向下,或是首先向深度前进,或是首先向兄弟节点前进。通常这些穿行器在自身携带访问者(Visitor)类。以这种方式想象该穿行器是走特定路线穿过树的公共汽车。在每个节点,公共汽车停下来,访问者下来,完成了他应该完成的一些任务,然后回到公共汽车上,并向下一节点行进。这些穿行器的例子是今后代芽行器(DesendantTravcrser)今祖先穿行器(AncestorTraverser)今树芽行器(TreeTrav-erser)今兄弟穿行器(SibiingTraverser)(iii)如上所述的访问者,访问者是有任务要完成的类。它们由穿行器携带着在树上行进,并在每个节点完成它们的任务。通常访问者只检查每个节点,看该节点是否是它所感兴趣的那个。如果是,则完成对它们进行编码时要求它们完成的所有任务。否则,访问者只继续前进。访问者可以创建为查找首个(FindFirst)访问者,一旦完成其任务,则使公共汽车停下来;和全查找(FindAll)访问者,其会一直前进到线路的末端。(iv)过滤器(Filter):过滤器是检查该节点是否是感兴趣的节点的类。通常,当将访问者派遣到穿行器上时,会为该访问者给定过滤器,如果该节点是应该查看的,则该过滤器返回True,否则返回False。存在以下过滤器类型过滤器(TypeFilter):仅针对其被告知搜索的节点类型,检查节点类型。类型文本过滤器(TypeTextFilter):针对其被告知搜索的节点类型和节点的文本,检查节点的类型和节点的文本。(v)树挖掘器(TreeMiner):—旦将输入文本解析为标准树格式,掘器。在知识库中存储了三种类型的数据声明信息(DeclarativeInformation)分析信息(Analytical[nformation)元数据。元数据被人工插入到数据库中。声明信息基本上是被命名得任何内容得定义。该内容可以是变量,程序,方法、屏幕等。分析数据是关于任一对象的使用的详情。通过挖掘器,将声明数据和分析数据都载入到知识库。挖掘器是基本上只反复向下经过树结构,直到找到感兴趣的节点的程序一例如,变量定义(VariableDefinition)。一旦挖掘器找到感兴趣的节点,就尽其所能取到关于该节点的所有信息(挖掘器通常知道感兴趣的节点的结构),并将该信息保存到数据库中。控制挖掘器的程序会保证项目被插入到作用域中的正确位置。也就是说,如果在程序中的方法中声明了变量,则在数据库中,该变量由该方法所拥有,该方法又由该程序所拥有。一般来说,一旦挖掘了来自声明节点的信息,则将该信息从该树上删除。这是由于既在树上存储项目的定义,又在数据库中存储该项目的定义时,会引起问题。树上的定义一旦被挖掘,就从树上删除,并且存储在知识库中的定义是经修改和经转换的定义。如果该项目附有任何可执行代码(例如,程序和方法既有声明信息,又有可执行代码),则以树格式将该可执行代码与该项目一起存储在知识库中。一旦将输入语言解析为标准树,则可以对其进行挖掘。所有程序解析器(Pi-ogramParsexxxx)类都会调用基本挖掘类(适当地命名为挖掘器),以便将最新解析的程序保存到数据库中。挖掘器会将该程序划分为声明部分和其可执行部分,将该可执行部分附到正确的声明部分,并将它们都保存到知识库。这意味着由声明节点和逻辑节点组成的整个输入树被划分为数据库中的多个对象节点(Ob.jectNode)(每个程序一个,每个方法一个),每个对象节点都附有其自身的逻辑树,如图9所示。以下是不同类型挖掘器的描述:<table><row><column>Miner</column><column>提取所有模块声明</column></row><row><column>被调用模块挖掘器(CallcdModuleMiner)</column><column>找到对函数、程序、方法等的所有调用,将这些调用载入到引用表格(Referencetable)中。如果被调用的方法对程序束说是当地,则其马上解算该引用。</column></row><row><column>屏幕挖掘器〔ScreenMiner)</column><column>查找所有的屏幕.执行、记录和屏幕域声明</column></row><row><column>变量挖掘器(VariableMiner)</column><column>查找所有的变量声明</column></row><row><column>变量使用挖掘器(VariableUsageMiner)</column><column>确定在哪里使用变量——赋值和引用</column></row><row><column>表格访问挖掘器(TableAccessMiner)</column><column>确定在哪里访问表格——更新.插入、删除</column></row><row><column>参数挖掘器(ParameterMiner)</column><column>提取调用模块时所使用的所有参数的详情</column></row><table>配置器(Deployer)当前,配置进程包括转换以及配置。每个目标语言具有几个独立的配置器变量配置器(variabledeployer)逻辑配置器表格配置器☆屏幕配置器☆报告配置器☆程序声明配置器变量配置器、表格配置器和程序声明配置器完全非除存储在知识库中的信息。它们载入待配置的项目及该项目所拥有的所有项目,并以目标语言写出这些项目的声明。依赖于初始输入语言,这些进程中的每一个有标准进程和稍不同的进程。一般来说,依据在接近每个转换工程开始时所创建的模板对这些进程进行编码。屏幕配置器和报告配置器也排除知识库,,然而,由于目前没有生成这些配置器的通用进程,因此它们的格式不是标准的。所有的程序配置都被称作配置引擎(D印loyEngine)的程序来运行,该配置引擎进行如下处理☆从知识库中读取每个程序模块的声明信息;☆创建每个程序模块的新文件;☆载入该模块的作用域(即获取该模块可能使用的所有变量、函数等);☆调用声明写作器写出声明;☆获取附到该模块的逻辑树;☆对树应用任一树遍历器;☆调用逻辑写作器写出该程序模块的可执行代码;以及☆查找附到该模块的所有子模块(例如,所有方法、函数等),并针对这些子模块重复以上的处理。程序逻辑配置器排除标准树。使用称作AN丁LR的工具开发程序配置器。逻辑配置器在对其给定的树上前进,并一行接一行地写出代码的各行。例如,当其到达IF—STMT节点时,java逻辑配置器知道写出"if〔",然后是条件,然后是"){",然后是动作,然后是"}"。逻辑配置器到达实体名称的任何时候,其使用该名称在作用域表中查找该实体,以便确定该实体的目标名称和数据类型。该配置通常使用项目的目标名称,从来不使用其输入名称。该进程是由表述类进行处理的一一对java酉己置,t述类是JavaExpression类。还存在运算符类,因此处理每个运算符类型。逻辑配置器知道运算符如何影响表述的类型(例如表述数l小于数2将导致布尔类型);且知道每个表述如何处理每个运算符(例如X=Y,如果X为固定长度的字符串,则写作X.set(Y),如果X为字符串,则写作X-Y)。程序控制器配置引擎本身是由工程控制器类来控制的。如果该工程是将CSP转换为Java,则会存在称作CSP到Java的配置器(CSPtoJavaDeployer)的类。该类包含了需要运行的树遍历器的列表,需要使用的声明写作器的类型和待使用的作用域载入器的类型等。增^增强阶段包括重要的自动化的代码重设计。在输入阶段,已获取了输入代码中的每个可获得的关于所有操作和变量的信息组元,并且还跟踪了用于重建是在增强过程中自动实现的。该重建的特征依赖于目标环境。如果目标是面向对象的,那么重建就设计为促进多层次OO设计(multi-tiered00design)的执行。这需要大范围的变量作用域分析。如果目标是例如COBOL的结构化的语言,则促进结构化的方案。在该增强步骤中的一些处理为☆循环分析☆混合升级的识别,例如嵌套的IF到CASE,GOTO到PERFORM语句☆剩余GOTO语句的删除今工作识别的单元☆"英文识别"("Englishification")☆组元识别变量作用域分析代码拷贝分析进程去拷贝提取数据模型建立目标模型(如果针对基于方案的目标模型)将组元转换为方法,并赋到目标模型Re-factor(如果针对基于方案的目标模型)界面识别和分析。增强是作为特征标记(tokenisation)之后的自动进程而进行的因为人工执行重建的付出和努力是有所限制的;以及如果没有以下处理的混合充分的解析和特征标记,以及输入到增强进程时由我们的输入处理器生成的去除语法的代码,则自动代码清除的效率很低。通常,构建不好的程序的测圓法复杂性被减少了大约80。/。。目标是使所生成的代码的测圓法复杂性(CC,cyclometriccomplexity)小于5.0。写得好的COBOL代码具有5-8的CC,这个无法得到显著的提高。另一方面,写得不好的代码的CC达到1000。如果CC很高,则很难生成好代码。通常,写得不好的代码具有达到8-100的CC,该CC可以降低到5-15之间。一旦对代码进行了分析和增强,就执行配置进程。在该进程中,将每个技术函数映射到目标语言和结构性函数。这常常需要重大的额外的重建。该执行的一些方面由工作分析单元和各种潜在方案所需的重建的复杂性所确定。结构性框架作为输出/配置进程的一部分,被从元数据级别映射到代码界面和泛函。目的是生成具有目标语言的格式和平台的代码。最终结果是在进程的每个阶段,在与目标体系结构的兼容性和依从性方面,将代码质量最佳化。如果没有频繁的分析和重建,则不可能生成具有期望的质量和可维护性的"灵活的"结构化方案。在更详细的程度,关键的事实是不需要建立完全(传统的)独立的语言作为转换的基础。现在将描述增强进程的实例。代码增强和转换一旦将源代码解析为标准树格式,就开始对代码进行分析和转换。由于树遍历器的格式的知识,对代码的分析和转换通常是由树遍历器执行的,从而可以对树进行搜索,查找特定的代码模式,然后就像所需要的,对所有实例进行转换。以下是转换和增强处理的例子的详情(Below-are-details-of-a-samploTi-ansfor-matien-and-Enrichment-{process:-)在一些古老的语言中,GOTO格式的分支语句是极普遍的,经常用于强迫代码一次又一次地循环,直到满足一些条件。这种类型的代码称作Goto伪循环。用于完成该处理的代码经常是冗长且未结构化的,从而使得对代码的读取和维护4艮难。较好的编码方式是使用循环结构执行相同的功能。这种代码的结构化更好、更易于读取和执行,并允许进一步的分析和对象化(objectification)。作为增强和转换进程的一部分,对所有的这种Goto伪循环进行识别'该进程有两部分候选项的识另U和转换。为了解释上述内容,考虑图10所示的伪代码的以下实例。识别进程包括以下步骤1.从GOTO语句开始GOTO伪循环的识别(a);2.查看该GOTO语句是否指回到代码中标出的语句(b);3.如果是,则着眼于条件(c),并识别控制元素。在上述情况下,控制元素为变量i。4.确认控制元素在标出的语句之前进行了初始化(d),以及5.确认在标出的语句和GOTO语句之间对控制元素进行了修改(e)。如果树遍历器确认所有以上条件都满足,则可以进行转换。可能发生一些转换形式上的变化,这依赖于GOTO伪循环本身的变化。例如,代码可转换为FOR循环,如果(代码3)中的代码没有使用控制元素,并且;(代码l)中的代码没有使用控制元素。否则,代码可以转换为标准的While循环。针对该实体的目的,我们假定可以^吏用FOR循环。为了将GOTO伪循环转换为FOR循环,可以对标准树进行如下修改1.创建FOR循环节点。2.将(d)中的语句从树上取出,并增加到新的循环开始(LoopStart)节点下面。3.将(e)的语句从树上取出,并增加到新的循环增加(Looplncremcnt)节点下面。4.将(b)禾口(c)之间的代码从树上移动到循环动作(LoopAction)节点。5.将(c)的语句从树上取出,增力口到新的终止条件(TerminationCondition)下面。6.将GOTO语句从树上移除。7.用新的FOR循环代替标出的语句(b)。转换之后,代码段可以读出为如图11所示。该系统使用其树结构,替代了完全独立的语言的建立。这是通过将所有内容映射到"标准节点"而操作的。对于在树遍历器技术中创建和配置结构化节点的进程,有六个链接的部分,在转换引擎中链接到输入、增强和输出进程之下。图3更详细地示出转换引擎进程。该进程由对应于下表中进程列表的编号的圓圈进行标识。方形阴影数字表示在特殊状态下可以使用。带有较暗阴影的方形的进程表示那些使用下面描迷的通用组元的进程。这些进程实现了转换泛函的关键元素——输入、增强和输出。该图列出了这些特别组元运行的上下文。其既示出了关键的自动化的进程,也示出了相关的人工进程,这些人工进程对转换引擎的步骤进行整理,从而使得应用程序从其已有的技术规定转换到不同的技术规定。虽然人工进程作为实现转换应用程序的最终目的的基本,在总体认识中很重要,但只是重要软件进程的外围,以便为进程带来高的自动化水平。本领域技术人员应该理解,在不超出宽泛地描述的本发明的精神和范围的情况下,可以对具体实施例中示出的本发明进行各种变化和/或修改。所以,在所有方面来说,本实施例仅是解释性的,而不是限定性的。术语表<table><row><column>过滤器(Filter)</column><column>过滤器是检查具体节点是否是感兴趂的节点的类。通常,'当访问者从穿行器上下来时,会被给定过滤器,如果该节点是感兴趣的节点,则过滤器会返回True,否则会返回False。</column></row><row><column>助手(Helper)</column><column>节点助手是匹配节点类型,知道其结构并包含用于使用和转换该节点的方法的类。助手记有在一个位置的节点结构,使得对该结构的改变容易实施。</column></row><row><column>挖掘器(Miner)</column><column>挖掘器是穿行于树结构,直到找到感兴趣的节点的程序。当找到这样的节点时,则收集关于该节点的所有信息,并将这些信息保存到数据库中。挖掘器知道其所感兴趣的节点的结构。</column></row><row><column>标准节点(StandardNode)</column><column>标准节点是用于模仿标准树上的每个节点的类的名称。其包舍带有关于特定节点的信息的多个属性;将该节点链接到树上的正确位置的多个属性;以及用于增加关于节点的信息或操作节点的多个方法,</column></row><table><table>标准树(StandardTree)</column></row><row><column>存储关于应用程序的信息的树结构。</column></row><row><column>WSL</column><column>广谱语言(Wide-SpectrumLanguage)</column></row><row><column>芽行器(Traversers)</column><column>穿行器是以特定方式在标准树上穿行的简单类一一向上或向下,或首先向深度前进,或首先向兄弟节点前进。通常,穿行器可携带访问者类。</column></row><row><column>树遍历器</column><column>树遍历器是遍历标准树,并执行特定任务的进程一一通常以某种方式对树进行转换。</column></row><row><column>访问者(Visitor)</column><column>访问者是具有特定任务要完成的类。它们由穿行器携带着在标准树上行进,在穿行器认为是感兴趣的节点的每个节点,穿行器就停下来,访问者会进行它的任务</column></row><table>权利要求1、一种创建包括多个节点的树的方法,该树待用于可执行代码到不同编程语言的转换中,该方法包括接收所述可执行代码;识别所述代码的每一可执行段;为所述代码的每一可执行段分配一个节点,其中每一节点属于一组预定节点类型之一,所述每一预定节点类型定义编程语言的一项唯一的通用可执行操作,每一节点的结构和内容由其节点类型定义的通用操作来确定;和链接多个节点以创建该树。2、如权利要求l所述的方法,其中所述唯一的通用可执行操作为对另一代码组元的引用;赋值语句;数据处理语句;条件语句;或循环语句。3、如权利要求1或2所述的方法,其中对于每一节点类型,其结构包括一个或更多个子节点,其中每一子节点属于一組预定子节点类型之一,所述每一子节点类型定义其通用可执行操作的一个可能组元。4、如权利要求3所述的方法,其中对于每一子节点类型,其结构包括一个或更多个再子节点,其中每一再子节点属于一组预定再子节点类型之一,所述每一再子节点类型定义其通用可执行操作的组元的一个可能子组元。5、如前述任一权利要求所述的方法,其中在该树中,所述可执行代码中使用的变量与定义变量的子节点类型相关联地出现在该树中。6、如前述任一权利要求所述的方法,其中在该树中,所述可执行代码中使用的数学等式与定义所述等式中使用的数学表达式的子节点类型相关联地出现在该树中。7、如前述任一权利要求所述的方法,其中在该树中,所述可执行代码中使用的常量与定义常量的子节点类型相关联地出现在该树中。8、如前述任一权利要求所述的方法,其中每一节点包括识別信息,例如分配给所述可执行代码中的可执行段的行号。9、如前述任一权利要求所述的方法,其中通过向每一节点分配链接信息来将该节点链接到该树上,所述链接信息与将该节点链接到该树上所需的其它节点有关,例如该节点的父节点和子节点的详情。10、如前述任一权利要求所述的方法,其中每一节点具有唯一的标识符。11、如前述任一权利要求所述的方法,其中每一节点进一步包括多个方12、如前述任一权利要求所述的方法,其中每一节点进一步包括一个标记器,该标志器能够由所述用于协助处理树的各种方法使用;例如,指示一方法在该节点上已经被执行。13、如前述任一权利要求所述的方法,其中所述方法进一步包括接收与所述可执行代码相关联的声明数据;识别所述声明数据的每一声明段;为所述代码的每一声明段分配一个节点,该节点属于定义声明的节点类型;以及将该声明节点链接到该树。14、如前述任一权利要求所述的方法,其中所述定义声明节点的节点类型包括以下任一个或更多个识别信息,例如分配给所述声明数据的行号;将该节点链接到该树的链接信息;有助于处理树的多个方法;以及唯一的标识符。15、一种建立解析器以创建包括多个节点的树的方法,该树待用于可执行代码从第一编程语言到第二编程语言的转换中,该方法包括针对所述第一编程语言,从以所述第一编程语言编写的代码中识别出定义可执行操作的语法;为识别出的语法分配节点类型,其中每一节点类型为一组预定节点类型之一,所述每一预定节点类型定义编程语言的一项唯一的通用可执行操作;每一节点类型的结构和内容由其节点类型定义的通用操作来确定;重复该方法,直至针对所述第一操作语言的所有可执行操作的语法都已经被识别并且都已被分配节点类型。16、如权利要求15所述的方法,其中所述唯一的通用可执行操作为对另一代码组元的引用;赋值语句;数据处理语句;条件语句;或循环语句。17、如权利要求15或16所述的方法,其中对于每一节点类型,其结构包括一个或更多个子节点,其中每一子节点属于一组预定子节点类型之一,每一子节点类型定义其通用可执行操作的一个可能组元。18、如权利要求17所述的方法其中对于每一子节点类型,其结构包括一个或更多个再子节点,其中每一再子节点属于一组预定再子节点类型之一,所述每一再子节点类型定义其通用可执行操作的组元的可能子组元。19、如权利要求15至18中任一项所述的方法,其中对于定义包括变量用途在内的通用操作的节点类型,该通用操作的节点类型被关联到定义变量的子节点类型。20、如权利要求]5至19中任一项所述的方法,其中对于定义包括变量用途在内的通用操作的节点类型,该通用操作的节点类型被关联到定义变量的子节点类型。21、如权利要求15至20中任一项所述的方法,其中对于定义数学等式的通用操作的节点类型,该通用操作的节点类型被关联到定义数学表达式的子节点类型。22、如权利要求15至21中任一项所述的方法,其中对于定义包括常量用途在内的通用操作的节点类型,该通用操作的节点类型被关联到定义常量的子节点类型。23、如权利要求15至22中任一项所述的方法,其中每一节点类型的结构包括存储识别信息的能力,所述识别信息例如分配给所述可执行代码中的可执行段的行号。24、如权利要求15至23中任一项所述的方法,其中每一节点类型的结构包括存储链接信息的能力,所述链接信息与将该节点类型如何能够链接到其它节点相关。25、如权利要求15至24中任一项所述的方法,其中每一节点类型的结构具有存储该节点的唯一的标识符的能力。26、如权利要求15至25中任一项所述的方法,其中每一节点类型进一步包括涉及如何执行各种动作的多个方法,所述动作在被置于树中时,协助处理节点类型。27、如权利要求15至26中任一项所述的方法,其中每一节点类型进一步包括一个标记器,该标志器在被置于树上时,能够由所述协助处理树的多个方法使用。28、一种解析器,适用于执行权利要求1至14中任一项所述的方法。29、一种解析器,其根据权利要求15至27中任一项所述的方法建立。30、一种应用软件,其能够使计算机系统运行以执行权利要求1至14中任一项所述的方法。31、一种应用软件,其能够使计算机系统运行以执行权利要求15至27中任一项所述的方法。32、一种将可执行代码转换为不同编程语言的计算机系统,该计算机系统具有输入工具,用于接收所述可执行代码;存储工具,用于存储应用软件和所接收的代码;和处理工具,用于使用所述应用软件来执行权利要求1至14中任一项所述的方法。33、如权利要求32所述的计算机系统,进一步包括输出工具,用于以所述不同的编程语言输出所述可执行代码。34、一种将可执行代码从第一编程语言转换为第二编程语言的计算机系统,该计算机系统包括存储工具,用于存储应用软件和所述可执行代码;以及处理工具,用于使用所述应用软件执行权利要求15至27中任一项所述的方法。35、一种将可^U于代码从第一编程语言转换为第二编程语言的方法,所述方法包括以权利要求1至14中任一项所述的方法创建树;针对树上的每一节点,将定义的可执行操作转录为第二编程语言的语法。36、一种将代码转换为不同编程语言的方法,该方法包括接收所述代码;基于所述可执行代码创建抽象语法树;将涉及多个重建进程的识别数据存储于数据存储器中,所述多个重建进程待在所述抽象语法树上运行以重建该树,从而协助所述到不同语言的代码转换;在所述抽象语法树上自动运行在所述数据存储器中识别出的重建进程;在该重建的树上自动运行配置进程,以将所述代码转换为所述不同的编程语言;评估转换后的代码,并基于该评估,识别出另一待在所述抽象语法树上运行以协助所述到不同语言的代码转换的重建进程;将所述另一重建进程的识别数据存储到所述数据存储器中;以及重复所述运行步骤。37、如权利要求36所述的方法,其中所述方法进一步包括接收数据词典、元数据或与所接收的代码有关的任何其它文件。38、如权利要求36或37所述的方法,其中所述抽象语法树是利用权利要求1至16中任一项所述的方法创建的。39、如权利要求36、37或38所述的方法,其中所述方法进一步包括将所述抽象语法树存储在所述数据存储器中的步骤。40、如权利要求39所述的方法,其中所述创建抽象语法树的步骤进一步包括从所述抽象语法树上提取声明元素,并将之存储到数据存储器中。41、如权利要求40所述的方法,其中所述声明元素是利用多个挖掘进程从所述抽象语法树上提取的,所述多个挖掘进程对所述抽象语法树进行挖掘以识别该树中的声明元素。42、如权利要求40或41所述的方法,其中所述每一声明元素的属性存储在所述数据存储器中。43、如权利要求39至42中任一项所述的方法,其中所述方法进一步包括将分析数据存储于所述数据存储器中,所述分析数据涉及如何使用以及44、如权利要求39至43中任一项所述的方法,其中所述方法包括将45、如权利要求44所述的方法,其中所述元数据包括以下一种或更多种关于所述代码的原始语言和/或所述不同的编程语言的信息;所述代码的原始语言和/或所述不同的编程语言的内建组元;以及涉及重建的信息,例如所需可维护性、经转换的代码的运行时复杂性和效率。46、如权利要求44或45所述的方法,其中使用多个挖掘进程,从所述抽象语法树上提取所述元数据的一个或更多个部分。47、如权利要求36至46中任一项所述的方法,其中所述重建进程包括以下一个或更多个对循环加以识別并重建为期望循环结构的进程;对特定可执行段加以识别并重建为更精细结构的进程;对所述抽象语法树中的GOTO语句加以识别,并重建树以移除这些语句的进程;对该树中的成组节点的复本加以识别,并重建以便将该组节点创建为函数或过程的进程;对一个或更多个变量的作用域加以识别的进程;对所述抽象语法树中的特定节点组加以识别,并重排这些节点的结构的进程;对所述抽象语法树中的特定节点组加以识别,并替换这些节点的进程,例如使用函数调用;将数据结构改变为第三标准形式的进程;遍历该树以识别界面的进程;以及遍历该树并分析变量的用途,以改进其变量类型的进程。48、如权利要求36至47中任一项所述的方法,其中所述方法进一步包括编写所述待在抽象语法树上运行的重建进程。49、如权利要求39至46中任一项所述的方法,其中所述方法进一步包括对存储于所述数据存储器中的信息执行审计,以识别有无信息丢失。50、如权利要求36至49中任一项所述的方法,其中所述自动运行在所述数据存储器中识別出的重建进程的步骤,还使用存储在所述数据存储器中的与代码相关的声明信息和元数据信息。51、如权利要求36至50中任一项所述的方法,其中同时运行两个或更多个重建进程。52、如权利要求39所述的方法,其中所述自动运行配置进程的步骤,还使用存储在所述数据存储器中的与代码相关的信息。53、如权利要求36至52任一项所述的方法,其中对转换后的代码的评估基于以下任意一项或更多项所述代码的秩复杂性;代码的行数;已被替换的进程的数目;对转换后的代码的人工评估;以及配置后的代码的准确性。54、如权利要求36至53中任一项所述的方法,其中所述评估转换后的代码的步骤,以所述抽象语法树为基础。55、如权利要求36至54中任一项所述的方法,其中所述评估转换后的代码包括生成异议报告,所述异议报告识别所述转换后的代码中可能无法产生所需结果的部分。56、如权利要求39所述的方法,其中在评估转换后的代码之前,所述方法包括将所述转换后的代码存储于所述数据存储器中的步骤。57、如权利要求56所述的方法,其中包括将该方法前一次迭代的转换后的代码替换为最新版的转换后的代码。58、如权利要求39至46、49、52、56或57中任意两项或更多项所述的方法,其中所述数据存储器是同一数据存储器。59、一种应用软件,其能够执行权利要求36至59中任一项所述的方法。60、一种用于转换代码的计算机系统,该计算机系统具有输入工具,用于接收所述^^码;存储工具,用于存储应用软件和所接收的代码;以及处理工具,用于使用所述应用软件执行权利要求36至59中任一项所述的方法,61、如权利要求60所述的计算机系统,其中所述计算机系统进一步包括存储权利要求39至46、49、52、56或57中任一项的信息的数据存储器。全文摘要本发明涉及可执行代码从一种语言到另一种语言的转换。具体地,本发明涉及代码的自动化转换。本发明涉及用于创建包括节点、待在代码转换中使用的方法、软件和计算机系统。本发明还涉及建立待在代码转换中使用的解析器的方法、软件和计算机系统。最后,本发明还涉及转换、评估和再转换代码的自动化方法和迭代方法。本发明的优点是其避免使用中间转换语言的能力及其高的自动化水平,从而减少了人工转换,并因此更高效,且成本更低。文档编号G06F9/45GK101208660SQ200680023203公开日2008年6月25日申请日期2006年6月27日优先权日2005年6月27日发明者阿尔伯特·唐纳德·通金,鲁思·埃玛·通金申请人:奎朴兹有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1