专利名称:生成用于程序代码转换的中间表示的体系结构的制作方法
技术领域:
本发明一般地涉及计算机和计算机软件的领域,更具体地说,涉及用于例如代码转换器、仿真器(emulator)和加速器(accelerator)的程序代码转换方法与装置。
背景技术:
在嵌入式和非嵌入式CPU的市场上,人们寻找占优势的指令集体系结构(ISA,Instruction Set Architecture),其中存在着大的软件体,这些软件体在性能上可以被“加速”,或者被“转换”为能提供较好的性能/价格比的多种可能的处理器,只要这些处理器能透明地访问相关的软件。人们还寻找占优势的CPU体系结构,后者在时间上被锁定于它们的ISA,因而无法在性能或者市场范围方面取得进展,也不能得益于“合成CPU”共同体系结构。
人们通常希望把为第一类型的计算机处理器(“源”处理器)编写的程序代码运行于第二类型的处理器(“目标”处理器)上。这里,使用一个仿真器或转换器来执行程序代码转换,使得源程序能在目标处理器上运行。仿真器提供一种虚拟环境,通过仿真源处理器,仿佛源程序以本地方式运行于源处理器之上。
以往,正如在题为“Program Code Conversion”的(专利公报)WO 00/22521并结合本申请书的图1至图5所描述的那样,在使用所谓的基本结点的运行时间转换期间,将源代码转换为计算机程序的中间表示。中间表示(IR,intermediate representation)是一个在计算机行业中广泛使用的术语,它指的是抽象计算机语言的各种形式,在其中,一段程序可以被表达,但是不专用于任何特定的处理器,也不打算在任何特定的处理器上直接执行。使用中间表示的、有助于这样的加速、转换和共同体系结构能力的程序代码转换方法与装置是,例如,在上述公报WO 00/22521中所讲述的那样。
发明内容
根据本发明,提供了如在所附的权利要求书中所陈述的装置与方法。从各项从属权利要求以及随后的叙述中,本发明的优选的特征将是显而易见的。
下面是根据本发明的各个方面的概括以及根据用于程序代码转换的改进的体系结构的不同实施例的可实现的优点。它作为一个简介而提供,以帮助本领域的技术人员更快地认同随后的本发明的详细讨论,并且不去限制、也不打算以任何方式去限制所附的权利要求书的范围。
以下所描述的各个实施例涉及用于程序代码转换装置的改进的体系结构以及相关方法,用于把可以在源计算环境中执行的源代码(subject code)转换为可以在目标计算环境中执行的目标代码。所述程序代码转换装置生成源代码的中间表示(“IR”),然后可以针对目标计算环境对它进行优化,以便更有效地生成目标代码。根据在转换中所涉及的特定的源和目标计算环境的体系结构,一个实施例的程序代码转换装置确定在中间表示中将生成下列类型的IR结点中的哪一种基本结点、复杂结点、多形结点和体系结构专用结点。程序代码转换体系结构在生成中间表示时,将通过默认来生成基本结点,除非已经确定另一种类型的结点更加适用于正在实现的特定转换。
基本结点提供为表达运行源代码的任何源体系结构的语义所需的最小结点(即,抽象表达式)集,因此,基本结点提供一种类似于精简指令集计算机(RISC,Reduced Instruction Set Computer)的功能。复杂结点是以比基本结点更加紧凑的表达方式来表达运行源代码的任何源体系结构的语义的类似于复杂指令集计算机(CISC,Complex Instruction Set Computer)的通用结点。同时所有复杂结点都可以被分解为具有相同语义的基本结点表示,复杂结点保留在单个IR结点中的复杂指令的语义,以便改进转换器的性能。复杂结点实质上扩大了在源代码中用于类似于CISC指令的基本结点集。基本结点和复杂结点二者都通用于宽范围的可能的源和目标体系结构,因此,允许在含有基本结点和复杂结点的相应的IR树上进行一般的优化。
如果被实现为通用IR结点,目标计算环境的特征可能导致特定的源指令的语义丢失时,程序代码转换装置将在中间表示中利用多形结点。多形结点含有一个函数指针,它指向专用于源代码中的特定源指令的目标计算环境的函数,程序代码转换装置还利用体系结构专用结点来提供目标专用的转换部件,以便为某些目标计算环境执行专门化的代码生成功能。
下面描述的改进的IR生成方法允许程序代码转换装置被配置成任何源和目标处理器体系结构对,同时保持最佳的性能水平,并使转换速度最大化。
为了更好地理解本发明,以及为了表示如何去实行本发明的实施例,现在借助于实例并引用附图来加以说明,在附图中图1表示包括源和目标计算环境的一个示例性的计算环境;图2表示一个优选的程序代码转换装置;图3是表示源代码到目标代码的转换的说明性计算环境的示意图;图4是根据本发明的一个优选实施例,由程序代码转换装置实现的各种中间表示的一个示意性的图解;图5是一个优选的程序代码转换装置的详细示意图;
图6表示使用基本结点和复杂结点产生的中间表示树的实例;图7是表示在一个加速器中用于实施本发明的ASN生成的实例的示意图;图8是表示在一个转换器中用于实施本发明的ASN生成的实例的示意图;图9是当使用按照本发明的一个优选实施例的ASN时,所述转换过程的操作流程图;图10是说明转换过程和在所述过程中生成的相应的中间表示(IR)的一个实例的示意图;图11是说明转换过程和在所述过程中产生的相应中间表示的另一个实例的示意图;图12是说明转换过程和在所述过程中产生的相应中间表示的一个进一步的实例的示意图。
具体实施例方式
提供以下的说明是为了使本领域的任何技术人员都能实行和使用本发明,并且陈述本发明人所设想的关于如何实施他们的发明的最佳方式。然而,由于在这里已经专门地规定了本发明的一般原理,以便为程序代码转换装置提供一种改进的体系结构,所以各种修改对本领域的技术人员来说仍然是显而易见的。
引用图1,图中表示包括源计算环境1和目标计算环境2的一个示例性的计算环境。在源计算环境1中,源代码10是可以以本地方式在一个源处理器12上执行的代码。源处理器12包括一组源寄存器14。在这里,正如本领域的技术人员所熟知的那样,可以用具有介于源代码10和源处理器12之间的中间层(例如,编译器)的任何适当的语言来表示源代码10。
人们希望在目标计算环境2中运行源代码10,目标计算环境2提供一个目标处理器22,它使用一组目标寄存器24。这两个处理器12和22可以是内在地不兼容的,因而,这两个处理器使用不同的指令集。由此,在目标计算环境2中提供一种程序代码转换体系结构30,以便在所述不兼容的环境中运行源代码10。程序代码转换体系结构30可以包括转换器、仿真器、加速器,或者任何其它适于将为一种处理器类型设计的程序代码转换为可以在另一种类型的处理器上执行的程序代码的体系结构。为了对本发明进行讨论的目的,在下文中,程序代码转换体系结构30将被称为“转换器30”。应当注意的是,两个处理器12和22也可以属于相同类型的体系结构,诸如在加速器的情况下。
转换器30对源代码10进行转换处理,并且提供已转换的目标代码20,以便由目标处理器22执行。适当地,转换器30执行二进制转换,其中,采取适用于源处理器12的可执行的二进制代码形式的源代码10被转换为适用于目标处理器22的可执行的二进制代码。转换可以静态地或动态地进行。在静态转换中,在已转换的程序在目标处理器上执行之前,对整个程序进行转换。这将引起明显的延时。因此,转换器30最好是动态地转换源代码10的若干小段,以便在目标处理器22上立即执行。由于大段的源代码10在实际上不被使用或者仅仅偶尔地被使用,所以这是更加有效的。
现在引用图2,图中更详细地图示转换器30的一个优选实施例,转换器30包括一个前端31,一个内核32和一个后端33。前端31被配置专用于与源代码相关的源处理器12。前端31取出源代码10的预定的段,并且提供通用的中间表示块(“IR块”)。内核32通过使用优化技术来优化由前端31生成的每一个IR块,正如本领域的技术人员容易知道的那样。后端33从内核32取出已优化的IR块,并且生成可以在目标处理器22上执行的目标代码20。
适当地,前端31将源代码10分为基本块,其中,每一个基本块都是在唯一入口点的第一指令和在唯一出口点的最后指令之间的顺序指令集(诸如跳转、调用或分支指令)。内核32可以选择含有准备作为单个单元一起处理的两个或多个基本块的一组块。还有,前端31可以形成表示不同入口条件下源代码的同一基本块的相同块。在使用中,源代码10的第一预定段(诸如一个基本块)被识别,并且被在目标处理器22上运行于转换方式的转换器30进行转换。然后,目标处理器22执行目标代码20的相应已优化和已转换的块。
转换器30包括多个在内核32中适当提供的抽象寄存器34,它表示将在源处理器12内使用以执行源代码10的物理的源寄存器14。抽象寄存器34规定源处理器12的状态,所述状态是通过表示源处理器寄存器上的源代码指令的预期效果来进行仿真的。
使用这样一种实施方式的结构示于图3。如图所示,已编译的本地源代码被显示为驻留在适当的计算机存储器存储介质100中,特定的和可替代的存储器存储机制是本领域的技术人员所熟知的。软件组成包括待转换的本地源代码、转换器代码和操作系统。转换器代码,即,用于实现转换器的源代码的编译版本,也类似地驻留在适当的计算机存储器存储介质102上。转换器与存储在存储器中的操作系统104(诸如,运行于目标处理器106上的UNIX,上述处理器典型地是一个微处理器或者其它适当的计算机)结合在一起运行。人们将理解,图3所示的结构仅仅是示例性的,并且,例如,根据本发明的方法和处理过程可以用驻留于操作系统中或者在操作系统下的代码实现。已转换的代码被示出驻留在一种适当的计算机存储器存储介质108中。源代码、转换器代码、操作系统、已转换的代码和存储机制可以是本领域的技术人员所熟知的多种类型中的任何一种。
在本发明的一个优选实施例中,在运行时间动态地执行程序代码转换,同时已转换的程序在目标计算环境中运行。转换器30与已转换的程序直接插入运行。已转换的程序的执行路径是一个控制环路,包括下列各步骤执行转换器代码,该代码将源代码块转换为已转换代码,然后执行所述已转换代码块,每个已转换代码块的结尾含有将控制返回到转换器代码的指令。换句话说,转换和随后执行源代码的步骤被交织在一起,因此,每次仅转换源程序的一些部分。
转换器30的基本转换单元是基本块,这意味着转换器30每次仅转换一个基本块的源代码。一个基本块被正式地定义为精确地具有一个入口点和精确地具有一个出口点的一段代码,它把代码块限制到单个控制路径。为此,基本块是控制流程的基本单元。
中间表示(IR)树在生成已转换代码的过程中,根据源指令序列来生成中间表示(“IR”)树。IR树包括作为由源程序计算的表达式和执行的操作的抽象表示的各个结点。然后,根据IR树来生成已转换代码。在这里所描述的IR结点的集合在口语上被称为“树”。我们注意到,正式地说,这样的结构事实上是有向非循环图(DAG,directed acyclic graph),而不是树。树的正式定义要求每一个结点具有至多一个父辈。由于所描述的实施例在IR生成过程中使用共同的子表达式消除,所以各结点通常具有多个父辈。例如,标志影响指令结果的IR可以由两个抽象寄存器(即对应于目标源寄存器和标志结果参数的寄存器)给出。
例如,源指令(add %r1,%r2,%r3)对源寄存器%r2和%r3的内容进行加法运算,并且将结果存储在源寄存器%r1中。因此,这条指令对应于抽象表达式“%r1=%r2+%r3”。这个实例含有抽象寄存器%r1的定义,它采用一个加法表达式,后者含有表示所述指令操作数%r2和%r3的两个子表达式。在源程序的上下文中,这些子表达式可以对应于其它先前的源指令,或者它们可以表示当前指令的细节,诸如中间常数值。
当“加法”指令被解析时,产生一个对应于用于加法的抽象数学运算符的新的“Y”型IR结点。所述“Y”型IR结点存储着表示操作数(保存在源寄存器中,被表示为子表达式树)的其它IR结点的引用。“Y”型结点本身由适当的源寄存器定义(用于%r1的抽象寄存器,所述指令的目标寄存器)引用。正如本领域的技术人员可以理解的那样,在一个实施例中,使用面向对象的编程语言(诸如C++)来实现所述转换器。例如,一个IR结点被实现为一个C++对象,同时对于其它结点的引用被实现为对于对应于那些其它结点的C++对象的引用。因此,一棵IR树被实现为各IR结点对象的一个集合,其中含有彼此之间的各种引用。
抽象寄存器(abstract register)还有,在所讨论的实施例中,使用一组抽象寄存器34来生成IR。这些抽象寄存器34对应于源体系结构的特定特征。例如,对于源体系结构12上的每一个物理寄存器14来说,存在唯一的抽象寄存器34。在IR生成过程中,抽象寄存器34用作IR树的占位符。例如,位于源指令序列中的给定点的源寄存器%r2的值由一个特定IR表达式树来表示,上述IR表达式树与用于源寄存器%r2的抽象寄存器34有关。在一个实施例中,抽象寄存器34被实现为C++对象,后者经由至所述树的根结点对象的C++引用与特定的IR树建立相关联。
在上述指令序列的实例中,转换器30在解析“加法”指令之前的源指令的同时,已经生成对应于%r2和%r3的值的IR树。换句话说,计算%r2和%r3的值的子表达式已经被表示为IR树。当生成用于“add %r1,%r2,%r3”指令的IR树时,新的“Y”型结点含有对于%r2和%r3的IR子树的引用。
在转换器30和已转换代码中的组成之间划分抽象寄存器34的实施方式。在转换器的上下文中,抽象寄存器是在IR生成过程中使用的占位符,因此,抽象寄存器34与用于计算对应于特定抽象寄存器34的源寄存器14的值的IR树相关联。如此,转换器中的抽象寄存器34可以被实现为一个C++对象,它含有对于IR结点对象(即,IR树)的引用。在已转换代码的上下文中,抽象寄存器34是抽象寄存器库内的一个特定位置,源寄存器14的值与实际的目标寄存器24是通过进/出上述抽象寄存器库来同步的。可替代地,当已经从抽象寄存器库加载一个值时,在已转换的代码中的抽象寄存器34可以被理解为目标寄存器26,后者在执行已转换的代码的过程中,在被回存到寄存器库之前,暂时地保存源寄存器值。
如上所述的程序转换的一个实例示于图4。图4表示x86指令的两个基本块的转换,以及在转换过程中产生的相应IR树。图4左侧表示在转换过程中仿真器的执行路径。转换器30将源代码的第一基本块153转换(151)为目标代码,随后执行(155)所述目标代码。当目标代码完成执行时,控制返回到仿真器157。然后,转换器30将源代码的下一个基本块159转换(157)为目标代码,随后执行(161)所述目标代码,等等。
在将源代码的第一基本块153转换(151)为目标代码的过程中,转换器30根据所述基本块生成IR树163。在本例中,从作为标志影响指令的源指令“add%ecx,%edx”产生IR树163。在产生IR树163的过程中,由这条指令定义4个抽象寄存器目标源寄存器%ecx167,第一标志影响指令参数169,第二标志影响指令参数171,以及标志影响指令结果173。对应于“加法”指令的IR树是一个简单的“Y”型(算术加法)运算符175,其操作数是源寄存器%ecx 177和%edx179。
第一基本块的仿真通过存储标志影响指令的各项参数和结果,将各项标志置为挂起状态。标志影响指令为“add%ecx,%edx”。该指令的参数是仿真的源寄存器%ecx 177和%edx 179的当前值。在源寄存器前面的“@”符号使用177和179来表示源寄存器的值是从全局寄存器库里面分别对应于%ecx和%edx的位置检索的,因为这些特定的源寄存器事先没有被当前基本块加载。然后,这些参数被存储在第一(169)和第二(171)标志参数抽象寄存器中。加法运算的结果175被存储在标志结果抽象寄存器173中。
在生成IR树之后,根据所述IR来生成相应的目标代码。从一个通用的IR生成目标代码的过程在本领域是众所周知的。目标代码被插入到已转换的块的尾部,以便将抽象寄存器,包括用于标志结果173和标志参数169、171的抽象寄存器,保存到全局寄存器库中。在生成目标代码之后,执行步骤155。
在转换源代码的第二基本块(159)的过程(157)中,转换器30根据所述基本块生成IR树165。从源指令“pushf”生成IR树165,这是一条标志使用指令。指令“pushf”的语义是将所有状态标志的值存入堆栈,这要求明确地计算每一个标志。如此,在生成IR的过程中,定义对应于4个状态标志值的抽象寄存器零标志(“ZF”)181,符号标志(“S17”)183,进位标志(“CF”)185,以及溢出标志(“OF”)187。结点195是算术比较运算符“无符号小于”。根据来自先前的标志影响指令的信息(在本例中为来自第一基本块153的指令“add%ecx,%edx”)来进行状态标志的计算。计算状态标志值的IR是根据标志影响指令的结果189和参数191、193。如上所述,在标志参数标号前面的符号“@”表示仿真器插入目标代码,以便在使用它们之前,从全局寄存器库加载那些数值。
因此,第二基本块迫使标志值归一化。在计算和使用各标志数值之后(通过仿真“pushf”指令的目标代码),它们将被存储到全局寄存器库中。与此同时,挂起的标志抽象寄存器(各项参数和结果)被置为一种未定义状态,以反映这样一个事实各个标志数值被明确地存储(即,各个标志已经被归一化)。
图5表示根据本发明的一个优选实施例而形成的转换器30,它能生成几种可以用于转换的不同类型的IR结点,以及说明这些不同类型的IR结点的实施方式如何在转换器30的前端31、内核32和后端33等组成中进行分配。术语“实现”指的是IR生成,当源代码10的源指令被解码(即,被解析)时,在前端31中进行IR生成。术语“种植”指的是目标代码生成,后者在后端33中进行。
要注意的是,当下面用单个源指令来描述转换过程时,如上所述,这些操作实际上对于源指令的整个基本块立即发生。换句话说,整个基本块被初始地解码,以生成一个IR森林,然后,内核32对整个IR森林进行优化。最后,后端33以每次一个结点的方式对于已优化的IR森林进行目标代码生成。
当为一个基本块生成一个IR森林时,转换器30可以根据所预期的转换性能以及源处理器和目标处理器对的特定体系结构,生成基本结点、复杂结点、多形结点或者体系结构专用结点(ASN)其中之一,或者它们的任何组合。
基本结点基本结点是任何源体系结构的语义(即,表达式、计算和运算)的抽象表示,并且提供为表达源体系结构的语义所需的标准或基本结点的最小集。如此,基本结点提供简单的类似于精简指令集计算机(RISC,Reduced Instruction Set Computer)的功能,例如,“加法”运算。与其它类型的结点相对比,每一个基本结点都是不可缩减的,这意味着它不能被进一步地分解为其它IR结点。由于它们的简单性,基本结点也可以在所有后端33(即,目标体系结构)上容易地被转换器30转换为目标指令。
当仅使用基本IR结点时,转换过程完全在图5的顶部(即,穿越“基本IR”块204的路径)发生。在解码块200中,前端31对来自源程序代码10的源指令进行解码,并且在实现块202中实现(生成)由基本结点构成的相应IR树。然后,所述IR树从前端31被送往内核32中的基本IR块204,在这里,对整个IR森林实行优化。由于IR森林被仅含有基本结点的基本IR块204优化,这对任何处理器体系结构来说都是完全通用的。然后,已优化的IR森林从内核32中的基本IR块204被送往后端33,后者在种植块206中为每一个IR结点种植(生成)相应的目标代码指令。随后,由编码块208对目标代码指令进行编码,以便由目标处理器执行。
如上所述,在所有后端33上,基本结点容易地被转换为目标指令,并且典型地可以完全通过基本结点的排他利用来生成已转换的代码。当基本结点的排他利用很快实现用于转换器30时,它将在已转换的代码中产生次最佳性能。为了提高已转换的代码的性能,可以通过使用IR结点的替代类型,诸如复杂结点、多形态结点和体系结构专用结点(ASN)来使转换器30专门化,以便使用目标处理器体系结构的特征。
复杂结点复杂结点是以一种比基本结点更紧凑的表达方式来表达源体系结构的语义的通用结点。复杂结点提供一种类似于复杂指令集计算机(CISC,Complex Instruction Set Computer)的功能,例如“add_imm”(寄存器与立即常数相加)。具体地说,复杂结点典型地表示具有立即常数字段的指令。立即类型(immediate-type)指令是这样的指令,在其中,一个常数操作数值被编码到所述指令本身的一个“立即数(immediate)”字段中。对于那些小到足以置入立即数字段中的常数值来说,这样的指令避免了使用寄存器来保存所述常数。对于复杂指令来说,复杂结点可以通过远少于表征相同语义的等效基本结点的结点来表示复杂指令的语义。尽管复杂结点实质上可以被分解为具有相同语义的基本结点表示,复杂结点在把立即型指令的语义保留在单个IR结点中是有用的,由此改进了转换器30的性能。而且,在某些情况下,通过以基本结点的形式来表示复杂指令,可能使复杂指令的语义失去,并且因此,复杂结点实质上扩大了基本结点集,以包括用于这样的“类似于CISC的”指令的IR结点。
引用图6,现在来说明通过使用一个与基本结点相比较的复杂结点来实现的效率的一个实例。例如,MIPS的加立即数指令“addi r1,#10”的语义将保存在寄存器r1中的数值加上10。取代把常数数值(10)加载到寄存器中,然后将两个寄存器(的内容)相加,指令addi简单地将常数值10直接编码到所述指令字段本身中,由此避免了使用第二寄存器的需求。当生成一个严格地使用基本结点的这些语义的立即表示时,针对这条指令的基本结点表示将首先把来自const(#10)结点60的常数值加载到一个寄存器结点r(x)61中,然后,使用加法(add)结点来进行寄存器结点r1 62和寄存器结点r(x)61的加法运算。所述复杂结点表示包括单个“加立即数”IR结点70,它含有在结点70的一部分72的常数值10以及对寄存器r1 74的引用。在基本结点的情形中,后端33可能需要执行能够识别图6所示的4结点图案的惯用语法识别,以便识别并生长一条“加立即数”目标指令。在没有惯用语法识别的情况下,后端33将在执行寄存器—寄存器加法运算之前,发出一条额外指令,以便把常数值10加载到寄存器中。
由于复杂结点含有比它们的基本结点等价物更多的语义信息,所以复杂结点降低了在后端33中进行惯用语法识别的要求。具体地说,复杂结点避免了由后端33来进行常数操作数的惯用语法识别的需求。通过比较,如果立即型源指令被分解为多个基本结点(并且所述目标体系结构也含有立即型指令),则转换器30可能需要昂贵的后端33的惯用语法识别,以便把多结点簇识别为一个立即指令的候选者,或者产生低效能的目标代码(即,多于实际需要的指令,使用多于实际需要的寄存器)。换句话说,通过单独地使用基本结点,无论在转换器30中(通过惯用语法识别),还是在已转换代码中(通过额外生成的代码,不用惯用语法识别),都会使性能下降。更一般地说,由于复杂结点是语义信息的一种更加紧凑的表达方式,所以它们减少了转换器30必须生成、遍历和删除的IR结点的数目。
立即型指令对多种体系结构来说是共同的。因此,复杂结点之所以是通用的是由于它们在一定范围的体系结构中是可以重复使用的。然而,并不是每一个复杂结点都存在于每一个转换器的IR结点集中。转换器的某些共同的特征是可配置的,这意味着当为一个特定的源和目标体系结构的对编译转换器时,没有被应用于所述转换器配置的那些特征可以从编译中被排除。例如,在一个MIPS—MIPS(MIPS到MIPS)转换器中,与任何MIPS指令的语义都不匹配的复杂结点将从IR结点集中被排除,因为它们将永远用不上。
使用一种顺序遍历,复杂结点还可以进一步改进所生成的目标代码的性能。顺序遍历是几种可替代的IR遍历算法之一,用于决定IR树内的各IR结点被生成为目标代码的顺序。具体地说,当它被第一次遍历时,顺序遍历生成每一个IR结点,由于没有单独的优化越过整个IR树,排除了后端33的惯用语法识别。与基本结点相比,复杂结点每个结点表达更多的语义信息,并且因此,惯用语法识别的某些工作被隐含在复杂结点本身内。这允许转换器30使用顺序遍历,而不会如单独使用基本结点那样在目标代码性能方面受到更多的损失。
当转换器30生成复杂结点(即,所述路径穿越图5中的复杂IR块210)时,所述转换过程类似于前面针对基本结点而叙述的转换过程。唯一的差别在于,与一个复杂结点的语义相匹配的源指令被实现为实现块202中的复杂结点,而不是基本结点(如分隔实现块202的虚线所示)。复杂结点在宽范围的体系结构中仍然是通用的,这使得内核32的优化仍然可以施加于整个IR森林。而且,在CISC类型的目标体系结构上为复杂结点生成目标代码可能比基本结点等价物更为有效。
多形结点如图5所示的转换器30的一个优选实施例还可以利用多形中间表示。多形中间表示是一种机制,借助于这种机制,后端33可以提供专门化的代码生成,以便有效地将目标体系结构特征应用于特定的、性能重要的源指令。多形机制被实现为一个通用的多形结点,它含有指向后端33代码生成函数的函数指针。每一个函数指针都被专用于特定源指令。多形机制预先取得标准的前端31 IR生成机制,否则,上述机制将把源指令解码为基本或复杂结点。在后端33中,如果没有多形机制,这些基本结点的生成可能导致次最佳的目标代码,或者需要昂贵的惯用语法识别来重构源指令的语义。
每一个多形函数专用于特定的源指令和目标体系结构函数对。多形结点向内核32暴露关于它们的函数的最少信息。多形结点能够参加正常的内核32优化,诸如表达式共享和表达式合并。内核32可以使用函数指针来决定两个多形结点是否相同。多形结点不保留源指令的任何语义信息,但是可以从函数指针推断这样的语义信息。
多形结点被用于源指令,后者可以被表示为一系列的精心选择的目标指令,这样就排除了由内核32确定最佳的目标指令处于运行时间的需求。当多形结点不是由使用基本结点的前端31来实现时,内核32可以选择把这些结点实现为多形结点。
而且,多形结点可以含有寄存器分配线索。由于目标指令已知,所以在CISC体系结构上所需的各个寄存器也可能是已知的。多形结点允许它们的操作数和结果出现在构建IR时所选择的寄存器中。
为了让转换器30利用多形结点(即,在图5中穿越多形IR块212的路径),后端33向前端31提供源指令—目标函数指针对的列表。在所提供的列表上的各项源指令被实现为含有相应的后端33函数指针的多形结点。不在所提供的列表上的源指令被实现为如上所述的复杂或基本IR树。在图5中,由箭头214反映的从后端33到前端31的路径表示向位于前端31的实现块215提供源指令—目标函数指针对的列表。当前端31执行在实现块215中的实现功能(即,将源指令映射到IR结点)时,根据从后端33通过路径214接收的信息来修改处理过程。
在内核32的多形IR块212中,由于内核32可以从每一个结点中的函数指针推断它们的语义,多形结点仍然可以参加一般的优化。在后端33中,指向目标代码生成函数的目标函数指针被简单地去除引用并执行。这种情况不同于基本结点和复杂结点情况,在后两种情况下,后端33将特定IR结点映射到特定代码生成函数。采用多形结点,多形函数在结点本身被直接地编码,因此,后端33将执行较少的计算。在图5中,这种差别通过下列事实表现出来多形种植块216与多形IR块212和后端33相邻(即,在多形IR块212和多形种植块216之间,没有指定非平凡计算的箭头)。
实例1多形的IR实例为了图解优化转换器30以便在IR中利用多形结点的过程,以下的实例说明一个PPC P4(PowerPC至奔腾4)转换器中所需的PPC(PowerPC“SHL 64”)指令(左移64位)的转换,上述转换首先使用基本结点,然后使用多形结点。
不优化转换器以实现多形结点,则PPC SHL 64指令的转换将仅使用基本结点
PPC SHL 64=>基本IR多结点=>P4多指令未经优化的转换器的前端解码器200对当前块进行解码,并且遇到PPC SHL 64指令。其次,前端实现块202指令内核32去构建一个含有多个基本结点的IR。然后,内核32优化IR森林(从指令的当前块生成),并且执行一次顺序遍历,以决定在基本IR块204中代码生成的顺序。接着,内核32顺序地为每一个IR结点进行代码生成,指令后端33去种植适当的RISC类型指令。最后,后端33在种植块206中种植代码,并且在编码块208中,用一条或多条目标体系结构指令来编码每一条RISC型指令。
当通过前端31和后端33的专门化来优化特定的目标体系结构以优化对性能有重要影响的指令时PPC SHL 64>多个IR单结点>P4单/少数指令所述已经优化的转换器的前端解码器200对当前块进行解码,并且遇到PPC SHL 64指令。其次,前端实现块202指令内核32去构建一个含有单个多形IR结点的IR。当生成所述单个多形结点时,后端33知道SHL 64的移位操作数必须处于特定的寄存器(P4上的%ecx)中。此项要求在多形结点中被编码。然后,内核32为当前块优化IR森林,并且执行顺序遍历,以固定多形IR块212中的代码生成顺序。再次,内核32为每一个结点进行代码生成,指令后端33去种植适当的RISC类型指令。然而,在代码生成过程中,以不同于基本结点的方式来处理多形结点。每一个多形结点都引起驻留在后端33中的专门化的代码生成器的调用。后端33专门化的代码生成器函数在种植块216中种植代码,并且在编码块208中,用一条或多条目标体系结构指令来编码每一条源体系结构指令。在生成阶段的寄存器分配过程中,特定的寄存器信息被用来分配正确的寄存器。这样就减少了由后端33进行的计算,如果已经分配了不适当的寄存器,将要求进行这样的计算。代码生成可能涉及用于暂时寄存器的寄存器分配。
实例2困难指令下面的实例说明将由本发明的转换器30执行的PPC MFFS指令(将32位FPU控制寄存器移动到64位通用FPU寄存器)的转换和优化。这条源指令是如此复杂,以至于无法用基本结点来表示。
在未经优化的情况下,将使用一个置换函数来转换这条指令。对于使用标准的转换方案特别难以转换的源指令的特例来说,置换函数是明显的转换。置换函数转换作为执行源指令的语义的目标代码函数来实现。它们承受比基于标准的IR指令的转换方案更高的执行成本。用于这条指令的未经优化的转换方案是这样的PPC MFFS指令=>基本IR置换函数=>P4置换函数在一个使用多形IR的转换器30中,使用多形结点来转换这样的特殊情况指令。多形结点的函数指针为后端33提供了一种更加有效的机制,即,为困难的源指令提供一种定制的转换。用于相同指令的优化的转换方案是这样的PPC MFFS指令=>单个多形IR结点=>P4 SSE2指令体系结构专用结点在本发明的转换器30的另一个优选实施例中,转换器30可以利用如图5所示的体系结构专用结点(ASN),后者专用于特定的体系结构(即,一个特定的源体系结构—目标体系结构的组合)。每一个体系结构专用结点(ASN)都是针对特定指令而专门地定做的,由此得出专用于特定体系结构的ASN。当使用ASN机制时,可以实行体系结构专用的优化,理解ASN的语义并且因此能够在ASN之上进行工作。
IR结点可以包括多达3个部件数据部件,实施部件和转换部件。数据部件保存不是结点本身固有的任何语义信息(例如,一个常数立即指令字段的值)。实施部件执行代码生成,并且因此,专门地涉及一种特定的体系结构。转换部件将所述结点转换为一种不同类型的IR结点,即ASN结点或基本结点。在本发明的一种给定的实施方式的转换器中,在所生成的IR中的每一个基本结点和ASN中,都包括转换部件或者实施部件,但不同时包括二者。
每一个基本结点都具有一个专用于目标体系结构的实施部件。基本结点没有转换部件,由于在IR结点层次结构中,基本结点仅对可能的最小语义信息量进行编码,因此,把基本结点转换为其它类型的IR结点不会带来任何好处。将基本结点转换为其它类型的IR结点将要求通过惯用语法识别来重新收集语义信息。
ASN的实施部件专用于所述结点的体系结构,因此,它生成对应于所述ASN的体系结构专用指令。例如,MIPSLoad ASN的实施部件生成MIPS“ld”(加载)指令。当使用具有相同的源和目标体系结构的本发明的转换器(即,作为一个加速器)时,各源ASN将具有实施部件。当使用具有不同源和目标体系结构的转换器时,各源ASN将具有转换部件。
例如,图7表示当在MIPS—MIPS加速器中使用本发明的实施例时,用于MIPS指令的ASN。前端31对MIPS“addi”(立即数相加)指令701进行解码,并产生一个IR以包含相应的ASN,MIPS_ADDI703。对加速器来说,源和目标体系结构是相同的,并且因此转换部件“CVT”707未定义。定义实施部件“IMPL”705以生成相同的MIPS“addi”指令709,经受代码生成过程中的寄存器分配差异。
图8表示当在MIPS x86转换器中使用本发明的实施例时,在用于相同的MIPS指令的IR中的各ASN。前端31对MIPS“addi”源指令进行解码,并且生成一个相应的源ASN,MIPS_ADDI 801。对这个加速器来说,源和目标体系结构是不同的,并且因此源ASN 801的实施部件803未定义。MIPS_ADDI的转换部件805是一个专门化的转换部件,它把源ASN 801转换为目标ASN 807。通过比较,一个通用的转换部件将源ASN 801转换为基本结点表示。MIPS_ADDI结点801的目标ASN表示是单个x86 ADDI结点807。目标ASN 807的转换部件811未定义。目标ASN 807的实施部件809生成一条目标指令813,在本例中为x86指令“ADD $EAX#10”。
当转换器30正在使用各ASN时,所有源指令都被实现为源专用ASN。在图5中,前端解码块200、ASN实现块218以及源ASN块220互相邻接这个事实表示下列事实,即,由前端31定义各ASN,并且由于在源指令类型和源ASN类型之间存在一一对应关系,所以所述实现方法是寻常的。前端31含有理解各源ASN的语义并在其上进行工作的源专用优化。换句话说,所述源代码被初始地实现为含有全部源ASN的一个IR森林,然后对其施加源专用优化。
通过默认,源ASN具有一个通用转换部件,它生成基本结点的IR树。这允许使用通用的IR结点来支持一种新的源体系结构被快速实施。在图5中,源ASN被实现为通过穿越ASN基本IR块222和种植块206延伸的路径的基本结点,它以相同于已在前面详细说明的其它基本结点的方式,被转换为目标代码。
对于那些对性能有显著影响的源指令来说,相应的源ASN结点提供专门化的转换部件,其生成目标ASN结点的IR树。考虑是否实现一个专门化的转换部件的因素包括(1)为特定的有效转换提供的目标体系结构特征是否会在基本结点转换中丢失;(2)源指令是否出现得如此频繁,以至于它对性能产生显著的影响。这些专门化的转换部件是专用于源—目标体系结构对的。目标ASN(根据定义,它具有与目标相同的体系结构)包括实施部件。
当实现专门化的转换部件时,相应的源ASN结点提供目标专用的转换部件,其通过目标ASN块224将源ASN转换为目标ASN。然后,目标ASN的实施部件被调用,以便在目标ASN种植块226中执行代码生成。每一个目标ASN对应于一条特定的目标指令,因此,由一个目标ASN生成的代码简单地是所述ASN编码的相应目标指令。如此,使用目标ASN的代码生成在计算上是最少的(在图5中被反映为,目标ASN种植块226与后端33中的目标ASN块224和编码块208二者相邻,在这些部件之间,没有示出指定非寻常的计算的箭头)。而且,IR遍历、转换和代码生成过程全都受到内核32的控制。
图9表示根据本发明的、利用ASN机制的转换器的一个优选实施例而执行的所述转换过程。在前端31中,在步骤903,转换器将源代码901解码为源ASN 904。在步骤905,转换器对由源ASN构成的IR树进行源专用优化。然后,在步骤907,通过调用源ASN的转换部件,将每一个源ASN 904转换为目标兼容的IR结点(目标ASN911)。通过默认,具有通用转换部件的源ASN结点被转换为基本结点909。如同由后端925所提供的那样,具有专门化的转换部件的各源ASN结点被转换为各目标ASN 911。转换由此产生一个混合的IR森林913,它含有基本结点909和目标ASN 911。在步骤915,在内核32中,所述转换器对混合IR森林913中的各基本结点进行一般优化。随后,在步骤916,转换器对混合IR森林913中的各目标ASN进行目标专用优化。最后,在步骤917,代码生成调用混合树中的每一个结点的实施部件(基本结点和目标ASN结点二者都具有实施部件),接着生成目标代码919。
在代码加速器的特例中,源和目标体系结构二者相同。在这个情形,在整个转换过程中,各源ASN持续。在前端31,通过解码生成来自各源指令的各源ASN。在内核32,各源ASN通过体系结构专用优化。代码生成调用各源ASN的实施部件生成相应的指令。如此,在代码加速器中ASN的使用避免了代码激增,其方法是通过保证1∶1的源对目标指令的最小转换比,通过优化可以增加这个比值。
本发明的转换器的各个实施例都可以为特定的转换器应用(即,特定的源体系结构—目标体系结构对)而进行配置。如此,本发明的转换器可以被配置成这样,将被设计在任何源体系结构上运行的源代码转换为可以在任何目标体系结构上执行的目标代码。在多种转换器应用中,每一个基本结点都具有多个实施部件,其中的每一个都支持目标体系结构。正在进行的特定配置(即,条件编译)决定哪些IR结点和这些结点的哪些部件包括在特定的转换器应用中。
在本发明的一个优选实施例中,ASN的使用提供了多种有利的效益。首先,使用源指令的通用IR实施方式可以快速地开发从头建立的转换器产品。其次,通过实现用于那些对性能具有重要影响的源指令的目标专用转换部件(正如事先知道的或者正如由经验决定的),现有的转换器产品可以以增量方式被扩充。第三,随着更多的转换器产品被开发,ASN结点的库(以及所实现的功能)与时俱增,因此未来的转换器产品可以快速地被实现或者被优化。
本发明的这个实施例的后端实施方式检出和选择哪些源指令值得优化(通过定义目标专用的转换部件)。通用的转换部件允许快速地开发基于ASN的转换器,同时专用的转换部件允许对性能有重要影响的指令有选择地和增量地被优化。
实例3使用ASN的困难指令回到前面实例2的PowerPC SHL 64指令,使用ASN的转换器30执行下列各步骤前端解码器200对当前块进行解码,并且遇到PowerPC SHL 64指令。随后,前端31实现针对所述指令(即,SHL64 PPC P4)的单个ASN。其次,内核32优化用于指令的当前块的IR,并且在准备代码生成的过程中执行IR的顺序遍历。再次,内核32通过调用每一个特定ASN结点的代码生成器函数(它是实施部件的一个元件),为所述ASN结点执行代码生成。最后,后端33将源体系结构(PPC)指令编码为一条或多条目标体系结构(P4)指令。
MIPS实例现在引用图10、11和12,图中示出了分别使用基本IR结点、MIPS—MIPS ASN IR结点和MIPS—x86 ASN IR结点,从相同的MIPS指令序列生成的不同IR树。示例性的MIPS源指令序列的语义(加载立即数的高位,然后对立即数进行按位或运算)是将32位常数数值Ox12345678装入源寄存器“a1”。
在图10中,二进制解码器300是转换器30的前端部件31,它把源代码解码(解析)为具体的源指令。在源指令被解码之后,它们被实现为基本结点302,并且被添加到用于指令的当前块的正在工作的IR森林。IR管理器304是在IR生成过程中保持正在工作的IR森林的转换器30的一部分。IR管理器304包括抽象寄存器和它们的相关IR树(IR森林的根是各抽象寄存器)。例如,在图10中,抽象寄存器“a V 306”是5个结点的IR树308的根,这棵树是当前块的正在工作的IR森林的一部分。在用C++实现的转换器30中,IR管理器304可以被实现为一个C++对象,其包括一组抽象寄存器对象(或者对于IR结点对象的引用)。
图10说明由仅使用基本结点由MIPS至x86转换器产生的IR树308。MIPS_LUI指令310实现具有两个操作数结点316和318(在本例中为两个常数)的“SHL”(左移)基本结点314。MIPS_LUI指令310的语义是将一个常数值(Ox1234)向左移动一个恒定数目的位(16)。MIPS_ORI指令312实现具有两个操作数结点314和322(即,SHL结点314的结果和一个常数值)的“ORI”(对立即数进行按位或运算)基本结点320。MIPS_ORI指令312的语义是将现有的寄存器内容与一个常数值(Ox5678)进行按位或运算。
在一个未经优化的代码生成器中,基本结点不包括除装载立即数以外的立即数型运算符,这样,每一个常数结点都导致生成一条加载立即数的指令。因此,对这个源指令序列来说,未经优化的基本结点转换器需要5项RISC型操作(加载、加载、移位、加载、或)。后端33的惯用语法识别通过将常数结点与它们的父辈结点合并,能将这个数目从5减少到2,以便生成立即数型目标指令(即,对立即数进行移位以及对立即数进行或运算)。这样就把目标指令的数目减少到2,但是在代码生成器中,在执行惯用语法识别时增加了转换成本。
在IR中使用复杂结点可以实现立即数型IR结点,这样就消除了在后端33中进行惯用语法识别的需求,并降低代码生成器的转换成本。复杂结点保留原始源指令的更多语义,并且,随着被实现的IR结点更少,当使用复杂结点时,结点生成的转换成本也被降低。
图11说明使用ASN由MIPS—X86(MIPS至X86)转换器生成的IR树。在源指令被二进制解码器300解码之后,他们被实现为MIPS_X86 ASN结点330,随后被添加到用于当前块的工作IR森林。首先,由ASN的转换部件将MIPS_X86_LUI ASN结点转换为一个X86 32位常数结点332。其次,MIPS_X86_ORI ASN结点产生一个X86 ORI结点,它被立即与先前的X86常数结点合并在一起(常数合并),结果得到单个X86 32位常数结点334。所述结点334被编码为单个X86加载常数指令“mov%eax,$Ox12345678”。如同可以看到的那样,ASN结点导致比基本结点实例更少的结点,由此降低了转换成本,同时提供较好的目标代码。
图12说明由MIPS—MIPS转换器(即,MIPS加速器)使用ASN生成的IR树。在源指令310、312被二进制解码器300解码之后,他们被实现为MIPS_MIPS ASN结点340,随后,上述结点被添加到用于当前块工作IR森林。由于对MIPS—MIPS转换器来说,源和目标体系结构是相同的,所以MIPS_MIPS_LUI和MIPS_MIPS_ORI_ASN结点340具有空(未经定义的)转换部件。如此,在源指令和用于生成代码的最后IR结点之间存在一种直接对应关系。这保证了即使在施行任何优化之前,1∶1的源对目标指令的转换比。换句话说,ASN结点消除了用于相同—相同转换器(加速器)的代码激增。ASN结点还允许16位常数结点被共享,这对于在MIPS平台上的相邻存储器存取的有效转换来说是有用的。
以每次转换一条源指令的方式来转换指令的基本块。每一条源指令导致形成(实现)一棵IR树。在生成针对一条给定指令的IR树之后,它被整合到针对当前块的工作IR森林中。工作IR森林的根是抽象寄存器,后者对应于源寄存器和源体系结构的其它特征。当最后一条源指令已经被解码、实现,并且它的IR树被整合到工作IR森林之后,针对所述块的IR森林完成。
在图12中,第一源指令310是“lui al Ox1234”。这条指令310的语义是将常数值Ox1234加载到源寄存器“al”342的高16位。这条指令310实现了具有一个立即数字段常数值Ox1234的MIPS_MIPS_LUI结点344。转换器通过设置抽象寄存器“al”342(源指令的目标寄存器),使之指向MIPS_MIPS_LUI IR结点344,来把这个结点添加到工作IR森林。
在图12所示的同一实例中,第二源指令312为“ori al,al,Ox5678”。这条指令312的语义是执行常数值Ox5678和源寄存器“al”342的当前内容的按位或运算,并且将结果存储在源寄存器“al”346之中。这条指令312实现了具有一个立即数字段常数数值Ox5678的MIPS_MIPS_ORI结点348。转换器通过首先设置ORI结点,使之指向由抽象寄存器“al”342(源指令的源寄存器)当前所指向的IR树,并且,随后设置抽象寄存器“al”346(源指令的目标寄存器),使之指向ORI结点348,把这个结点添加到工作IR森林。换句话说,以抽象寄存器342(即,LUI结点)为根的现有的“al”树变为ORI结点348的子树350,并且随后ORI结点348变为新的al树。旧的“al”树(在LUI之后,但是在ORI之前)以抽象寄存器342为根,并且被表示为被线345链接,而当前的“al”树(在ORI之后)以抽象寄存器346为根。
正如从上面可以看到的那样,根据本发明形成的一个改进的程序代码转换装置可以被配置用于任何源和目标处理器体系结构对,同时保持最佳的性能水平,并且在转换速度和已转换目标代码的效率之间取得平衡。而且,根据在转换中涉及的源和目标计算环境的特定的体系结构,通过利用在其中间表示中的基本结点、复杂结点、多形结点和体系结构专用结点的组合,本发明的程序代码转换装置可以被设计成具有通用和专用转换特征的混合设计。
在上述每一个实施例中,单独地描述了根据本发明的改进的程序代码转换装置的不同结构。然而,本发明的发明人充分注意到,这里所描述的每一个实施例的各个单独的方面可以与这里所描述的其它实施例相结合。例如,根据本发明而构成的转换器可以包括各种IR类型的混合优化。本领域的技术人员将理解,在不离开本发明的范围和精神实质的前提下,可以配置对刚刚描述的优选实施例的调适和修改。因此,需要理解的是,在所附的权利要求书的范围内,可以以不同于在这里专门地描述的方式来实施本发明。
虽然已经展示和描述几个优选实施例,但是,本领域的技术人员将理解,在不离开如所附的权利要求书所规定的本发明的范围的前提下,可以作出各种各样的变更和修改。
注意到与本说明书(结合本申请书)同时或在这之前申请的、对公众公开的所有论文和文献,并且所有这些论文和文献的内容在此通过参考而并入。
在本说明书中(包括任何附带的权利要求书、摘要和附图)所公开的所有特征,和/或所公开的任何方法或工艺的所有步骤,都可以以任何组合方式加以组合,但是在其中至少某些这样的特征和/或步骤互相排斥的组合除外。
在本说明书中(包括任何附带的权利要求书、摘要和附图)所公开的每一项特征,除非另有特别的说明,都可以被为此服务的可替代的特征、等价物或者类似的用途所替代。因此,除非另有特别的说明,所公开的每一项特征仅仅是等价物或者类似特征的一般系列中的一个实例。
本发明并不局限于上述(各)实施例的细节。本发明可以扩展到在本说明书(包括任何附带的权利要求书、摘要和附图)中所公开的各项特征中的任何新的一种,或者任何新的组合,或者扩展到所公开的任何方法或工艺的各步骤的任何新的一种,或者任何新的组合。
权利要求
1.一种将源体系结构的源代码转换为目标体系结构的目标代码的方法,包括计算机实施的下列步骤解码所述源代码,并生成包括专用于源体系结构的多个源体系结构专用结点的中间表示;将所述源体系结构专用结点转换为专用于目标体系结构的目标体系结构专用结点;以及从所述中间表示生成目标代码,包括从所述目标体系结构专用结点生成目标代码指令。
2.根据权利要求1所述方法,其中,所述源体系结构专用结点的至少一个包括专门化的转换部件,生成一个或多个相应的目标体系结构专用结点,其中,所述专门化的转换部件专用于源体系结构目标体系结构对。
3.根据权利要求1所述方法,其中,所述目标体系结构专用结点的至少一个包括实施部件,调用所述实施部件以便从所述目标体系结构专用结点生成目标代码指令。
4.根据权利要求1所述方法,其中,所述多个源体系结构专用结点的每一个与源体系结构中的各自的指令类型相关联。
5.根据权利要求1所述方法,其中,所述目标体系结构专用结点的每一个与目标体系结构中的特定指令类型相关联。
6.根据权利要求1所述方法,其中,生成目标代码的步骤包括从每一个各自的目标体系结构专用结点生成一个目标代码指令。
7.根据权利要求2所述方法,其中,所述多个源体系结构专用结点的至少一个进一步包括表示各自的源代码指令的语义的数据部件。
8.根据权利要求3的方法,其中,所述目标体系结构专用指令的至少一个进一步包括表示各自的目标代码指令的语义的数据部件。
9.根据权利要求1的方法,其中,生成中间表示的步骤进一步包括生成通用于源体系结构和目标体系结构的至少一个基本结点。
10.根据权利要求1的方法,其中,所述转换步骤进一步包括将所述源体系结构专用结点的至少一个转换为通用于源体系结构和目标体系结构的一个或多个基本结点;以及生成目标代码的步骤进一步包括从所述一个或多个基本结点生成目标代码指令。
11.根据权利要求10的方法,其中,所述源体系结构专用结点的至少一个包括生成一个或多个基本结点的通用转换部件。
12.根据权利要求1的方法,还包括下列步骤执行所述多个源体系结构专用结点的源体系结构专用优化。
13.根据权利要求1的方法,还包括下列步骤执行所述目标体系结构专用结点的目标体系结构专用优化。
14.一种计算机可读存储介质,具有驻留于其上的计算机可读代码形式的转换器软件,所述软件可由计算机执行以便执行下列步骤解码所述源代码,并生成包括专用于源体系结构的多个源体系结构专用结点的中间表示;将所述源体系结构专用结点转换为专用于目标体系结构的目标体系结构专用结点;以及从所述中间表示生成目标代码,包括从所述目标体系结构专用结点生成目标代码指令。
15.一种用于目标计算环境的转换器装置,它具有处理器和连接到所述处理器的存储器,用于将能够在源体系结构上执行的源代码转换为能够在目标计算环境的目标体系结构上执行的目标程序代码,其中,所述转换器装置包括解码器单元,用于解码所述源代码,并生成包括专用于源体系结构的多个源体系结构专用结点的中间表示;转换器单元,用于所述源体系结构专用结点转换为专用于目标体系结构的目标体系结构专用结点;以及生成器单元,用于从所述中间表示生成目标代码,包括从所述目标体系结构专用结点生成目标代码指令。
全文摘要
一种用于程序代码转换装置的改进的体系结构和生成用于程序代码转换的中间表示的方法。所述程序代码转换装置确定在待转换的源代码的中间表示中,生成哪一种类型的IR结点。根据转换中所涉及的特定源和目标计算环境,程序代码转换装置在生成中间表示的过程中,使用基本结点、复杂结点、多形结点和体系结构专用结点,或者它们的某种组合。
文档编号G06F9/45GK1975674SQ200610171108
公开日2007年6月6日 申请日期2004年4月28日 优先权日2003年5月2日
发明者丹尼尔·欧文, 强纳森·J.·安德鲁斯, 麦尔斯·P.·豪森, 大卫·海克尼 申请人:可递有限公司