CN1823322A - 用于程序代码转换的共享代码缓存方法及设备 - Google Patents

用于程序代码转换的共享代码缓存方法及设备 Download PDF

Info

Publication number
CN1823322A
CN1823322A CN200480020101.XA CN200480020101A CN1823322A CN 1823322 A CN1823322 A CN 1823322A CN 200480020101 A CN200480020101 A CN 200480020101A CN 1823322 A CN1823322 A CN 1823322A
Authority
CN
China
Prior art keywords
code
register
source
translater
translation
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.)
Granted
Application number
CN200480020101.XA
Other languages
English (en)
Other versions
CN100458687C (zh
Inventor
杰兰特·诺斯
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
IBM United Kingdom Ltd
International Business Machines Corp
Original Assignee
Transitive Ltd
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Transitive Ltd filed Critical Transitive Ltd
Publication of CN1823322A publication Critical patent/CN1823322A/zh
Application granted granted Critical
Publication of CN100458687C publication Critical patent/CN100458687C/zh
Anticipated expiration legal-status Critical
Expired - Lifetime legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/44Arrangements for executing specific programs
    • G06F9/455Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
    • G06F9/45504Abstract machines for programme code execution, e.g. Java virtual machine [JVM], interpreters, emulators
    • G06F9/45516Runtime code conversion or optimisation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/38Concurrent instruction execution, e.g. pipeline or look ahead
    • G06F9/3802Instruction prefetching
    • G06F9/3812Instruction prefetching with instruction modification, e.g. store into instruction stream

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Devices For Executing Special Programs (AREA)
  • Memory System Of A Hierarchy Structure (AREA)

Abstract

在程序运行过程中,源程序代码以基本块为单位被翻译成目标代码(21),其中基本程序模块的翻译是和翻译结果的执行过程相互交织的。增加共享代码缓存机制以长期存储源代码的翻译结果,使得翻译器可以重用由此前的翻译器实例生成的和/或优化的翻译结果。

Description

用于程序代码转换的共享代码缓存方法及设备
技术领域
本发明一般地涉及计算机和计算机软件领域,尤其涉及例如用于代码翻译器、模拟器和加速器中的程序代码转换方法和设备。
背景技术
在嵌入式和非嵌入式的CPU中,人们发现流行的指令集架构(ISA),对于其存在大量能够被“加速”用于性能或者被“翻译”为多个有效率的处理器(capable processor),如果这些处理器能够透明地访问相关软件,那么他们可表现出更好的成本/性能优势。人们还发现主流的CPU架构被及时锁定到他们的指令集架构,并且无法在性能或市场接触程度上取得发展。这种架构将从“合成CPU”共架构中获益。
程序代码转换方法及设备促进了这种加速、翻译以及共架构能力,其例如在标题为“程序代码转换”的WO 00/22521中被提出。
发明内容
根据本发明,提供了如所附的权利要求中阐明的设备及方法。本发明的优选特征在从属权利要求以及下文的描述中将是显而易见的。
以下是对根据本发明各种实施例的不同方面及可实现的优点的综述。这被提供作为帮助本领域技术人员更快地理解后面的详细设计讨论的介绍,而并不是而且不试图以任何方式限制本文所附权利要求的范围。
根据这种理解,发明人在以下公开了针对加速程序代码转换的技术,结合用于将源程序代码翻译成目标代码的运行(run-time)翻译器尤其有用。特别地,提供共享代码缓存机制,用于存储源码(subjectcode)翻译结果以再次使用。在一种实施方式中,由一个翻译器实例生成的源码被缓存,以被后续的翻译器实例再次使用。还提供了这种机制的其它各种实施方式、实施例以及改进。
附图说明
包含在说明书中并构成说明书的一部分的附图表示了当前优选实施方式,附图被描述如下:
附图1是其中应用本发明实施例的设备的框图;
附图2是阐述运行翻译处理以及处理期间生成的相应IR(中间表示)的示意图;
附图3是阐述依据本发明示例性实施例的基本块数据结构及缓存的示意图;
附图4是阐述扩展的基本块处理的流程图;
附图5是阐述等同分块(isoblocking)的流程图;
附图6是阐述组分块和附随的最优化的流程图;
附图7是阐述组分块优化的例子的示意图;
附图8是阐述运行翻译的流程图,包括扩展的基本分块、等同分块和组分块;
附图9是阐述共享代码缓存处理的主要方面的流程图;
附图10是进一步阐述共享代码缓存处理的流程图;
附图11是阐述缓存单元例子的示意图;
附图12是阐述翻译器实例和本地代码缓存及服务器的示意图;
附图13是阐述翻译器实例和远程代码缓存及服务器的示意图;
附图14是阐述在不是协同翻译器代码的不同系统上运行的缓存服务器的示意图;
附图15表示系统的示意图,其中缓存服务器是共享多个缓存的被连接处理的网络。
附图16是阐述缓存进化的流程图;
附图17是阐述其中多个翻译器实例使用相同缓存单元结构的系统的示意图;以及
附图18和19的示意图分别阐述了缓存插入策略以及缓存查找策略的实施方式。
具体实施方式
接下来,附图1到8阐明程序代码转换中可用的方法、设备以及程序代码。附图9阐明例如可用于诸如附图1-8中所阐明的程序代码转换系统中的共享代码缓存技术的各种方面。
附图1表示了包括目标寄存器15的目标处理器13以及存储器,存储器存储许多软件成分19、20、21,并且提供包括基本块缓存23、全局寄存器储存器27以及要被翻译的源码17的工作存储区。软件成分包括操作系统20、翻译器代码19、翻译后的代码21。翻译器代码19可以例如作为将一种ISA的源码翻译为另一种ISA的翻译后的代码的模拟器或作为用于将源码翻译成相同ISA的翻译后的代码的加速器来工作。
翻译器19,即实现翻译器的源代码的编译后的版本,以及翻译后的代码21,即由翻译器19产生的源码17的翻译结果,与操作系统20,诸如运行在目标处理器13上的UNIX,协同运行,典型地,目标处理器13为微处理器或者其他适当的计算机,。应该认识到,附图1中表示的结构仅仅是示例性的,并且例如,依据本发明的软件、方法和处理可以用驻留在操作系统内或下的代码来实现。源码、翻译器代码、操作系统以及存储机制可以是本领域技术人员所已知的大量种类中的任意一种。
在依据附图1的设备中,程序代码转换优选地在运行时被动态执行,同时翻译后的代码21正在运行。翻译器19根据翻译后的程序21运行。翻译处理的执行路径是控制环路,包括以下步骤:执行翻译器代码19,将一块源码17翻译成翻译后的代码21,然后执行这块翻译后的代码;每一块翻译后的代码的结尾都包含将控制返回到翻译器代码19的指令。换句话说,翻译和随后执行源码的步骤是交错的,使得每次只有源程序17的部分被翻译,并且在后续基本块的翻译之前执行第一基本块的翻译后的代码。翻译器的基本翻译单位是基本块,这意味着翻译器19每次一个基本块地翻译源码17。形式上,基本块被定义为具有正好一个入口点和正好一个出口点的代码段,这将块代码限定到一个控制路径上。因此,基本块是控制流的基本单位。
在生成翻译后的代码21的处理中,基于源指令(subjectinstruction)序列生成中间表示(“IR”)树。IR树是由源程序所计算的表达式以及所执行的操作的抽象表示。随后,基于IR树生成翻译后的代码21。
这里描述的IR节点的集合被通称为“树”。我们注意到,在形式上,这种结构实际上是定向非循环图(DAG),而不是树。树的正式定义要求每个节点具有至多一个父节点。由于在IR生成的过程中,描述的实施例使用公共子表达式消除,因此节点经常具有多个父节点。例如,标志影响指令结果的IR可以被两个抽象寄存器表示,这两个抽象寄存器对应于目标源寄存器(destination subject register)以及标志结果参数。
例如,源指令“add%r1,%r2,%r3”执行源寄存器%r2和%r3的内容的加法,并将结果存储在源寄存器%r1中。因而,这个指令对应于抽象表达式“%r1=%r2+%r3”。这个例子包含用包含两个表示指令操作数%r2和%r3的子表达式的加法表达式定义抽象寄存器%r1。在源程序17的语境中,这些子表达式可对应于其他先前的源指令,或者他们可表示当前指令的细节,诸如紧接着的常数值。
在分析“add”指令的时候,生成新的“+”IR节点,对应于加法的抽象数学运算符。“+”IR节点存储对表示操作数的其他IR节点的引用(在IR中表示为子表达式树,通常保存在源寄存器中)。“+”节点自身被源寄存器引用,其定义源寄存器的值(%r1的抽象寄存器,指令的目标寄存器)。例如,附图20的右中部分显示了对应于X86指令“add%ecx,%edx”的IR树。
本领域技术人员可以想到,在一个实施例中,翻译器19是用诸如C++之类的面向对象的编程语言来实现的。例如,IR节点被实现为C++对象,对其他节点的引用被实现为对对应于那些其他节点的C++对象的C++引用。因此,IR树被实现为IR节点对象的集合,包含对每个节点的各种引用。
而且,在正在讨论的实施例中,IR生成过程使用一组抽象寄存器。这些抽象寄存器对应于源架构(subject architecture)的特定特征。例如,对于源架构上的每个物理寄存器(“源寄存器”)存在唯一的抽象寄存器。类似地,对于源架构上出现的每个条件代码标志存在唯一的抽象寄存器。在IR生成过程中,抽象寄存器用作IR树的占位符。例如,通过与源寄存器%r2的抽象寄存器相关的特定IR表达式树来表示源指令序列中给定点上的源寄存器%r2的值。在一个实施例中,抽象寄存器被实现为通过对特定IR树的根接点对象的C++引用而与该树相关的C++对象。
在上述说明性的指令序列中,当分析“add”指令之前的源指令期间,翻译器已经生成对应于%r2和%r3的值的IR树。换句话说,计算%r2和%r3的值的子表达式已经被表示为IR树。当生成“add%r1,%r2,%r3”指令的IR树时,新的“+”节点包含对%r2和%r3的IR子树的引用。
抽象寄存器的实现被分入翻译器代码19和翻译后的代码21的各部分之间。在翻译器19中,“抽象寄存器”是在IR生成过程中所使用的占位符,使得抽象寄存器与计算特定抽象寄存器所对应的源寄存器的值的IR树相关联。因此,翻译器中的抽象寄存器可以被实现为包含对IR节点对象(即IR树)的引用的C++对象。被抽象寄存器组引用的所有IR树的集合被称为工作IR森林(“森林”,因为它包含分别对应于IR树的多个抽象寄存器根)。工作IR森林表示源码特定点上的源程序的抽象运算的简短描述。
在翻译后的代码21中,“抽象寄存器”是全局寄存器储存器中的特定位置,源寄存器值与实际目标寄存器被同步到该位置以及从该位置同步。可选地,当已经从全局寄存器储存器中加载一个值时,翻译后的代码21中的抽象寄存器可以被理解为在被存储回寄存器储存器之前暂时保存在执行翻译后的代码21期间的源寄存器值的目标寄存器15。
上述程序翻译的例子在附图2中被阐明。附图2表示两个X86指令基本块的翻译,以及在翻译处理中生成的相应IR树。附图2的左侧表示在翻译过程中翻译器19的执行路径。在步骤151中,翻译器19将源码的第一基本块153翻译为目标代码21,然后在步骤155中执行那个目标代码21。当目标代码21完成执行时,将控制返回到翻译器19,步骤157,其中翻译器将源码17的下一基本块159翻译成目标代码21,然后执行那个目标代码21,步骤161,等等。
在将源码的第一基本块153翻译成目标代码的过程中,翻译器19基于基本块153生成IR树163。在这个例子中,IR树163是由源指令“add %ecx,%edx,”生成的,这条源指令是标志影响指令。在生成IR树163的过程中,这条指令定义了四个抽象寄存器:目标抽象寄存器%ecx 167、第一标志影响指令参数169、第二标志影响指令参数171、以及标志影响指令结果173。对应于“add”指令的IR树是“+”运算符175(即算术加法),其操作数是源寄存器%ecx 177和%edx 179。
因此,通过存储标志影响指令的参数及结果,第一基本块153的模拟将标志设置为未决状态。标志影响指令是“add %ecx,%edx”。指令参数是模拟的源寄存器%ecx 177和%edx 179的当前值。源寄存器应用177、179之前的“@”符号表示源寄存器的值是分别从全局寄存器储存器中、从对应于%ecx和%edx的位置中检索的,因为这些特定源寄存器先前没有被当前基本块加载。这些参数值随后被存储在第一和第二标志参数抽象寄存器169、171中。加法运算175的结果被存储在标志结果抽象寄存器173中。
在生成IR树之后,基于IR生成相应的目标代码21。根据一般IR生成目标代码21的处理在本领域中是公知的。目标代码被插入到翻译后的块的末尾,以将抽象寄存器,包括用于标志结果173和标志参数169、171的抽象寄存器,保存到全局寄存器储存器27。在生成目标代码之后,然后执行目标代码,步骤155。
附图2表示交错的翻译和执行的例子。首先,翻译器19基于第一基本块153的源指令17生成翻译后的代码21,随后执行基本块153的翻译后的代码。在第一基本块153结尾处,翻译后的代码21将控制返回到翻译器19,翻译器19然后翻译第二基本块159。第二基本块161的翻译后的代码21随后被执行。在第二基本块159执行结束时,翻译后的代码将控制返回到翻译器19,翻译器19然后翻译下一基本块,以此类推。
因而,在翻译器19下运行的源程序具有以交错方式执行的两种不同类型的代码:翻译器代码19以及翻译后的代码21。翻译器代码19是由编译器在运行之前基于翻译器19的高级源代码实现而生成的。翻译后的代码21是在运行的整个过程中由翻译器代码19基于被翻译的程序的源码17而生成的。
源处理器状态的表示同样被分入翻译器19和翻译后的代码21部分之间。翻译器19将源处理器状态存储在多种显式编程语言设备中,诸如变量和/或对象;用于编译翻译器的编译器确定状态和运算如何在目标代码中被实现。相比之下,翻译后的代码21将源处理器状态隐式存储在目标寄存器以及存储单元中,这些目标寄存器和存储单元直接由被翻译的代码21的目标指令来控制。
例如,全局寄存器储存器27的低级表示仅仅是被分配存储器的区域。这就是翻译后的代码21通过在定义的存储器区域和各种目标寄存器之间存储和恢复如何查看抽象寄存器以及如何与之进行交互。然而,在翻译器19的源代码中,全局寄存器储存器27是数据阵列或可在更高级被存取和控制的对象。对于被翻译的代码21,完全没有高级表示。
在某些情况下,在翻译器19中是静态的或者可静态确定的源处理器状态被直接编码为翻译后的代码21,而不是被动态地计算。例如,翻译器19可以生成根据最后的标志影响指令的指令类型而特性化的编译后的代码21,这表示,如果最后的标志影响指令的指令类型改变,则对于同一基本块,翻译器可生成不同的目标代码。
翻译器19包含对应于每个基本块翻译的数据结构,这特别有利于扩展的基本块、等同块(isoblock)、组块以及缓存的翻译状态优化,如下所述。附图3表示这样的基本块数据结构30,它包括源地址(subject address)31、目标代码指针33(即翻译后的代码的目标地址)、翻译提示34、入口和出口条件35、概述度量(profiling metric)37、对前继和后续基本块数据结构的引用38、39、以及入口寄存器映射40。附图3进一步阐明了基本块缓存23,基本块缓存23是基本块数据结构,例如以源地址索引的30、41、42、43、44......,的集合。在一个实施例中,对应于特定的翻译后的基本块的数据可以被存储在C++对象中。在翻译基本块时,翻译器创建新的基本块对象。
基本块的源地址31是该基本块在源程序17的存储器空间中的起始地址,也就是说,如果源程序17正在源架构上运行,则基本块被定位的存储单元。这也被称为源起始地址。当每个基本块对应一定范围的源地址(每条源指令对应一个地址)时,源起始地址是基本块中第一指令的源地址。
基本块的目标地址33是翻译后的代码21在目标程序中的存储单元(起始地址)。目标地址33也被称为目标代码指针或目标起始地址。为了执行翻译后的块,翻译器19将目标地址作为被间接访问(dereference)以调用(将控制转移到)翻译后的代码的函数指针。
基本块数据结构30、41、42、43...被存储在基本块缓存23中,基本块缓存是通过源地址组织的基本块对象仓库。当基本块的翻译后的代码完成执行时,它将控制返回到翻译器19,还将基本块的目标(后续)源地址31的值返回到翻译器。为了确定后续基本块是否已经被翻译,翻译器19将目标源地址31与基本块缓存23中的基本块(即那些已经被翻译的基本块)的源地址31相比较。仍然没有被翻译的基本块被翻译,然后被执行。仅仅执行已经被翻译(并且具有兼容入口条件,如下所述)的基本块。随着时间的流逝,许多碰到的基本块将已经被翻译,这使得降低增加的翻译成本。这样,由于越来越少的模块需要翻译,所以随时间的流逝翻译器19越来越快。
扩展的基本块
根据所示实施例而应用的一种优化是通过被称为“扩展的基本块”的技术来增加代码生成的范围。在基本块A只有一个后续块(例如基本块B)的情况下,翻译器可能能够静态地确定(当A被解码时)B的源地址。在这种情况下,基本块A和B被合并到一个被称为扩展的基本块的块(A’)中。其差别之处在于,扩展的基本块机制能够被应用到其目的地可静态确定的无条件跳转上;如果跳转是有条件的或者如果目的地不能被静态地确定,那么必须形成单独的基本块。扩展的基本块在形式上可以仍然是基本块,因为在删除从A到B的中间跳转(intervening jump)之后,块A’的代码只有一个控制流,并因此在AB边界处不需要同步。
即使A具有包括B的多个可能的后续块,扩展的基本块也可以被用于将A扩展到B,用于特定的执行,其中B是实际的后续块并且B’的地址是可静态确定的。
可静态确定的地址是指翻译器在解码期间能够确定的那些地址。在构建块的IR森林期间,为与目标地址抽象寄存器相关的目标源地址构建IR树。如果目标地址IR树的值是可静态确定的(即不依赖于动态的或运行的源寄存器值),那么后续块是可静态确定的。例如,在无条件跳转指令的情况下,包含目标地址(即后续块的源起始地址)隐式地在跳转指令本身中;跳转指令的源地址加上编码在跳转指令中的偏移量就等于目标地址。同样,常量合并(例如X+(2+3)=>X+5)和表达式合并(例如(X*5)*10=>X*50)的优化可使否则为“动态的”目标地址变为可静态确定的。因而,目标地址的计算包括从目标地址IR中提取常量值。
在创建扩展的基本块A’时,翻译器随后对块A’进行处理,其处理方式与在执行IR生成、优化以及代码生成时任意其他基本块的处理方式一样。由于代码生成算法正运行在更大的范围上(即组合的基本块A和B的代码),因此翻译器19生成更优化的代码。
正如本领域技术人员将意识到的那样,解码是从源码中提取各个源指令的处理。源码作为无格式的字节流被存储(即存储器中的字节集合)。在具有可变长度指令的源架构情况下(例如X86),解码首先需要识别指令边界;在固定长度指令架构的情况下,识别指令边界没有什么意义(例如,在MIPS上,每4个字节是一个指令)。随后,对构成给定指令的字节应用源指令格式,以提取指令数据(即指令类型、操作数寄存器数量、中间字段的值、以及编码在指令中的任何其他信息)。利用已知架构的指令格式由无格式字节流解码该架构的机器指令的处理在本领域中是公知的。
附图4阐明了扩展的基本块的创建。当最早的合法基本块(A)被解码时,一组能够成为扩展基本块的组分子基本块被检测。如果翻译器19检测到A的后续块(B)是可静态确定的51,它计算B的起始地址53,并随后在B的起始地址处继续解码处理。如果B的后续块(C)被确定为是可静态确定的55,解码处理前进到C的起始地址,以此类推。当然,如果后续块不是可静态确定的,则正常的翻译和执行继续61、63、65。
在所有基本块解码的过程中,工作IR森林包括IR树,以计算当前块的后续块的源地址31(即,目标源地址;翻译器具有目标地址的专用抽象寄存器)。在扩展的基本块的情况下,为了补偿消除了中间跳转这个事实,当每个新的组分基本块被解码处理吸收(assimilate)时,用于计算块源地址的IR树被删除54(附图4)。换句话说,当翻译器19静态地计算B的地址以及解码在B的起始地址上继续执行时,对应于动态计算B的源地址31的IR树(其在解码A的过程中被构建)被删除;当解码前进到C的起始地址时,对应于C的源地址的IR树被删除59;等等。“删除”IR树意味着删除目标地址抽象寄存器所依赖的、而且没有其他抽象寄存器依赖的任何IR节点。其差别之处在于,删除中断了IR树和目标抽象寄存器之间的链接;到相同IR树的任何其他链接仍然不受影响。在某些情况下,删除的IR树也可以被其他抽象寄存器所依赖,在这种情况下,IR树仍然保持源程序的执行语义。
为了防止代码激增(通常,抑制这种代码特性化技术的缓和因素),翻译器将扩展的基本块限制在某个最大数量的源指令。在一个实施例中,扩展的基本块被限制为最多200条源指令。
等同块
在所示的实施例中实现的另一优化就是所谓的“等同分块”。根据这种技术,基本块的翻译根据兼容性列表而被参数化或特性化,兼容性列表是一组描述源处理器状态和翻译器状态的可变条件。对于每一种源架构,兼容性列表都是不同的,以考虑不同的架构特征。在特定基本块翻译的入口和出口处的兼容性条件的实际值被分别称为入口条件和出口条件。
如果执行到达已经被翻译、但是前一翻译的入口条件与当前工作条件(即前一块的出口条件)不同的基本块,那么基本块这次必须基于当前工作条件重新被翻译。结果是,相同源码基本块现在由多个目标代码翻译表示。同一基本块的这些不同翻译被称为等同块。
为了支持等同块,与每一个基本块翻译相关的数据包括一组入口条件35和一组出口条件36(附图3)。在一个实施例中,基本块缓存23首先由源地址31组织,然后由入口条件35、36组织(附图3)。在另一实施例中,当翻译器向基本块缓存23查询源地址31时,查询可返回多个翻译后的基本块(等同块)。
附图5阐明了等同块的使用。在第一被翻译的块的执行结束之后处,翻译后的代码21计算并且返回下一块(即后续块)71的源地址。然后将控制返回到翻译器19,如同虚线73所划分的那样。在翻译器19中,利用返回的源地址31查询基本块缓存23,步骤75。基本块缓存可以返回0个、1个或者多于一个具有相同源地址31的基本块数据结构。如果基本块缓存23返回0个数据结构(这意味着,这个基本块还没有被翻译),那么这个数据块必须被翻译器19翻译,步骤77。基本块缓存23返回的每个数据结构对应于源码的同一基本块的不同翻译(等同块)。如在菱形判定框79中所示,如果(第一被翻译的块的)当前出口条件与由基本块缓存23返回的任何数据结构的入口条件不匹配,则基本块必须被重新翻译,步骤81,这次根据那些出口条件而参数化。如果当前出口条件与由基本块缓存23返回的一个数据结构的入口条件匹配,则该翻译是兼容的并且不需要重新翻译就能够被执行,步骤83。在所示的实施例中,翻译器19通过间接访问作为函数指针的目标地址来执行兼容的翻译后的块。
如上所述,优选地根据兼容性列表来参数化基本块翻译。现在将针对X86和PowerPC架构来描述说明性的兼容性列表。
X86架构的说明性兼容性列表包括以下表示:(1)源寄存器的迟缓传播(lazy propagation);(2)重叠抽象寄存器;(3)未决条件代码标志影响指令的类型;(4)条件代码标志影响指令参数的迟缓传播;(5)字符串复制操作的方向;(6)源处理器的浮点单元(FPU)模式;以及(7)段寄存器的修改。
X86架构的兼容性列表包括任何通过翻译器的源寄存器的迟缓传播的表示,也称为寄存器别称。寄存器别称出现在翻译器知道两个源寄存器在基本块边界处包含相同值的时候。只要源寄存器的值保持相同,相应抽象寄存器中只有一个通过将其保存到全局寄存器储存器中而被同步。在被保存的源寄存器被覆写之前,对未保存的寄存器的引用就简单地使用或者复制(通过移动指令)被保存的寄存器。这避免了在翻译后的代码中的两个存储器存取(保存+恢复)。
X86架构的兼容性列表包括当前被定义的重叠抽象寄存器的表示。在某些情况下,源架构包括多个重叠源寄存器,翻译器利用多个抽象寄存器表示这些重叠源寄存器。例如,利用多个重叠抽象寄存器表示可变宽度的源寄存器,每个存取大小一个重叠抽象寄存器。例如,可以利用下列分别具有相应抽象寄存器的源寄存器中的任意一个来存取X86的“EAX”寄存器:EAX(位31...0)、AX(位15...0)、AH(位15...8)、以及AL(位7...0)。
对于每个整数和浮点条件代码标志,X86架构的兼容性列表包括标志值是否被规范化或者是未决的表示,并且如果标志值是未决的,那么兼容性列表还包括未决标志影响指令的类型。
X86架构的兼容性列表包括条件代码标志影响指令参数的寄存器别称的表示(如果某个源寄存器仍然保持标志影响指令参数的值,或者如果第二参数的值与第一参数的值相同)。兼容性列表还包括第二参数是否是小常量(即中间指令候选)的表示,并且假如是,则兼容性列表还包括第二参数的值。
X86架构的兼容性列表包括源程序中字符串复制操作的当前方向的表示。这个条件字段指示字符串复制操作在存储器中是向上移动还是向下移动。这通过根据函数方向自变量而参数化翻译来支持“strcpy()”函数调用的代码特性化。
X86架构的兼容性列表包括源处理器的FPU模式的表示。FPU模式指示源浮点指令是运行在32位模式还是64位模式。
X86架构的兼容性列表包括段寄存器的修改的表示。所有的X86指令存储器引用是基于六个存储器段寄存器之一的:CS(代码段)、DS(数据段)、SS(堆栈段)、ES(附加数据段)、FS(通用段)以及GS(通用段)。在正常情况下,应用程序不修改段寄存器。这样,假如段寄存器值保持不边,那么以缺省方式特性化代码生成。然而,对于程序来说可能要修改它的段寄存器,在这种情况下,相应的段寄存器兼容性位将被置位,使翻译器利用适当的段寄存器动态值来生成用于通用存储器存取的代码。
PowerPC架构的兼容性列表的说明性实施例包括以下的表示:(1)重整寄存器(mangled register);(2)链接值传播;(3)未决条件代码标志影响指令的类型;(4)条件代码标志影响指令参数的迟缓传播;(5)条件代码标志值别称;以及(6)累加溢出标志同步状态。
PowerPC架构的兼容性列表包括重整寄存器的表示。在源码包含多个连续的、将源寄存器用于基地址的存储器存取的情况下,翻译器可以利用重整目标寄存器来翻译那些存储器存取。在源程序数据在目标存储器中所处的地址与它在源存储器中的地址不同的情况下,翻译器必须包括由源码计算的在每个存储器地址中的目标偏移。当源寄存器包含源基地址时,重整目标寄存器包含对应于这个源基地址的目标地址(即源基地址+目标偏移)。随着寄存器重整,通过直接对存储在重整寄存器中的目标基地址应用源码偏移,能够更有效率地翻译存储器存取。相比之下,如果没有重整寄存器机制,那么这种情况可能需要对用于每个存储器存取的目标代码进行额外的控制,以空间和执行时间为代价。兼容性列表指出如果存在,则哪些抽象寄存器被重整。
PowerPC架构的兼容性列表包括链接值传播的表示。对于叶子函数(leaf function)(即不调用其他函数的函数)来说,函数体可被扩展到调用/返回位置(如上面讨论的扩展的基本块机制)。因此,函数体和跟随在函数返回后的代码被一起翻译。这也被称为函数返回特性化,因为这种翻译包括来自函数返回位置的代码,并因此根据返回位置被特性化。特定块翻译是否使用了链接值传播被反映在出口条件中。这样,当翻译器碰到其翻译使用了链接值传播的块时,必须估计当前返回位置是否与先前的返回位置相同。函数返回到与调用它们时的位置相同的位置上,因而调用位置和返回位置实际上是一样的(偏移为1或2条指令)。因此,翻译器能够通过比较各自调用位置来确定返回位置是否相同;这相当于比较(函数块的先前和当前执行的)各自前继块的源地址。这样,在支持链接值传播的实施例中,与每个基本块翻译相关的数据包括对前继块翻译(或者前继块的源地址的某种其它表示)的引用。
PowerPC架构的兼容性列表包括,对于每个整数和浮点条件代码标志,标志值被规范化还是未决的表示,并且如果标志值是未决的,那么兼容性列表还包括未决标志影响指令的类型。
PowerPC的兼容性列表包括用于标志影响指令参数的寄存器别称的表示(如果标志影响指令参数值恰好在源寄存器中是活动的(live),或者如果第二参数的值和第一参数的值相同)。兼容性列表还包括第二参数是否是小常量(即中间指令候选)的表示,并且如果是,那么兼容性列表包含第二参数的值。
PowerPC架构的兼容性列表包括PowerPC条件代码标志值的寄存器别称的表示。PowerPC架构包括用于把整组PowerPC标志显式地加载到通用(源)寄存器中的指令。源寄存器中的源标志值的这个显式表示不利于翻译器的条件代码标志模拟优化。兼容性列表包含标志值在源寄存器中是否是活动的表示,以及如果是,还包含哪个寄存器的表示。在IR生成过程中,在这样的源寄存器保存标志值期间对该源寄存器的引用被翻译成对相应抽象寄存器的引用。这种机制消除了在目标寄存器中显式地计算和存储源标志值的必要性,这反过来允许翻译器使用标准条件代码标志优化。
PowerPC架构的兼容性列表包含累加溢出同步的表示。这个字段指示八个累加溢出条件位中的哪一个位当前与全局累加溢出位相关联。当PowerPC的八个条件字段中的一个被更新时,如果全局累加溢出位被置位,那么它被复制到特定条件代码字段中的相应累加溢出位。
翻译提示
在所示的实施例中实现的另一种优化采用附图3的基本块数据结构的翻译提示34。这种优化源于认识到存在特定于特定基本块、但对于该块的每个翻译是相同的静态基本块数据。对于某些类型的计算花费高的静态数据,更有效率的是,翻译器在相应块的第一次翻译过程中计算该数据,然后存储结果用于同一块的将来的翻译。由于这个数据对于同一块的每个翻译都是相同的,所以它不对翻译进行参数化,因而在形式上它不是块的兼容性列表(上面讨论的)的一部分。高花费的静态数据仍然存储在与每个基本块翻译相关的数据中,然而保存数据比重新计算数据花费更低。在同一块的随后的翻译中,即使翻译器19不能重新使用先前的翻译,翻译器19也能够利用这些“翻译提示”(即缓存的静态数据)来减少第二以及再往后的翻译的翻译成本。
在一个实施例中,与每个基本块翻译相关的数据包括翻译提示,翻译提示是在该块的第一翻译过程中被计算的,并且随后被复制(或者引用)到每个后续的翻译。
例如,在以C++实现的翻译器19中,翻译提示可以被实现为C++对象,在这种情况下,对应于同一块的不同翻译的基本块对象可分别存储对同一翻译提示对象的引用。可选地,在用C++实现的翻译器中,基本块缓存23可以为每个源基本块(而不是每个翻译)包含一个基本块对象,并且每个这种对象包含或者保持对相应翻译提示的引用;这种基本块对象还包括由入口条件组织的、对对应于该块的不同翻译的翻译对象的多个引用。
X86架构的说明性翻译提示包括以下表示:(1)初始指令前缀;以及(2)初始重复前缀。X86架构的这种翻译提示特别包括块的第一条指令中有多少前缀的表示。某些X86指令具有修改指令运算的前缀。这种架构特征使得很难对X86指令流进行解码(即花费昂贵)。一旦在块的第一解码期间确定了初始前缀的数量,则这个值被翻译器19存储为翻译提示,从而同一块的后续翻译就不需要重新确定它了。
X86架构的翻译提示进一步包括块中的第一条指令是否带有重复前缀的表示。某些X86指令,诸如字符串操作,具有重复前缀,重复前缀告诉处理器要多次执行那条指令。翻译提示指示这种前缀是否存在,并且如果存在则还指示它的值。
在一个实施例中,与每个基本块相关联的翻译提示另外还包含对应于那个基本块的完整的IR森林。这有效地缓存了所有由前端执行的解码和IR生成。在另一实施例中,翻译提示包括IR森林,因为其在被优化之前就存在。在另一实施例中,为了节约被翻译程序的存储器资源,IR森林不被缓存为翻译提示。
组块
在说明性的翻译器实施例中实现的另一优化是用于消除由于在每个翻译后的基本块的执行结束时必须同步所有抽象寄存器而产生的程序系统开销(overhead)。这种优化被称为组块优化。
正如上面所讨论的那样,在基本块模式中(例如附图2),利用所有翻译后的代码序列可存取的存储器区域,即全局寄存器储存器27,将状态从一个基本块传递到下一基本块。全局寄存器储存器27是抽象寄存器的仓库,每个抽象寄存器对应于以及模拟特定源寄存器的值或其他源架构特征。在翻译后的代码21的执行过程中,抽象寄存器被保存在目标寄存器中,从而它们可以参与指令。在翻译器代码21的执行过程中,抽象寄存器值被存储在全局寄存器储存器27或目标寄存器15中。
因而,在诸如附图2中所示的基本块模式中,由于以下两个原因,必须在每个基本块结束处对所有抽象寄存器进行同步:(1)控制返回到翻译器代码19,这潜在地覆写所有目标寄存器;以及(2)由于代码生成每次只查看一个基本块,因此翻译器19必须假设所有抽象寄存器值是活动的(即,将被用于后续的基本块),并因而必须被保存。组块优化机制的目标是通过将多个基本块翻译为连续的整体,从而减少在经常交叉的基本块边界上的同步。通过将多个基本块一起翻译,如果不能消除模块边界处的同步,也能够使同步最少。
在当前块的概述度量达到触发阈值时,触发组块构建。这个块被称为触发模块。构建可以被分成下列步骤(附图6):(1)选择成员块71;(2)对成员块进行排序73;(3)全局停用(dead)代码删除75;(4)全局寄存器分配77;以及(5)代码生成79。第一步71通过执行从触发块开始、并且由包含阈值(inclusion threshold)和最多成员限制调节的程序控制流图的深度优先搜索(DFS)遍历来识别将被包含在组块中的块集合。第二步73对这组块进行排序并识别贯穿组块的临界路径(critical path),以使能使同步代码最小并减少分支的高效代码布局。第三步和第四步75、77执行优化。最后一步79依次生成所有成员块的目标代码,从而产生具有高效寄存器分配的高效代码布局。
在构建组块以及由此生成目标代码中,翻译器19执行附图6中所示的步骤。当翻译器19碰到先前已经被翻译的基本块时,在执行该块之前,翻译器19参考触发阈值来检查块的概述度量37(附图3)。当基本块的概述度量37超过触发阈值时,翻译器19开始组块创建。翻译器19通过从触发块开始、并且由包含阈值和最多成员限制调节的遍历控制流图来识别组块的成员。接下来,翻译器19创建成员块的排序,其识别贯穿组块的临界路径。随后,翻译器19执行全局停用代码删除;翻译器19利用对应于每个块的IR来搜集每个成员块的寄存器活性信息。接下来,翻译器19根据特定于架构的策略来执行全局寄存器分配,这种特定于架构的策略定义所有成员块的统一寄存器映射的部分组。最后,翻译器19遵循全局寄存器分配限制地、并且利用寄存器活性分析顺序地生成每个成员块的目标代码。
如上所述,与每个基本块相关的数据包括概述度量37。在一个实施例中,概述度量37是执行计数,即翻译器19对特定基本块已经被执行的次数进行计数;在这个实施例中,概述度量37被表示为整数计数字段(计数器)。在另一个实施例中,概述度量37是执行时间,即翻译器19保持所有执行特定基本块的执行时间的连续总和,诸如通过在基本块的开始和结束处设置代码,以分别启动和停止硬件或软件定时器;在这个实施例中,概述度量37使用总计执行时间的某种表示(定时器)。在另一实施例中,翻译器19为每个基本块存储多种类型的概述度量37。在另一实施例中,翻译器19对应于每个前继基本块和/或每个后续基本块而为每个基本块存储多组概述度量37,从而为不同控制路径维持不同的概述数据。在每个翻译器周期(即在翻译后的代码21的执行之间的翻译器代码19的执行)中,更新适当基本块的概述度量37。
在支持组块的实施例中,和每个基本块相关的数据另外还包括对已知的前继和后续基本块对象的引用38、39。集合体中的这些引用构成所有先前执行的基本块的控制流图。在组块形成期间,翻译器19遍历这个控制流图,以确定哪些基本块将被包含在正在形成的组块中。
说明性的实施例中的组块信息是基于三个阈值:触发阈值、包含阈值以及最多成员限制。触发阈值和包含阈值指每个基本块的概述度量37。在每个翻译器周期中,将下一个基本块的概述度量37和触发阈值相比较。如果度量37满足触发阈值,则组块形成开始。包含阈值随后被用于通过识别哪些后续基本块被包含在组块中而确定组块的范围。最多成员限制定义将被包含到任意一个组块中的基本块的数量上限。
当对于基本块A,达到触发阈值时,以A作为触发块而形成新的组块。翻译器19随后开始定义遍历,在控制流图中遍历A的后续块以识别要包含的其他成员块。当遍历到达给定的基本块时,把它的概述度量37和包含阈值相比较。如果度量37满足包含阈值,则该基本块被标记用于包含,并且遍历继续到该块的后续块。如果块的度量37低于包含阈值,则该块被排除并且它的后续块不被遍历。当遍历结束时(即所有路径或是到达被排除的块,或是回到被包含的块,或是到达最多成员限制),则翻译器19基于所有被包含的基本块构建新的组块。
在使用等同模块和组块的实施例中,控制流图是等同块图,这意味着,同一源块的不同等同块视为不同块,以创建组块。因而,同一源块的不同等同块的概述度量不被合计。
在另一实施例中,等同块不被用于基本块翻译中,而是被用于组块翻译中,这意味着,非组基本块翻译被一般化(在入口条件上不被特性化)。在这个实施例中,基本块的概述度量被每次执行的入口条件所分解(disaggregate),使得为每个理论的等同模块(即对于每个不同组的入口条件)维持不同概述信息。在这个实施例中,和每个基本块相关的数据包括概述列表,概述列表的每个成员是三项组(three-item set),包括:(1)一组入口条件;(2)对应的概述度量;以及(3)相应后续块的列表。即使不根据那些入口条件特性化实际基本块翻译,该数据也为每一组到基本块的入口条件维持概述和控制路径信息。在这个实施例中,将触发阈值和基本块的概述度量列表中的每一概述度量相比较。在遍历控制流图时,将给定基本块的轮廓列表中的每一个元素视为控制流图中的单独节点。因此,将包含阈值与块的轮廓列表中的每一个概述度量相比较。在这个实施例中,为热(hot)源块的特定热等同模块(专用于特定入口条件)创建组块,但利用那些相同块的通用(非等同块)翻译来执行那些块的其他等同块。
在定义遍历之后,翻译器19执行排序遍历,步骤73;附图6,以确定成员块被翻译的顺序。成员块的顺序影响翻译后的代码21的指令缓存性能(热门路径应该是连续的)和在成员块边界上的同步必然性(同步沿热门路径方向应该最小)。在一个实施例中,翻译器19利用有序的深度优先搜索(DFS)算法来执行排序遍历,由执行计数来排序。遍历从具有最高执行计数的成员块开始。如果遍历的成员块具有多个后续块,则具有较高执行计数的后续块被首先遍历。
本领域技术人员将意识到,组块并非形式上的基本块,因为他们可能具有内部控制分支、多个入口点以及/或者多个出口点。
一旦组块被形成,就可以对其进行进一步的优化,在本文中被称为“全局停用代码删除”。这种全局停用代码删除采用活性分析技术。全局停用代码删除是从一组基本块的IR中移除冗余工作的处理。通常,源处理器状态必须在翻译范围边界上被同步。一个值,诸如源寄存器,被称为对于以其定义开始且以其在被重新定义(覆写)之前的最后使用而结束的代码范围是“活动的”;因此,对值(例如IR生成语境中的临时值、代码生成语境中的目标寄存器、或者翻译语境中的源寄存器)的使用和定义的分析在本领域中被称为活性分析。翻译器具有的关于数据和状态的使用(读)和定义(写)的任何知识都被限制到它的翻译范围中;程序的其他部分则是未知的。更特别地,由于翻译器不知道哪些源寄存器将被用于翻译范围之外(例如,在后续基本块中),因而必须假设所有寄存器都将被使用。这样,在给定基本块内被修改了的任何源寄存器的值(定义)必须在那个基本块结束时被保存(存储到全局寄存器储存器27中),为了它们将来使用的可能性。同样,其值将被用于给定基本块的所有源寄存器必须在那个基本块开始的时候被恢复(从全局寄存器储存器27中加载);即,基本块的翻译后的代码必须在它在那个基本块中的第一次使用之前恢复给定的源寄存器。
IR生成的一般机制包括隐含形式的“本地”停用代码删除,“本地”停用代码删除的范围每次只被局限在很小一组IR节点。例如,源码中的公共子表达式A将用A的具有多个父节点的单个IR树来表示,而不是用表达式树A本身的多个实例来表示。这样的事实隐含了“删除”:一个IR节点可能具有到多个父节点的链接。同样,把抽象寄存器用作IR占位符是停用代码删除的隐含形式。如果给定基本块的源码从来没有定义特定源寄存器,那么在该块的IR生成结束时,对应于该源寄存器的抽象寄存器将指向空IR树。在这种情况下,代码生成阶段认为适当的抽象寄存器不需要与全局寄存器储存器同步。这样,本地停用代码删除被隐含在IR生成阶段中,随着IR节点被创建而递增地发生。
与本地停用代码删除相比,“全局”停用代码删除算法被应用到基本块的整个IR表达式森林。根据所示实施例的全局停用代码删除需要活性分析,即分析组块的每个基本块范围内的源寄存器使用(读)及源寄存器定义(写),以识别活动的和停用的区域。IR被变换,以移除停用区域,并因而减少目标代码必须执行的工作数量。例如,在源码的指定点上,如果翻译器19认为或者检测到特定源寄存器在其下一次使用之前将被定义(覆写),则源寄存器被认为在直到抢占定义(preempting definition)的代码中所有位置上是停用的。对于IR,被定义、但在被重新定义之前从来没有被使用过的源寄存器是停用代码,这些代码可以在IR阶段中被删除,而不产生目标代码。对于目标代码生成,停用的目标寄存器可以被用于其他临时的或源寄存器值而不溢出(spilling)。
在组块全局停用代码删除中,在所有成员块上执行活性分析。活性分析生成每个成员块的IR森林,这个IR森林随后被用于获得该块的源寄存器活性信息。在组块创建的代码生成阶段中也需要每个成员块的IR森林。一旦在活性分析中生成了每个成员块的IR,则它可以被保存以随后在代码生成中使用,或者它可以被删除并在代码生成中重新生成。
组块全局停用代码删除可以以两种方式来有效地“变换”IR。首先,可以修改在活性分析期间为每个成员块生成的IR森林,并且随后整个IR森林可以被传播到代码生成阶段(即在代码生成阶段期间保存和重新使用);在这种情况下,IR变换通过将其直接应用到IR森林并随后保存变换后的IR森林而被传播通过代码生成阶段。在这种情况下,与每个成员块相关的数据包括活性信息(以附加地用于全局寄存器分配)以及该块的变换后的IR森林。
可选地,在组块创建的最终代码生成阶段的过程中,利用先前创建的活性信息,执行用于变换成员块IR的全局停用代码删除步骤。在这个实施例中,全局停用代码变换可以被记录作为“停用”源寄存器的列表,这个列表随后被编码在与每个成员块相关的活性信息中。因而,由随后的使用停用寄存器列表来删除IR森林的代码生成阶段来执行IR森林的实际变换。这种情况允许翻译器在活性分析过程中一次性生成IR,随后将IR丢弃,随后在代码生成期间重新生成相同IR,此时利用活性分析来变换IR(即全局停用代码删除被应用到IR自身)。在这种情况下,与每个成员块相关的数据包括活性信息,这个活性信息包含停用源寄存器的列表。IR森林不被保存。特别地,当IR森林在代码生成阶段被(重新)生成之后,(列在活性信息内停用源寄存器列表中的)停用源寄存器的IR树被删除。
在一个实施例中,活性分析过程中所创建的IR在活性信息被提取之后被抛弃,以节省存储器资源。IR森林(每个成员块一个)在代码生成过程中被重新创建,每次一个成员块。在这个实施例中,所有成员块的IR森林在翻译中的任何点上都不共存。然而,在活性分析和代码生成过程中分别创建的两个版本的IR森林是相同的,因为他们都是利用相同IR生成处理根据源代码而生成的。
在另一实施例中,翻译器在活性分析过程中为每个成员块创建IR森林,并随后将IR森林保存在与每个成员块相关的数据中,以在代码生成过程中被重用。在这个实施例中,从活性分析结束(在全局停用代码删除步骤中)到代码生成,所有成员块的IR森林共存。在这个实施例的一种可选方案中,在从IR的最初创建(在活性分析过程中)到IR的最后使用(代码生成)期间,不对IR执行变换或优化。
在另一实施例中,所有成员块的IR森林在活性分析和代码生成两个步骤之间被保存,并且在代码生成之前对IR森林执行块间优化。在这个实施例中,翻译器利用了这样的事实,即所有成员块IR森林在翻译的同一位置处共存,并且对不同成员块的IR森林执行变换那些IR森林的优化。在这种情况下,代码生成中所使用的IR森林可能与活性分析中所使用的IR森林不一样(如上面两个实施例中所述),因为IR森林已经连续地块间优化给变换了。换句话说,代码生成中所使用的IR森林可能与每次一个成员块地重新生成它们而得到的IR森林不同。
在组块全局停用代码删除中,由于活性分析同时被应用于多个块,因而停用代码检测的范围被增加了。因此,如果源寄存器在第一成员块中被定义,并且随后在第三成员块中被重新定义(没有中间使用或出口点),那么可以从第一成员块中删除第一次定义的IR树。相比之下,在基本块代码生成中,翻译器19不能检测到这个源寄存器是停用的。
如上所述,组块优化的一个目标是减少或消除在基本块边界处的寄存器同步的必要性。因此,现在讨论在组分块过程中翻译器19如何实现寄存器分配和同步。
寄存器分配是将抽象(源)寄存器与目标寄存器相关联的处理。由于抽象寄存器值必须驻留在目标寄存器中以参与目标指令,因此寄存器分配是代码生成的必要部分。目标寄存器和抽象寄存器之间的这些分配(即映射)的表示被称为寄存器映射。在代码生成过程中,翻译器19维持工作寄存器映射,工作寄存器映射反映寄存器分配的当前状态(即目标代码中的给定点处实际存在的目标-抽象寄存器映射)。下文将参考出口寄存器映射,抽象来说,出口寄存器映射是从成员块中退出时工作寄存器映射的简短描述。然而,由于同步不需要出口寄存器映射,因此它不被记录,因此它是完全抽象的。入口寄存器映射40(附图3)是在到成员块的入口处工作寄存器映射的简短描述,入口寄存器映射必须被记录以用于同步。
如上所述,组块还包含多个成员块,并且为每个成员块分别执行代码生成。这样,每个成员块具有它自己的入口寄存器映射40和出口寄存器映射,它们分别反映在该块的翻译后的代码开始和结束时将特定目标寄存器分配到特定源寄存器。
组成员块的代码生成由它的入口寄存器映射40(入口处的工作寄存器映射)来参数化的,但代码生成也修改工作寄存器映射。成员块的出口寄存器映射反映该块结束时的被代码生成程序修改了的工作寄存器映射。当第一成员块被翻译时,工作寄存器映射是空的(进行全局寄存器分配,下文中讨论)。在第一成员块的翻译结束时,工作寄存器映射包含由代码生成处理所创建的寄存器映射。工作寄存器映射随后被复制到所有后续成员块的入口寄存器映射40。
在成员块的代码生成结束时,某些抽象寄存器可能不需要同步。寄存器映射允许翻译器19通过识别哪些寄存器实际需要同步而使成员块边界上的同步最小化。相比之下,在(非组)基本块的情况下,所有抽象寄存器必须在每个基本块结束时被同步。
在成员块结束时,基于后续块可能有三种同步情况。第一,如果后续块是还没有被翻译的成员块,那么它的入口寄存器映射40被定义为与工作寄存器映射相同,这种情况的结果是不需要同步。第二,如果后续块位于组的外部,那么所有抽象寄存器必须被同步(即完全同步),因为控制将在后续块执行之前返回到翻译器代码19。第三,如果后续块是其寄存器映射已经被固定的成员块,那么必须插入同步代码,以使工作映射与后续块的入口映射一致。
由组块排序遍历来减少寄存器映射同步的某些成本,组块排序遍历使寄存器同步最小化或者消除完全沿热路径的寄存器同步。按照排序遍历所产生的顺序翻译成员块。在每个成员块被翻译时,它的出口寄存器映射被传播到所有其入口寄存器映射还没有被固定的后续成员块的入口寄存器映射40。实际上,首先翻译组块中的最热路径,并且大多数地,如果不是所有成员块沿着该路径,则不需要同步,因为对应的寄存器映射都是一致的。
例如,第一和第二成员块之间的边界将总是不需要同步,因为第二成员块将总是使它的入口寄存器映射40固定为和第一成员块的出口寄存器映射41相同。成员块之间的某些同步可能是不可避免的,因为组块可以包含内部控制分支以及多个入口点。这意味着,执行可以从不同前继块到达相同后续成员块,而在不同时期具有不同的工作寄存器映射。这些情况要求翻译器19用适当的成员块的入口寄存器映射来同步工作寄存器映射。
如果需要,则寄存器映射同步发生在成员块边界上。翻译器19在成员块的结尾处插入代码,以将工作寄存器映射和后续块的入口寄存器映射40同步。在寄存器映射同步中,每个抽象寄存器落入十种同步条件之一。表1将这十种寄存器同步情况表示为翻译器的工作寄存器映射和后续块的入口寄存器映射40的函数。表2通过用文字描述以及相应同步动作的伪代码描述(伪代码将在下文中解释)列举这十种正式同步情况来描述寄存器同步算法。因而,在每个成员块边界处,利用这10种情况的算法来同步每个抽象寄存器。同步条件及动作的详细描述允许翻译器产生高效的同步代码,这使得每个抽象寄存器的同步成本最小化。
下文描述表2中所列的同步动作函数。“spill(E(a))”将抽象寄存器a从目标寄存器E(a)保存到源寄存器库(全局寄存器储存器的组件)中。“Fill(t,a)”将抽象寄存器a从源寄存器库加载到目标寄存器t中。如果新的目标寄存器可用,那么“Reallocate()”移动并重新分配抽象寄存器到新的目标寄存器(即改变抽象寄存器的映射),如果目标寄存器不可用,那么“Reallocate()”使抽象寄存器溢出。“FreeNoSpill(t)”将目标寄存器标记为空闲,而不使相关抽象源寄存器溢出。FreeNoSpill()函数对于避免在相同同步点上算法的多个应用程序的过量溢出是必要的。注意,对于具有“Nil”同步动作的情况,对于相应的抽象寄存器,不需要同步代码。
表1:10种寄存器同步情况的列举
Figure A20048002010100303
Figure A20048002010100321
Figure A20048002010100331
翻译器19在组块内执行两级寄存器分配,全局的和局部的(或暂时的)。全局寄存器分配是在代码生成之前定义特定寄存器映射,这在整个组块范围内持续(即在所有成员块上)。局部寄存器分配包含代码生成处理中所创建的寄存器映射。全局寄存器分配定义特定寄存器分配约束,这些约束通过限制局部寄存器分配来参数化成员块的代码生成。
被全局分配的抽象寄存器不需要在成员块边界上进行同步,因为它们被保证分配给每个成员块中相同的各个目标寄存器。这种方法的优点在于,对于全局分配的抽象寄存器,不需要在成员块边界上的同步代码(其补偿块之间的寄存器映射的差异)。组块寄存器映射的缺点在于,它妨碍局部寄存器分配,因为全局分配的目标寄存器对于新的映射不是立即可用的。为了补偿,对于特定组块,可以限制全局寄存器映射的数量。
实际全局寄存器分配的数量和选择是由全局寄存器分配策略来定义的。全局寄存器分配策略可基于源架构、目标架构以及被翻译的应用程序来配置。全局分配的寄存器的最佳数量是根据经验得出来的,并且是目标寄存器数量、源寄存器数量、被翻译的应用程序的类型以及应用程序使用方式的函数。这个数值通常是目标寄存器总数减去某个小数目之后的一部分,以确保仍然有足够的目标寄存器用于临时值。
在源寄存器很多而目标寄存器很少的情况下,诸如MIPS-X86以及PowerPC-X86翻译器,全局分配的寄存器的数量为零。这是因为X86架构具有很少的目标寄存器,以致发现使用任何固定寄存器分配比起根本不使用来说,产生更差的目标代码。
在源寄存器很多并且目标寄存器很多的情况下,诸如X86-MIPS翻译器,全局分配的寄存器的数量(n)是目标寄存器数量(T)的四分之三。因此:
X86-MIPS:n=3/4*T
尽管X86架构具有很少的通用寄存器,但是它被当成具有很多源寄存器,因为需要很多抽象寄存器来模拟复杂的X86处理器状态(包括例如条件代码标志)。
在源寄存器和目标寄存器的数目近似相等的情况下,诸如MIPS-MIPS加速器,大部分目标寄存器被全局分配,而只有很少被保留用于临时值。因此:
MIPS-MIPS:n=T-3
在整个组块上使用的源寄存器的总数量(s)小于或等于目标寄存器的数量(T)的情况下,所有源寄存器被全局映射。这意味着,在所有成员块上,整个寄存器映射是不变的。在其中(s=T)的特定情况下,即目标寄存器和活动的源寄存器的数量相等,这意味着没有留下目标寄存器用于临时计算;在这种情况下,临时值被局部分配到被全局分配到在相同表达式树内没有其他应用的源寄存器的目标寄存器(这种信息通过活性分析获得)。
在组块创建结束时,按照遍历顺序对每个成员块执行代码生成。在代码生成过程中,每个成员块的IR森林被(重新)生成,并且(包含在块的活性信息中的)停用源寄存器列表被用于在产生目标代码之前删除IR森林。当每个成员块被翻译时,它的出口寄存器映射被传播到所有后续成员块的入口寄存器映射40(除了那些已经被固定的)。由于块是按照遍历顺序被翻译的,从而起到了把沿热路径的寄存器映射同步最小化的效果,同时也使热路径翻译在目标存储器空间中相邻。和基本块翻译一样,根据一组入口条件,即组块被创建时的当前工作条件,特性化组成员块翻译。
附图7提供了由依据所示实施例的翻译器代码19生成组块的例子。所示组块具有五个成员(“A”到“E”)、最初一个入口点(“入口1”;入口2是随后通过聚合而产生的,如下所述)以及三个出口点(“出口1”,“出口2”,以及“出口3”)。在这个例子中,用于组块创建的触发阈值是执行计数为45000,并且成员块的包含阈值是执行计数为1000。在模块A的执行计数(现在为45074)达到触发阈值45000时触发这种组块的构建,在这个点上执行控制流图的搜索,以便识别组块成员。在这个例子中,找到5个超过包含阈值1000的块。一旦成员块被识别,就执行有序的深度优先搜索(按照概述度量排序),使得较热块以及它们的后续块被首先处理;这就产生了具有临界路径排序的一组块。
全局停用代码删除在这个阶段中被执行。针对寄存器使用和定义分析每个成员块(即活性分析)。这使得代码生成以两种方式更为有效。首先,局部寄存器分配可以考虑哪些源寄存器在组块中是活动的(即哪些寄存器将被用于当前或后续的成员块),这有助于减少溢出成本;停用寄存器首先被溢出,因为他们不需要被恢复。此外,如果活性分析显示特定源寄存器被定义、使用、并且随后被重新定义(覆写),则值可以在最后一次使用之后的任意时间被丢弃(即它的目标寄存器能够被释放)。如果活性分析表明特定源寄存器值被定义并且随后被重新定义而没有任何中间使用(不太可能,因为这将意味着源编译器产生停用代码),那么用于这个值的相应IR树可以被丢弃,使得对它不产生目标代码。
接下来是全局寄存器分配。翻译器19为经常被存取的源寄存器分配固定的目标寄存器映射,这个映射在所有成员模上是不变的。全局分配的寄存器是不可溢出的,这意味着,那些目标寄存器对于局部寄存器分配来说是不可用的。当源寄存器比目标寄存器多时,必须保持一定比例的目标寄存器以用于临时源寄存器映射。在组块中的整组源寄存器能够适合目标寄存器的特定情况下,溢出和填充被完全避免了。如附图7所示,翻译器设置代码(“Pr1”)以在进入组块(“A”)的头部之前从全局寄存器储存器27加载这些寄存器;这种代码被称为开端程序(prologue)加载。
现在,组块已经为目标代码生成做好了准备。在代码生成过程中,翻译器19使用工作寄存器映射(抽象寄存器和目标寄存器之间的映射)来跟踪寄存器分配。在每个成员块开始时的工作寄存器映射的值被记录在该块的相关入口寄存器映射40中。
首先生成加载全局分配的抽象寄存器的开端程序块Pr1。在此,Pr1结尾处的工作寄存器映射被复制到块A的入口寄存器映射40。
块A随后被翻译,紧接着Pr1的目标代码设置目标代码。控制流代码被设置以处理出口1的出口条件,这个出口条件包含到收尾程序(epilogue)块Ep1(稍后被设置)的哑分支(稍后被修补)。在块A结束处,工作寄存器映射被复制到块B的入口寄存器映射40。这个固定B的入口寄存器映射40具有两种结果:首先,在从A到B的路径上不需要同步;其次,从任何其他块(即这个组块的成员块或利用聚合的另一组块的成员块)进入B需要将该块的出口寄存器映射与B的入口寄存器映射同步。
块B是热路径上的下一块。它的目标代码被设置在紧随块A的地方,并随后设置用于处理两个后续块C和A的代码。第一后续块C还没有使其入口寄存器映射40固定,因此工作寄存器映射被简单地复制到C的入口寄存器映射。然而,第二后续块A先前已经使其入口寄存器映射40固定,因而块B结束处的工作寄存器映射和块A的入口寄存器映射40可以不同。寄存器映射中的任何差异都需要沿从块B到块A的路径上的某种同步(“B-A”),以便使工作寄存器映射与入口寄存器映射40一致。这种同步采用寄存器溢出、填充以及交换的形式,并且在上面的十种寄存器映射同步情况中被详细描述了。
现在,块C被翻译,并且目标代码被设置在紧随块C的地方。同样地,块D和E被连续地翻译和设置。从E到A的路径重新需要从E的出口寄存器映射(即E翻译结束处的工作寄存器映射)到A的入口寄存器映射40的寄存器映射同步,该同步被设置在模块“E-A”中。
在退出组块并将控制返回到翻译器19之前,全局分配的寄存器必须被同步到全局寄存器储存器;这种代码被称为结尾程序保存。在成员块已经被翻译之后,代码生成设置所有出口点(Ep1、Ep2和Ep3)的结尾程序块,并且在所有成员块中固定分支目标。在既使用等同块也使用组块的实施例中,对于唯一源模块(即源码中的特定基本块)、而不是对于该块的等同块进行控制流图遍历。这样,等同块对于组块创建是透明的。对于具有一个翻译或多个翻译的源块,不产生特定区别。
在所示实施例中,组块和等同块优化可以被有利地使用。然而,等同块机制可为同一源码序列创建不同的基本块翻译这个事实使得确定哪些块将被包含到组块中的处理变得复杂,因为将被包含的块可能在组块被形成之前并不存在。利用在优化之前存在的未特性化的块而收集的信息在被用于选择及布局处理之前必须被修改。
所示实施例还运用用于适应组块生成中的嵌套循环特征的技术。最初以仅仅一个入口点,即触发块的起点,创建组块。程序中的嵌套循环使内部循环首先成为热的,创建代表内部循环的组块。随后,外部循环变为热的,创建包含内部循环以及外部循环的所有块的新的组块。如果组块生成算法没有考虑对内部循环所做的工作,而是重做所有这些工作,那么包含深层嵌套循环的程序将逐渐生成越来越大的组块,对每个组块生成就需要更多的存储器以及更多的工作了。此外,旧的(内部)组块可变得不可获得,并因而提供很小的好处或者不提供好处。
根据所示实施例,组块聚合被用于使先前构建的组块能够与附加的优化块结合。在选择块以包括在新组块中的阶段期间,那些已经包括在先前组块中的候选块被识别。
不是设置这些块目标代码,而是执行聚合,由此,翻译器19创建到现存组块中的适当位置的链接。由于这些链接可跳转到现存组块的中间,因而必须加强对应于那个位置的工作寄存器映射;因此,为该链接所设置的代码包含所需要的寄存器映射同步代码。
存储在基本块数据结构30中的入口寄存器映射40支持组块聚合。聚合允许其他翻译后的代码利用成员块的起始作为入口点而跳转到组块的中间。这种入口点要求当前工作寄存器映射被同步到成员块的入口寄存器映射40,翻译器19通过在前继块的出口点和成员块的入口点之间设置同步代码(即溢出和填充)来实现这种同步。
在一个实施例中,某些成员块的寄存器映射被选择性地删除以节省资源。起初,组内所有成员块的入口寄存器映射被无限期地(indefinitely)存储,以利于在任何成员块的起始处(从聚合组块)进入组块。当组块变大时,某些寄存器映射可以被删除以节省存储器。如果寄存器映射被删除,那么聚合有效地将组块划分为区域,其中某些区域(即其寄存器映射已经被删除的成员块)不可存取聚合入口。使用不同策略以确定存储哪些寄存器映射。一种策略是存储所有成员块的所有寄存器映射(即从不删除)。另一种策略是只存储最热成员块的寄存器映射。再一种策略是只存储作为反向分支目标的成员块(即循环的起点)的寄存器映射。
在另一实施例中,与每个组成员块相关的数据包括为每个源指令位置记录的寄存器映射。这允许其他翻译后的代码在任何点,而不仅仅是成员块的起始处,跳转到组块的中间,因为,在某些情况下,组成员块可以包含在形成组块时未检测到的入口点。这种技术消耗大量存储器,因而只在不考虑节约存储器的时候才适用。
组分块提供了用于识别经常执行的块或块组、并且对其执行附加优化的机制。由于更多计算花费高的优化被应用到组块中,因而它们的形成优选地限制到已知经常执行的基本块。在组块的情况下,通过经常执行来证明附加计算;经常被执行的连续块被称为“热路径”。
可以配置实施例,其中使用多级频率和优化,使得翻译器19检测经常被执行的基本块的多个等级,并应用更加复杂的优化。可选地,如上所述,只使用两级优化:基本优化被应用到所有基本块,以及利用上述组块创建机制将单独一组进一步的优化应用到组块中。
块翻译概述
附图8阐述了在翻译后的代码的执行之间在运行期间由翻译器执行的步骤。当第一基本块(BBN-1)完成执行1201时,它将控制返回到翻译器1202。翻译器递增第一基本块的概述度量1203。随后,翻译器利用第一基本块的执行所返回的源地址向基本块缓存查询1205当前基本块(BBN,即BBN-1的后续块)的先前翻译后的等同块。如果后续块已经被翻译,那么基本块缓存将返回一个或多个基本块数据结构。随后,翻译器比较后续块的概述度量和组块触发阈值1207(这可以包含聚合多个等同块的概述度量)。如果没有满足阈值,那么翻译器随后检查由基本块缓存返回的任何等同块是否与工作条件兼容(即等同块具有与BBN-1的出口条件相同的入口条件)。如果找到兼容的等同块,那么就执行翻译1211。
如果后续块概述度量超过组块触发阈值,则创建1213和执行1211新的组块,如上所述,即使兼容的等同块存在。
如果基本块不返回任何等同块,或者返回的等同块都不兼容,那么当前块随后被翻译1217成根据当前工作条件特性化的等同块,如上所述。在解码BBN结束时,如果BBN的后续块(BBN+1)是静态可确定的1219,那么扩展的基本块被创建1215。如果扩展的基本块被创建,那么BBN+1随后被翻译1217,依次类推。在翻译完成时,新的等同块被存储到基本块缓存中1221并且随后被执行1211。
共享代码缓存
在另一优选实施例中,翻译器19可以包含共享代码缓存机制,其例如可以允许对应于特定源程序的目标代码21和翻译结构在翻译器19的不同执行或实例之间被共享。翻译器“实例”是翻译器的特定执行,即一个源程序的一个翻译后的执行。正如下文中将更为详细讨论的那样,这种共享代码缓存可以由专用代码缓存服务器来改进,专用代码缓存服务器在翻译器执行的起始和结束时,以及在执行过程中源码被修改的任何时间(诸如当源库被载入时)上与翻译器19交互。
附图9阐述了根据所示实施例的共享代码缓存处理的主要方面。在第一步骤101中,翻译器19把源码S1的一部分翻译成目标代码T1。为了重用目标代码T1,翻译器19缓存该目标代码T1,步骤103。在菱形判定框105中,翻译器19确定源码S2的下一部分与先前在步骤103中缓存的目标代码T1之间的兼容性。正如结合菱形判定框105所阐述的那样,如果在缓存的目标代码T1和源码S2的新部分之间存在兼容性,那么缓存的目标代码T1被检索并被执行,步骤109,从而消除翻译新的源码部分S1的负担和必要性。如果兼容性不存在,那么源码的下一(新)部分被翻译为目标代码,并且如步骤111中所示的那样被进一步处理。
在附图9的处理的说明性的、有利的应用中,翻译器19将在第一源程序执行过程中产生的所有目标代码保存在临时存储器中,并随后在这个执行结束时候缓存所有这些目标代码。随后,翻译器19在第二源程序的源码翻译过程中执行兼容性判定。
在步骤105中所示的、源码的新部分和缓存的目标代码之间的兼容性判定可以根据许多不同方法来实现。在所示实施例中,翻译器利用缓存关键字数据结构(cache key data structure)来根据当前源码序列与先前翻译后的源码序列是否相同而确定特定缓存单元是否与当前源码序列兼容。翻译器19通过比较新序列的缓存关键字数据结构与所有先前生成并被缓存的目标代码序列的缓存关键字数据结构来检查以确认新的源码序列是否能够使用先前缓存的目标代码。准确的匹配表示翻译(目标代码)是可重用的。
在一个已经被实现的实施例中,缓存关键字数据结构包含:(1)包含源码序列的文件的名称或其他标识符;(2)源码序列在文件中的位置(即偏移量和长度);(3)文件的最后修改时间;(4)生成被缓存的翻译结构的翻译器的版本号;以及(5)源码被加载到的源缓存中的地址。在这个实施例中,翻译器19通过依次比较各个缓存关键字的所有组成部分来确定兼容性。任何不相同的值表示不兼容。
在另一或可选实施例中,缓存关键字数据结构39包括缓存单元37所代表的所有源指令的完整复制;在这个实施例中,翻译器通过比较缓存单元37的整个源指令序列与将被翻译的源码序列、以及检查每个源指令是否相同,来确定缓存单元37的兼容性。
在另一实施例中,通过使用散列函数来促进翻译器所确定的缓存兼容性。在这种情况下,缓存关键字数据结构包含源码序列的数字散列。随后,翻译器对整个源码序列应用恒定的、可重复的散列函数。散列函数生成序列的数字表示,这个数字表示被称为散列号。在这种实施例中,翻译器通过简单地对翻译后的和当前的源码序列的各自散列号执行算术比较,从而确定兼容性。
这种散列函数技术也可被用于确定各个翻译器实例的先前所用版本与当前所用版本的兼容性,或者例如驻留在更复杂的系统中的两种不同处理器上的不同翻译器实例的兼容性。在这种情况下,可执行的翻译器文件的数字散列有助于翻译器确定翻译器版本兼容性,该散列号被存储在缓存关键字中。在这种实施例中,通过对构成每个翻译器版本的实际二进制可执行文件的字节序列应用散列函数生成翻译器散列号。
根据多个实施例,被翻译的“源码部分”是代码序列,正如下文将进一步讨论的那样,这个代码序列可包括基本块或者比基本块更大的其它指令序列。附图10阐述了共享代码缓存处理,其中每个缓存单元代表特定代码序列。
根据附图10中阐述的处理,翻译器19将第一代码序列CS1翻译成目标代码TC1,正如步骤121所阐述的那样。随后,翻译器19产生索引对应于代码序列CS1的目标代码块TB1的缓存关键字K1,如步骤123所述。在步骤124,翻译器19将目标块TC1及其相关关键字K1存储到缓存存储器中。在步骤125,翻译器19开始处理第二代码序列CS2,首先产生这个序列的缓存关键字K2。随后在比较步骤127中,翻译器19比较缓存关键字K2与先前被存储在缓存29中的与代码序列相关的那些关键字,包括关键字K1。如果缓存关键字K1匹配缓存关键字K2,正如在步骤129中所阐述的那样,那么对应于缓存关键字K1的目标代码块TC1被翻译器19从缓存29中检索并执行。正如步骤131中所示,流程随后前进到步骤133,其中翻译器19随后开始处理代码序列CS3:首先为该序列生成缓存关键字K3,随后检查缓存关键字的索引...K1,K2...是否匹配。如果在步骤127中K1不匹配K2,则第二代码序列被翻译成目标代码TC2,目标代码TC2随后被缓存,正如在步骤135、136中所示的那样。
在所示实施例中,每个缓存单元包括对于表示源码序列所必需的所有翻译结构。代码序列可以是此前所定义的基本块、或为其生成代码的更大指令序列。在这种更大的指令序列的情况下,与代码序列中的所有基本块相关的所有相关数据被保存在相同的缓存单元中。
在这种说明性的实施例中,存储在缓存单元中的数据结构包括:
(a)基本块对象-每个基本块对象将源地址与某种数据相关联。这种数据包括:
-该源地址的概述信息(例如执行计数)
-指向等效目标代码的指针(如果其存在)
-所指向的目标代码是基本块目标代码还是组块目标代码。
-“后续块信息”,其实际内容依赖于块如何结束;
-如果代码序列以无条件跳转结束,那么后续块信息指向下一个要执行的基本块对象。
-如果代码序列以计算跳转结束(例如“到链接寄存器的分支”),那么后续块信息指向后续块缓存,后续模块缓存把源地址映射到基本块地址。每个以计算跳转结束的块具有它自己的后续块缓存。
-如果代码序列以分支结束,那么后续块信息指向代表下一个要执行的源地址的基本块,如果分支被采取/未被采取。
(b)目标代码-组块和基本块。
(c)组块信息-在组块生成之后被维持,以允许组块随时间增长或改变。
(d)块目录-这是将源地址映射到基本块。缓存单元中的每个基本块在块目录中具有入口。
在后续块信息中,如果下一个要执行的基本块位于当前缓存单元之外,利用某种特定标志(例如空指针)来指示某种特定动作必须发生。在此,下一个基本块的地址不能被硬连线,因为目的地块可能不可用,并因此必须通过搜索系统上所有可用缓存单元来寻找合适的后续块,从而获得目的地块。在被包含在此作为参考的共同未决申请______中公开的分区机制是一种可以用于基于源地址划分缓存单元的机制,使得代表源地址特定范围内的代码的所有基本块被置于相同缓存单元中(如相应的后续块缓存、目标代码、组块信息以及块目录)。然而,其它的可选机制也可以被使用。
所讨论的缓存单元结构的特殊例子中的每个数据结构可以只包括指向也在相同缓存单元中的数据的指针。因此,在缓存单元之间引用对象需要某种特定工作。这是因为人们不能依赖于可用的目的地缓存单元。为此,组块被完整地包含在单个缓存单元中。
附图11阐述了(a)缓存单元37的实例。附图11的缓存单元37特别包括一个或多个块翻译41以及与这些块41相关的后续块列表43。这样,每个缓存器单元37是独立的,这意味着,缓存单元37中的翻译结构不依赖于该缓存单元之外的任何翻译结构的存在,因为各个缓存单元可以被独立地从缓存服务器35中被加载或卸载。这种缓存单元37包含对于表示特定源码序列所必需的所有翻译结构,上述特定源码序列可以不包括后续的源码序列。在本说明书中,“源码序列”可包含多条源指令,这些源指令在控制流方面是连续的,但这些指令在源地址方面可以是不连续的。换句话说,缓存单元37包含至少一个翻译后的块(即代表特定源码序列的目标代码序列)以及翻译后的块所依赖的所有翻译结构。例如,在缓存单元37包含翻译后的块41A、41B和41C的实施例中,这些块的后续块列表43是必需的翻译结构,但后续块49自身并非必需的。
在不同实施例中,翻译器19可以定义不同范围的附加缓存单元数据结构。例如,当翻译器19知道源程序不是自修改时,那么源程序以及其所有相关库可以被分组到单个缓存器单元中。翻译器19可以进一步建立一个或多个以下类型的缓存单元:(a)每个单独源指令可以是独立的缓存单元,(b)每个基本块可以是独立的缓存单元;(c)所有对应于相同起始源地址的块可以被分组到单个缓存单元中;(d)缓存单元可以表示源代码地址的离散范围,(e)每个源库可以是单独的缓存单元,(f)每个源码应用在包括该应用的所有目标代码(可执行的以及所有库)的单个缓存单元中被表示。翻译器19可以根据特定翻译需求以及目标环境进一步改变缓存单元的粒度等级。
作为另一个有利的例子,翻译器19在其中发现应用程序的源操作系统20具有为不可改变的库保留的存储器区域,其中每个不可改变的库总是在相同源地址上加载。这种存储器区域被作为单个缓存单元。例如,MacOS操作系统具有保留的存储器范围(0×90000000-0×A0000000),其被保留用于不可改变的共享库;被配置为从MacOS架构进行翻译的翻译器在单个缓存单元中表示整个MacOS共享库区域。在缓存单元包含多个源库的适当情况下,缓存单元的缓存关键字包含加载到该区域的所有库的文件修改时间。包含在这个缓存单元中的任何源库的修改将使包含在其中的翻译结构不可用于翻译器的将来实例。如果隐含库之一被修改了,那么随后的翻译器实例必须为该缓存单元(即为MacOS共享库区域)重建翻译结构。新的翻译结构将具有反映库的新配置(即包含在库中的新源码)的相应缓存关键字。
迄今为止所描述的共享代码缓存方法能够以许多不同的体系设计被实现。在实现共享代码缓存的不同实施例中,诸如在附图12-16中所示的那些实施例,共享代码缓存存储设备29允许对应于特定源程序的目标代码21和翻译结构(缓存单元)在翻译器19的不同执行或实例之间被共享。翻译器“实例”是翻译器的特定执行,即一个源程序的一个翻译后的执行。
例如,如附图12中所示,共享代码缓存29是由专用代码缓存服务器35帮助的,这种专用代码缓存服务器在翻译器执行的开始和结束,以及执行过程中源代码被修改的任何时间上(诸如当源库被加载时)与翻译器19交互。在附图12的实施例中,缓存服务器35与翻译器19位于相同的系统或目标架构36上。在其他实施例中,缓存服务器35可以是翻译器的子系统。
附图13阐述了这样一个实施例,其中缓存服务器35与翻译器实例19位于不同系统32上。在这种情况下,服务器系统32的架构可以与目标架构36不同。
附图14阐述了这样一个实施例,其中附图1的翻译系统与运行在不同系统32上的缓存服务器35协作。在这种情况下,缓存服务器35运行在与翻译器所运行在的那些处理器和操作系统不同的处理器31和不同操作系统33上。
在附图15所示的共享缓存技术的可选实施例中,缓存服务器35是连接共享存储在运行于不同系统63、65上的翻译器实例19a、19b之间各个缓存29A、29B和29C中的翻译后的代码的处理的网络,其中系统63、65的目标架构是相同的。系统63、65可以是例如一对联网的桌面电脑。单个缓存服务器可以为翻译器19的任意数量的不同配置提供缓存,但是特殊缓存29只可以在翻译器19的兼容配置之间被共享。
在附图14的共享缓存技术的一个实施例中,缓存服务器35是主动响应来自翻译器处理的查询的专用处理。在可选实施例中,缓存服务器35是被动存储系统,诸如缓存单元的文件目录或者数据库。。
而且,在附图14的说明性实施例中,翻译器19通过在源程序结束时将缓存单元作为文件存储在磁盘上、并且通过进一步维持包含与被缓存的源码序列相关的所有缓存关键字结构的索引文件,将被缓存的翻译结构保存在持续存储器中。例如,在一个这种实施例中,代码缓存包含缓存服务器操作系统33的文件系统中的文件的目录,其中每个缓存单元37被作为单个文件存储在缓存目录结构中。在附图14的系统的另一实施例中,持续存储器由“拥有”被缓存的翻译结构、并且响应于翻译器19的请求将缓存单元分配给翻译器实例的持续服务器处理来实现。
因而,在说明性的共享代码缓存方法的实现中,当源程序的翻译到达翻译器19还未翻译的源码序列时,翻译器19检查缓存服务器35以寻找兼容的代码缓存。如果找到兼容的代码缓存,那么翻译器19加载包含目标代码21和翻译结构的缓存。代码缓存隐含了在源程序的先前翻译执行过程中被创建的所有翻译后的代码21,包括优化的目标代码,诸如以上结合附图6和7所描述的组块。这允许随后的翻译器执行在先前执行的基础上进行;源码的大部分可能已经被翻译并且可能被优化了,从而减少了启动时间、降低了翻译成本、并提高了性能。
共享缓存允许翻译器19的不同实例,诸如附图12的实例19a、19b,从彼此的结果中获益。特别地,共享缓存允许在一种翻译器实例中创建的翻译结构在另一翻译器实例被重用。本说明书中的“翻译结构”是指所生成的目标代码(即特定源码序列的翻译)以及翻译器19用于表示、管理和执行源码的其他数据。这种翻译结构的例子是那些结合附图11所描述的实例,其中翻译结构37包括基本块翻译和后续块列表。
当稍后的翻译器实例执行相同的源程序或者具有共同源码(例如系统库)的不同源程序时,共享缓存允许重用翻译结果。在稍后的翻译器实例碰到相同源码序列的情况下,共享缓存允许重用在先前的翻译器实例中创建的翻译结构。如果先前的翻译器实例碰到特定源码序列,并且稍后的翻译器实例碰到相同的源码序列,那么共享缓存允许后来的翻译器实例使用由先前的翻译器实例创建的翻译结构。换句话说,共享缓存允许特定源码序列的翻译(即缓存单元)的保持时间超过创建这个翻译的翻译器实例的生命周期。
对于被缓存的翻译,源码可以被分成两类:(1)从磁盘加载到存储器中的可执行代码,其包括源二进制、静态链接库、链接器以及任何在运行期间加载的库;(2)在不工作时产生的用于运行期间编译的源码、跳板代码(trampoline)、或者某种其他形式的动态生成的源码(即自修改代码)。共享缓存技术找到与第一类源指令序列相关的特定应用程序,在此被称为“静态”代码。静态源代码很可能包含跨越(a)相同应用程序的多个执行以及(b)多个应用程序(例如,系统库)的完全相同的源指令序列。对应于静态源码的缓存单元在此被称为静态缓存单元。与此相反,在共享缓存技术的内容里,其源码在运行期间被改变的程序被称为“动态的”。
在共享缓存的一种优化中,在翻译器实例执行结束时,翻译器19确定源程序的哪些部分包含静态源码,并且把共享缓存技术的应用限制在那些静态部分。在这种实施例中,在翻译器实例执行结束时,只有对应于静态代码的翻译结构被缓存,而对应于动态代码的翻译结构被丢弃。
缓存进化
在缓存29在翻译器执行结束时(即翻译后的程序终止时)被更新的实施例中,可以配置缓存服务器35,以比较该执行的当前翻译体与由服务器35当前存储的代码缓存。在这种配置中,如果当前执行的代码缓存比先前存储的版本“更好”,那么服务器从当前执行中存储缓存单元用于将来的使用。将翻译从翻译器实例复制到缓存29的处理(即当实例的翻译比服务器更好时)被称为“发布”。这样,存储在缓存29中的代码的质量日益提高。这种技术的处理和结果可以被称为“缓存进化”。
即使翻译器实例最初从缓存中取得结构,该实例的执行可能导致新的源码序列被翻译,并因此导致新的翻译结构被创建。当这个翻译器实例结束时,它自己的翻译结构集可能比存储在缓存中的相应集更完整。
根据附图16的说明性程序,第一翻译器执行被执行,步骤20l,并且随后在步骤203中,它的缓存单元C1被缓存。随后,翻译器19的第二实例执行第二程序,并生成缓存单元C2,步骤205。随后,第二翻译器实例19比较在其执行结束处的翻译结构C2与存储在缓存29中的那些翻译结构C1,并根据某些适当的标准来确定刚刚产生的翻译是否比缓存29中可用的那些翻译更好。例如,可以基于所翻译的源指令数目、所施加的优化的数目,或者通过执行用于评估所生成代码的质量的算法来确定一个代码缓存是否比另一个更好。正如在步骤209中所阐述的那样,如果C2比C1更好,那么缓存结构C2被加载到缓存29中,替代结构C1
在翻译器19不使用缓存进化的实施例中,在执行结束时,翻译器实例丢弃所有新的翻译结构(即所有那些最初不是从缓存引入的翻译结构)。
在可选实施例中,可以配置系统,使得翻译器实例在执行过程中在选定的时间,而不是只在执行结束时,将他们的翻译结构发布给缓存服务器,例如35。这允许使得翻译结构在翻译后的程序终止之前对其他翻译器实例是可用的,例如,在诸如附图17之类的多个翻译器实例T1、T2 ...Tn可以并行执行的系统中。选定的发布时间或“缓存同步点”可以包括:(1)在翻译后的应用程序不处理很多事务的“空闲”周期中,(2)在翻译结构的阈值数目被生成之后(例如,每当翻译器实例生成某个单位的目标代码,例如1兆字节,时发布);以及(3)当新的翻译器实例请求尽管不在共享缓存中、但已知存在于当前运行的翻译器实例中的翻译结构时。
并行翻译
在缓存服务器35的不同实施例中,当服务器35不忙于向翻译器实例发送代码缓存/从翻译器实例接受代码缓存时,服务器35可以被进一步配置以在空闲周期中优化代码缓存29。在这种实施例中,缓存服务器35执行一种或多种下述优化以变换代码缓存:(a)重新构造缓存目录结构,以使得对特定缓存单元的搜索更有效率;(b)删除已经被相同源码的后续的、更优化的翻译取代的翻译;
(c)重新排列代码缓存,以将经常请求的缓存单元彼此相邻地放置,从而提高缓存服务器35的硬件缓存性能(即减少服务器系统32的硬件缓存中的缓存服务器35所产生的硬件缓存遗漏(miss)的数量);(d)执行被缓存的翻译的昂贵优化(缓存服务器的离线优化不导致翻译器实例中的翻译成本或性能损失(performancepenalty));(e)翻译还没有被翻译器实例翻、但预计翻译器实例将碰到的源码(即离线预期翻译)。
共享存储器
共享缓存技术的另一种优化是利用共享存储器访问本质上是只读的(即其内容即使改变也很少改变)被缓存的翻译结构。存储在缓存单元中的翻译结构的重要部分可以在翻译器实例的整个生命周期内都是只读的,诸如所生成的目标代码序列:一旦生成,目标代码序列就很少被丢弃或者改变(即使它可能被随后的被优化的翻译所包含)。其它缓存单元成分,诸如执行计数以及分支目的地概述数据,预计经常改变,因为它们在翻译器的执行过程中被有规律地更新。在多个翻译器实例同时使用相同缓存单元结构的情况下,例如附图17,那些翻译器的只读部分可以作为共享存储器被访问。这种优化能够减少运行在单个目标系统上的多个翻译的全部物理存储器使用。
作为说明性共享存储器的应用,翻译器19将代码缓存文件加载到共享存储器区域。优选地利用即写即复制(copy-on-write)策略来共享缓存文件。在即写即复制策略下,缓存文件最初被所有运行的翻译器处理所共享,“即写即复制”意味着当特定翻译器实例以任何方式修改被缓存的结构时(例如,递增块的执行计数),在该点的缓存的被修改部分变为该特定执行所专用,因而包含被修改区域的存储器区域不能再被共享。
在说明性的应用中,缓存29包含概述数据结构以及其它数据结构(诸如目标代码),概述数据结构在翻译器19运行时经常被更新,而上述其它数据结构一旦被生成就保持不变。在其上运行翻译器19的操作系统提供例如4kb的存储器页面作为共享单元。大的缓存(1MB)能够被多个处理所共享,而任何对缓存的修改使包含修改的页面变成那个处理所私有的(页面被复制并且只修改私有拷贝)。这允许缓存29的大部分保持共享,而易变的概述数据对于每个处理是私有的。优选地,故意安排缓存29以将一定范围的页面专门用于易变的概述数据,而不是把概述数据在缓存29上展开。这减少了通过局部修改而成为私有的存储器的数量。
分布式缓存
在下文描述的实施例中,共享缓存技术被实现为包括一个或多个翻译器实例以及一个或多个彼此交互的服务器处理的缓存系统。除了上述实施例之外,在其它实施例中,根据在分级缓存以及分布式缓存领域中公知的几种方法学中的任意一种,由相应的公知的查找和存储操作技术,将缓存服务器组织成分布式缓存系统。
在诸如附图15所阐述的包含两个或更多缓存的缓存系统中,在各个缓存的组织中可以使用不同的技术。这些技术包括领域受限的缓存(scoped cache)、范围受限缓存(ranged cache)以及缓存策略。这些技术能够被组合使用。
在使用领域受限缓存的缓存系统的实施例中,每个缓存具有不同的缓存范围。领域受限缓存只对特定一组翻译器实例是可以访问的。特定缓存的缓存范围定义了哪些翻译器实例能够访问这个缓存。例如,在一种实施例中,每个缓存具有“私有的”或“全局的”缓存范围。私有缓存只能被创建它的翻译器实例所访问,并且它的内容在翻译器实例退出之后不再保持。全局缓存能够被任何翻译器实例所访问,这意味着,不止一个翻译器能够从缓存中检索缓存单元,或者将缓存单元存储到缓存中。全局缓存的内容可以持续到特定翻译器实例结束之后。
领域受限缓存系统的实施例可以包括其它可能的缓存范围值,包括(a)应用程序,(b)应用程序类型,(c)应用程序提供者,或者其它。具有“特定于应用程序”缓存范围的缓存只可以由正执行相同源应用程序的翻译器实例访问。具有“应用程序”缓存范围的缓存只可以由正执行相同类型应用程序(例如交互式、服务器、图形化)的翻译器实例访问。具有“应用程序提供者”缓存范围的缓存只可以由正执行由相同提供者所创作的应用程序的翻译器实例访问。
在使用范围受限缓存的缓存系统的实施例中,每个缓存与源地址范围相关,使得缓存只存储起始源地址在该范围内的包含翻译的缓存单元。
在包含两个或多个缓存的缓存系统中,可以实现不同的缓存策略,这些缓存策略改变各个缓存如何被使用的结构和约束。缓存策略包括插入策略和相应的查找策略。如附图17所示,当缓存系统存储缓存单元37时,插入策略51定义缓存单元被存储到的缓存A、B。如附图18所示,当缓存系统试图检索缓存单元37时,查找策略53决定多个缓存A、B被查询的顺序。
例如,表3阐明了缓存策略在插入策略、查找策略以及缓存策略对缓存系统的效果方面的三种例子。
  插入策略   查找策略   效果
 1   将所有结构添加到共享缓存A直到它达到一定大小,然后使用私有缓存B   最大缓存优先   这种策略给共享缓存大小强加了硬性限制
 2   如果不存在全局缓存,则创建共享缓存A并且将所有翻译结构存储到A。如果共享缓存A已经存在,则创建私有缓存B并将所有新的翻译结构存储到B。   最大缓存优先   这有效地放任第一翻译器实例将所有翻译结构添加到共享缓存。例如当缓存在以类似方式(即类似控制流)使用缓存单元的应用程序,诸如同样的应用程序或者来自相同提供者的应用程序,之间
  被共享时,这是有利的。
 3   对于在特定控制流(例如组块)上被优化的所有翻译,存储到较窄领域的缓存A。对于所有其它翻译,存储到较宽领域的缓存B。即,缓存B的领域比缓存A宽。   最窄缓存领域优先   这允许翻译器实例从由其它实例执行的通用优化中获益,同时仍然允许每个实例创建其自己的优化后代码。
                  表3:缓存策略
在查找策略只产生对缓存部分排序的情况下,其它探索(heuristics)可以被用于创建完整的排序。换句话说,查找策略可以产生一组相对于其它缓存组具有相同优先级的缓存;附加的探索作为组内仲裁器。例如,缓存系统可以使用以下探索:(1)最大优先,(b)最近命中(hit),或者其它。在“最大优先”探索中,最大缓存被首先查询,然后是第二大的缓存,以此类推。在“最近命中”探索中,查询最后返回缓存命中的组中的缓存,随后是包含再前一个最近命中的缓存,以此类推。
在具有两个或多个缓存的缓存系统中,对特定缓存关键字的查询可能返回多个缓存,每个缓存包含匹配缓存关键字的翻译结构。在多个命中之间选择时,缓存单元可以考虑其它因素。这些因素与缓存策略有效地交互,以确定缓存系统的结构和性能。这些因素可以包括(a)所有可能的缓存领域值的集合(即,存在多少不同的领域等级),(b)翻译器实例或缓存服务器的存储器或磁盘空间约束,(c)被执行的源应用程序,或者其它因素。
主动优化(aggressive optimization)
动态二进制翻译器能够执行多种优化,或者翻译器可以被配置为更主动地(aggressively)或更经常地应用多种优化,以额外翻译成本为代价。在不使用共享缓存技术的翻译器的实施例中,翻译器必须平衡翻译成本与执行成本,以优化特定的翻译器实例(即一次执行)。
在使用共享缓存技术的翻译器的实施例中,能够对多个翻译器实例,而不是对单个翻译器实例测量翻译成本。这样,翻译后的代码的主动优化在具有缓存的情况下更具吸引力。虽然在主动优化方案中最初的翻译成本更高,但是多个后续翻译实例的存在调整了代价,因为每个后续翻译享有先前优化结果的好处。主动翻译的成本变成由(特定源码序列或源程序的)第一翻译器实例所产生的“一次性”命中,但优化后的翻译的好处随后被能够使用该缓存的翻译器的所有后续实例所享有。
因此,在使用共享缓存技术的翻译器中,存在以下情形,即在特定源程序的第一次执行过程中应用花费更高的优化。对于第一次执行,这可能导致略低的性能,但是对于应用程序的将来执行,所获得的翻译结构将产生更好的性能,应用程序的将来执行不会导致翻译成本,因为他们能够在启动时就马上使用被缓存的翻译结构。主动优化策略的一种优化是:碰到未被翻译的源代码的相同源程序的将来翻译器实例可以选择最初不应用主动优化,以便减少在探查新代码路径时的边际翻译成本(以及由此导致的等待时间)。
尽管已经图示并描述了一些首选实施例,但对于那些熟悉本领域的技术人员来说,应该意识到可以对其做出各种改变和修改而不会背离本发明的范围,正如在附属权利要求书里定义的那样。
结合本申请以及那些和本说明书一起公开审查的内容,应该注意所有被同时归档或者在本说明书之前被归档的论文或文档,并且所有这类论文和文档的内容被合并到本文中以做参考。
在本说明书中公开的所有特征(包括任何附加权利要求、摘要以及附图)以及/或者在此公开的任何方法或程序的所有步骤可以用除其中至少有某些这类特征和/或步骤相互排斥的组合方式之外的其它任何组合方式被组合起来。
除非特别声明,否则在本说明书中公开的每种特征(包括任何附加权利要求书、摘要和附图)可以被适合于相同、相当或类似目的的替代特征所取代。因而,除非特别声明,否则被控开的每种特征都只是一般系列的相当或类似特征中的一个例子。
本发明不限于前述实施例的细节描述。本发明扩展到本发明中所公开特征中的任意一个独创的特征或者任意独创的特征组合(包括任何附加权利要求、摘要以及附图),或者扩展到本发明中所公开的方法或程序步骤中的任意一个独创的步骤或者任意独创的步骤组合。

Claims (21)

1.一种方法,包括:
将源码(17)的第一部分翻译为目标代码(21)的一部分;
缓存目标代码(21)的所述部分;以及
在检测目标代码(21)的所述部分和源码(17)的第二部分之间的兼容性时,检索目标代码(21)的被缓存部分。
2.根据权利要求1所述的方法,其中通过缓存关键字比较确定缓存翻译和要被翻译的源码(17)的兼容性。
3.根据权利要求2所述的方法,其中所述缓存关键字(39)是编码相应源码指令序列的字节序列。
4.根据权利要求2所述的方法,其中所述缓存关键字(39)是相应源码指令序列的散列。
5.根据权利要求2所述的方法,其中所述缓存关键字(39)包括:(1)可执行的文件名;(2)所述源码序列的偏移量和长度;(3)文件的最后修改时间;(4)所述翻译器的版本号;以及(5)源码序列的源存储器地址。
6.根据权利要求2所述的方法,其中所述缓存关键字(39)包括多种度量。
7.根据权利要求2至6中任一项所述的方法,其中通过计算对应于要被翻译为多个第二数据结构的源码(17)的缓存关键字(39)数据结构来确定兼容性,每个第二数据结构对应于被缓存的目标代码指令的不同集合。
8.根据前述权利要求中任一项所述的方法,进一步包括执行所述目标代码(21)的步骤。
9.根据前述权利要求中任一项所述的方法,其中自修改代码的翻译不被缓存。
10.根据前述权利要求中任一项所述的方法,其中被缓存的目标代码部分包括包含基本块的翻译结构。
11.根据前述权利要求中任一项所述的方法,其中被缓存的目标代码部分包括一个或多个块翻译以及他们各自的后续块列表。
12.根据前述权利要求中任一项所述的方法,其中所述目标代码(21)部分被转换成包括源程序和所有其相关库的单个缓存单元。
13.根据前述权利要求中任一项所述的方法,其中被缓存的目标代码部分包括单个指令。
14.根据前述权利要求中任一项所述的方法,其中被缓存的目标代码部分包括对应于相同起始源地址的所有代码块。
15.根据前述权利要求中任一项所述的方法,其中被缓存的目标代码部分包括表示源地址的离散范围的缓存单元。
16.根据前述权利要求中任一项所述的方法,其中被缓存为单元的目标代码部分包含源库。
17.根据前述权利要求中任一项所述的方法,其中源码(17)的所述第一部分是第一程序的一部分,源码(17)的所述第二部分是第二程序的一部分。
18.根据权利要求17所述的方法,其中在所述第一程序的翻译的末尾处,缓存所述目标代码(21)。
19.目标处理器与翻译器代码的组合,其中所述翻译器代码用于将源程序代码翻译为可在所述目标处理器上执行的目标代码(21),所述翻译器代码包括可由所述目标处理器执行的代码,以实现前述权利要求中任一项所述的方法。
20.一种存储翻译器代码的程序存储介质,所述翻译器代码用于将源程序代码翻译为目标代码(21),所述翻译器代码在由计算机执行时用于实现权利要求1到18中任一项所述的方法。
21.用于将源码(17)的第一部分翻译为目标代码(21)的一部分的程序代码与用于缓存目标代码(21)的所述部分并用于在检测到源码(17)的第二部分和目标代码(21)的所述部分之间的兼容性时检索所述目标代码(21)的程序代码的组合。
CNB200480020101XA 2003-07-15 2004-07-13 用于程序代码转换的共享代码缓存方法及设备 Expired - Lifetime CN100458687C (zh)

Applications Claiming Priority (3)

Application Number Priority Date Filing Date Title
GBGB0316532.1A GB0316532D0 (en) 2003-07-15 2003-07-15 Method and apparatus for partitioning code in program code conversion
GB0316532.1 2003-07-15
GB0328119.3 2003-12-04

Publications (2)

Publication Number Publication Date
CN1823322A true CN1823322A (zh) 2006-08-23
CN100458687C CN100458687C (zh) 2009-02-04

Family

ID=27763853

Family Applications (2)

Application Number Title Priority Date Filing Date
CNB2004800232770A Expired - Lifetime CN100362475C (zh) 2003-07-15 2004-07-13 用于在程序代码转换中划分代码的方法和装置
CNB200480020101XA Expired - Lifetime CN100458687C (zh) 2003-07-15 2004-07-13 用于程序代码转换的共享代码缓存方法及设备

Family Applications Before (1)

Application Number Title Priority Date Filing Date
CNB2004800232770A Expired - Lifetime CN100362475C (zh) 2003-07-15 2004-07-13 用于在程序代码转换中划分代码的方法和装置

Country Status (5)

Country Link
CN (2) CN100362475C (zh)
GB (3) GB0316532D0 (zh)
HK (2) HK1068698A1 (zh)
IL (1) IL172830A0 (zh)
TW (2) TWI365406B (zh)

Cited By (14)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102103481A (zh) * 2009-12-21 2011-06-22 英特尔公司 字节序转换工具
CN102193811A (zh) * 2010-12-08 2011-09-21 上海交通大学 消除内存访问冲突的编译装置及其实现方法
CN102298514A (zh) * 2010-06-14 2011-12-28 英特尔公司 用于有效动态二进制变换的寄存器映射技术
CN103309644A (zh) * 2012-03-13 2013-09-18 辉达公司 用于微处理器的转译地址高速缓存
TWI447649B (zh) * 2006-10-02 2014-08-01 Ibm 關於程式碼轉換之管理程序檔案系統之方法及設備
CN104375879A (zh) * 2014-11-26 2015-02-25 康烁 基于执行树深度的二进制翻译方法和装置
CN105893031A (zh) * 2016-03-28 2016-08-24 广州华多网络科技有限公司 一种缓存操作实现方法、业务层方法的调用方法及装置
US9880846B2 (en) 2012-04-11 2018-01-30 Nvidia Corporation Improving hit rate of code translation redirection table with replacement strategy based on usage history table of evicted entries
CN107902507A (zh) * 2017-11-11 2018-04-13 林光琴 控制软件现场调试系统以及调试方法
US10241810B2 (en) 2012-05-18 2019-03-26 Nvidia Corporation Instruction-optimizing processor with branch-count table in hardware
WO2019092565A1 (en) * 2017-11-10 2019-05-16 International Business Machines Corporation Using comments of a program to provide optimizations
US10324725B2 (en) 2012-12-27 2019-06-18 Nvidia Corporation Fault detection in instruction translations
CN112256597A (zh) * 2015-02-25 2021-01-22 微软技术许可有限责任公司 应用高速缓存热度的自动恢复
CN117348889A (zh) * 2023-12-05 2024-01-05 飞腾信息技术有限公司 代码翻译处理方法、系统、计算机系统及计算机设备

Families Citing this family (9)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20070294675A1 (en) * 2006-06-20 2007-12-20 Transitive Limited Method and apparatus for handling exceptions during binding to native code
US9015727B2 (en) 2008-04-02 2015-04-21 Qualcomm Incorporated Sharing operating system sub-processes across tasks
CN101458630B (zh) * 2008-12-30 2011-07-27 中国科学院软件研究所 一种基于硬件模拟器的自修改代码识别方法
US8069339B2 (en) * 2009-05-20 2011-11-29 Via Technologies, Inc. Microprocessor with microinstruction-specifiable non-architectural condition code flag register
US10108424B2 (en) 2013-03-14 2018-10-23 Nvidia Corporation Profiling code portions to generate translations
CN105700932B (zh) * 2014-11-25 2019-02-05 财团法人资讯工业策进会 针对软件程序的变量推论系统及方法
US20180210734A1 (en) * 2017-01-26 2018-07-26 Alibaba Group Holding Limited Methods and apparatus for processing self-modifying codes
US11442740B2 (en) * 2020-09-29 2022-09-13 Rockwell Automation Technologies, Inc. Supporting instruction set architecture components across releases
CN112416338A (zh) * 2020-11-26 2021-02-26 上海睿成软件有限公司 一种基于标签的代码仓库系统

Family Cites Families (19)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5313614A (en) * 1988-12-06 1994-05-17 At&T Bell Laboratories Method and apparatus for direct conversion of programs in object code form between different hardware architecture computer systems
US5619665A (en) * 1995-04-13 1997-04-08 Intrnational Business Machines Corporation Method and apparatus for the transparent emulation of an existing instruction-set architecture by an arbitrary underlying instruction-set architecture
US5875318A (en) * 1996-04-12 1999-02-23 International Business Machines Corporation Apparatus and method of minimizing performance degradation of an instruction set translator due to self-modifying code
US6711667B1 (en) * 1996-06-28 2004-03-23 Legerity, Inc. Microprocessor configured to translate instructions from one instruction set to another, and to store the translated instructions
US6112280A (en) * 1998-01-06 2000-08-29 Hewlett-Packard Company Method and apparatus for distinct instruction pointer storage in a partitioned cache memory
US6205545B1 (en) * 1998-04-30 2001-03-20 Hewlett-Packard Company Method and apparatus for using static branch predictions hints with dynamically translated code traces to improve performance
US6397242B1 (en) * 1998-05-15 2002-05-28 Vmware, Inc. Virtualization system including a virtual machine monitor for a computer with a segmented architecture
US6339822B1 (en) * 1998-10-02 2002-01-15 Advanced Micro Devices, Inc. Using padded instructions in a block-oriented cache
US6820255B2 (en) * 1999-02-17 2004-11-16 Elbrus International Method for fast execution of translated binary code utilizing database cache for low-level code correspondence
GB2348305A (en) * 1999-03-24 2000-09-27 Int Computers Ltd Instruction execution mechanism
US6529862B1 (en) * 1999-06-30 2003-03-04 Bull Hn Information Systems Inc. Method and apparatus for dynamic management of translated code blocks in dynamic object code translation
US6516295B1 (en) * 1999-06-30 2003-02-04 Bull Hn Information Systems Inc. Method and apparatus for emulating self-modifying code
US7072939B1 (en) * 2000-01-27 2006-07-04 International Business Machines Corporation Instant selective multiple soft document sharing between multiple heterogeneous computing devices
US20010049818A1 (en) * 2000-02-09 2001-12-06 Sanjeev Banerjia Partitioned code cache organization to exploit program locallity
US6615300B1 (en) * 2000-06-19 2003-09-02 Transmeta Corporation Fast look-up of indirect branch destination in a dynamic translation system
US6980946B2 (en) * 2001-03-15 2005-12-27 Microsoft Corporation Method for hybrid processing of software instructions of an emulated computer system
US20030093775A1 (en) * 2001-11-14 2003-05-15 Ronald Hilton Processing of self-modifying code under emulation
GB2393274B (en) * 2002-09-20 2006-03-15 Advanced Risc Mach Ltd Data processing system having an external instruction set and an internal instruction set
GB2400938B (en) * 2003-04-22 2005-07-06 Transitive Ltd Method and apparatus for performing lazy byteswapping optimizations during program code conversion

Cited By (22)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
TWI447649B (zh) * 2006-10-02 2014-08-01 Ibm 關於程式碼轉換之管理程序檔案系統之方法及設備
CN102103481A (zh) * 2009-12-21 2011-06-22 英特尔公司 字节序转换工具
CN102298514A (zh) * 2010-06-14 2011-12-28 英特尔公司 用于有效动态二进制变换的寄存器映射技术
CN102298514B (zh) * 2010-06-14 2014-07-16 英特尔公司 用于有效动态二进制变换的寄存器映射技术
CN102193811A (zh) * 2010-12-08 2011-09-21 上海交通大学 消除内存访问冲突的编译装置及其实现方法
CN102193811B (zh) * 2010-12-08 2014-04-16 上海交通大学 消除内存访问冲突的编译装置及其实现方法
CN103309644A (zh) * 2012-03-13 2013-09-18 辉达公司 用于微处理器的转译地址高速缓存
US10146545B2 (en) 2012-03-13 2018-12-04 Nvidia Corporation Translation address cache for a microprocessor
CN103309644B (zh) * 2012-03-13 2016-08-03 辉达公司 用于微处理器的转译地址高速缓存
US9880846B2 (en) 2012-04-11 2018-01-30 Nvidia Corporation Improving hit rate of code translation redirection table with replacement strategy based on usage history table of evicted entries
US10241810B2 (en) 2012-05-18 2019-03-26 Nvidia Corporation Instruction-optimizing processor with branch-count table in hardware
US10324725B2 (en) 2012-12-27 2019-06-18 Nvidia Corporation Fault detection in instruction translations
CN104375879B (zh) * 2014-11-26 2018-02-09 康烁 基于执行树深度的二进制翻译方法和装置
CN104375879A (zh) * 2014-11-26 2015-02-25 康烁 基于执行树深度的二进制翻译方法和装置
CN112256597A (zh) * 2015-02-25 2021-01-22 微软技术许可有限责任公司 应用高速缓存热度的自动恢复
CN105893031A (zh) * 2016-03-28 2016-08-24 广州华多网络科技有限公司 一种缓存操作实现方法、业务层方法的调用方法及装置
CN105893031B (zh) * 2016-03-28 2019-12-24 广州华多网络科技有限公司 一种缓存操作实现方法、业务层方法的调用方法及装置
WO2019092565A1 (en) * 2017-11-10 2019-05-16 International Business Machines Corporation Using comments of a program to provide optimizations
US10613844B2 (en) 2017-11-10 2020-04-07 International Business Machines Corporation Using comments of a program to provide optimizations
CN107902507A (zh) * 2017-11-11 2018-04-13 林光琴 控制软件现场调试系统以及调试方法
CN117348889A (zh) * 2023-12-05 2024-01-05 飞腾信息技术有限公司 代码翻译处理方法、系统、计算机系统及计算机设备
CN117348889B (zh) * 2023-12-05 2024-02-02 飞腾信息技术有限公司 代码翻译处理方法、系统、计算机系统及计算机设备

Also Published As

Publication number Publication date
CN100362475C (zh) 2008-01-16
CN1836210A (zh) 2006-09-20
GB0316532D0 (en) 2003-08-20
IL172830A0 (en) 2006-06-11
TW200515280A (en) 2005-05-01
TW200516497A (en) 2005-05-16
GB2404043B (en) 2006-04-12
HK1068699A1 (en) 2005-04-29
CN100458687C (zh) 2009-02-04
GB2404044A (en) 2005-01-19
GB0328121D0 (en) 2004-01-07
GB2404043A (en) 2005-01-19
GB0328119D0 (en) 2004-01-07
HK1068698A1 (en) 2005-04-29
GB2404044B (en) 2006-07-26
TWI362614B (en) 2012-04-21
TWI365406B (en) 2012-06-01

Similar Documents

Publication Publication Date Title
CN1823322A (zh) 用于程序代码转换的共享代码缓存方法及设备
CN1802632A (zh) 用于在程序代码转换期间执行解释器优化的方法和装置
Hellendoorn et al. Are deep neural networks the best choice for modeling source code?
Hueske et al. Opening the black boxes in data flow optimization
Kennedy et al. Automatic data layout for distributed-memory machines
Taylor An overview of the Hadoop/MapReduce/HBase framework and its current applications in bioinformatics
CN1127016C (zh) 计算机处理装置和方法
CN1146786C (zh) 用于自动修改数据库存取方法的方法
CN1218222A (zh) 数据序列产生方法及设备、转换方法及计算机
CN1672150A (zh) 用于软件原子化的视图
CN107851108B (zh) 使用位向量搜索索引的匹配文档
CN101021856B (zh) 分布式语音检索系统
Weir et al. Dbpal: A fully pluggable nl2sql training pipeline
CN1435031A (zh) 最长匹配地址查询的方法和装置
CN101040280A (zh) 元数据管理
Boehm et al. SystemML's Optimizer: Plan Generation for Large-Scale Machine Learning Programs.
JP2007531075A5 (zh)
Turcu et al. Automated data partitioning for highly scalable and strongly consistent transactions
CN1661593A (zh) 一种计算机语言翻译方法及其翻译系统
Chelini et al. Automatic generation of multi-objective polyhedral compiler transformations
CN103186607A (zh) 分布式语音检索系统
US20090328014A1 (en) Compiler based code modification for use in document ranking
Shahrokhi et al. Efficient query processing in python using compilation
CN110119275B (zh) 一种分布式内存列式数据库编译执行器架构
JP2016091356A (ja) 仮想データベースシステム管理装置、管理方法及び管理プログラム

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
ASS Succession or assignment of patent right

Owner name: INTERNATIONAL BUSINESS MACHINE CORP.

Free format text: FORMER OWNER: IBM YING CO., LTD.

Effective date: 20090731

Owner name: IBM YING CO., LTD.

Free format text: FORMER OWNER: TRANSITIVE LTD.

Effective date: 20090731

C41 Transfer of patent application or patent right or utility model
TR01 Transfer of patent right

Effective date of registration: 20090731

Address after: American New York

Patentee after: International Business Machines Corp.

Address before: England Hampshire

Patentee before: IBM UK Ltd.

Effective date of registration: 20090731

Address after: England Hampshire

Patentee after: IBM UK Ltd.

Address before: London, England

Patentee before: Transitive Ltd.

CX01 Expiry of patent term

Granted publication date: 20090204

CX01 Expiry of patent term