减少编译代码中动态类初始化检查的代价的技术的制作方法

文档序号:6416323阅读:133来源:国知局
专利名称:减少编译代码中动态类初始化检查的代价的技术的制作方法
技术领域
本发明涉及编译软件。更具体来说,本发明涉及减少编译代码中动态(即运行期)类加载和初始化检查的代价的技术。
JavaTM程序设计语言是SUN Microsystems公司开发的一种面向对象的高级程序设计语言,设计得很灵便,能在从小型设备(例如寻呼机(pagers)、蜂窝电话和智能卡)到超级计算机的范围很宽的计算机上执行。用Java(和其它语言)编写的计算机程序可以被编译成虚拟机指令,由Java虚拟机来执行。总之,Java虚拟机是一种解码并执行虚拟机指令的解释器。
适合Java虚拟机的虚拟机指令是字节代码,即指令包含一个或多个字节。字节代码是按照一种特定的文件格式存储的,这种文件格式叫作“类文件”。类文件包含类的过程(method)的字节代码。类文件除了包含类的过程的字节代码之外,还包含一个符号表以及其它附属信息。
以一个或多个类文件中Java字节代码实现的计算机程序是独立于平台的。这种计算机程序不加修改就可以在任何能运行Java虚拟机实现的计算机上执行。Java虚拟机是一种对“通用”计算机的软件仿真器,这是使得Java虚拟机的计算机程序能独立于平台的一个主要因素。
Java虚拟机可以实现为软件解释器。常规解释器在执行期间解码并执行所解释的程序的虚拟机指令,每次一条指令,这与编译器不同,后者在执行之前将源代码解码成本机机器指令,这样,就不在执行期间进行解码。为了能运行时编译,Java虚拟机可以既包含解释器又包含编译器。一般来说,Java虚拟机是用Java程序设计语言以外的其它程序设计语言(例如C++程序设计语言)编写的。
在运行时编译时,一个Java过程可以访问(读或写)尚未加载的一个类的域。为了提高运行期性能在运行期正在将虚拟机指令编译成本机机器指令的Java虚拟机,可能得不到编译时所能得到的全部信息。例如,假若一个类未被加载,那么要确定该类一个实例内的一个实例变量的偏移量(offset),即使并非不可能,也很困难。
对得不到运行期执行信息的问题的一个解决办法是,生成在类的域被访问之前察看一个类是否已经加载和初始化的本机机器指令。实际上,这种解决方法弊大于利。运行时检查会降低系统的性能,其程度远超过编译对性能的提高。
对得不到运行期执行信息的问题的另一个解决办法是,加载-并可能初始化-编译虚拟机指令所要求的运行期执行信息涉及的任何类。尽管这似乎是个好办法,但是,如果在运行时执行没有必要加载该类时,这就会毫无必要地降低系统的速度。例如,假设一条修改类A的实例的域的语句只有当X=0时才执行,则类A可以等到当X=0时才加载(假若没有其它理由要加载类A的话)。此外,不必要地初始化一个类,语义上也不正确,因为Java运行环境的设计要求是,只有当对类需要时才在运行时动态地加载类。
总之,本发明的实施例提供了减少编译代码中动态类加载和初始化检查的代价的革新技术。在编译时,即使得不到所需的运行期执行信息(即对域的偏移量),虚拟机指令也被编译成一条或多条本机机器指令。本机机器指令可以有所需运行期执行信息应当位于的占位符数据(例如哑值)(placeholder data)。所有或部分本机机器指令可以由一条将控制转移给一段代码或残桩(stub)的本机机器指令覆盖,代码或残桩在运行期执行时用所需的运行期执行信息替换占位符数据。
相应地,当本机机器指令首次执行时,如果需要,可以加载类和初始化。然而,由于所需的运行期执行信息将在本机机器指令首次执行时插入本机机器指令,随后执行本机机器指令就不会有类加载和初始化检查的花费。本发明提供运行期前编译的运行期性能。此外,通过只在适当时间初始化类,所以系统的语义也得以保留。下面描述本发明的若干实施例。
在一个实施例中,一种计算机实现的编译指令的方法包括接收一条要求运行期执行信息的用于运行期编译的指令。该指令被编译成一条或多条本机机器指令后位于一个第一位置,而本机机器指令包括有用于所需运行期执行信息的占位符数据。第一位置上本机机器指令的起始部分被一条将控制转移给一段本机机器指令的本机机器指令覆盖,这段本机机器指令在运行期执行时用所需的运行期执行信息替换占位符数据。在优选实施例中,要被编译的指令是Java虚拟机指令。
另一个实施例中的一种计算机实现的编译指令的方法,包括接收一条要求运行期执行信息的用于运行期编译的指令。该指令被编译成一条或多条本机机器指令后位于一个第一位置,而本机机器指令包括有用于所需运行期执行信息的占位符数据。至少将这些本机机器指令的一部分复制到一个第二位置。生成一段本机机器指令,这段本机机器指令在运行时,用所需的运行期执行信息替换第二位置上本机机器指令内的占位符数据,将第二位置上具有所需的运行期执行信息的本机机器指令复制到第一位置,并将控制转移给第一位置土具有所需的运行期执行信息的本机机器指令。第一位置上本机机器指令的起始部分被一条将控制转移给这段本机机器指令的本机机器指令覆盖。
另一个实施例中的一种计算机实现的编译指令的方法,包括接收一条要求运行期执行信息的用于运行期编译的指令。该指令被编译成一条或多条本机机器指令后位于一个第一位置,而本机机器指令包括有用于所需运行期执行信息的占位符数据。至少将这些本机机器指令的一部分复制到一个第二位置。生成一段本机机器指令,这段本机机器指令在运行时,将第二位置上的本机机器指令复制到第一位置,用所需的运行期执行信息替换第一位置上本机机器指令内的占位符数据,并将控制转移给第一位置上具有所需的运行期执行信息的本机机器指令。第一位置上本机机器指令的起始部分被一条将控制转移给这段本机机器指令的本机机器指令覆盖。
通过以下结合各附图的详细说明,本发明的其它特点和优点将变得显而易见。


图1表示一例可用来执行本发明的实施例的软件的计算机系统。
图2表示图1计算机系统的系统框图。
图3表示Java源代码程序是如何执行的。
图4表示一个Java运行时系统一个实现的部件。
图5表示本发明一个实施例的高层次流图。
图6A表示用于一个编译过程的一个本机指令序列,图6B表示采用本发明的实施例去执行运行时类加载和初始化检查的本机指令序列。
图7A和图7B表示按照本发明的实施例编译一个过程的流图。
图8表示在本发明另一个采用解析例程(resolution routine)的实施例中,表示一个所编译的过程的一个本机机器指令序列。
图9表示可以从图8的本机机器指令调用的解析例程的流图。
定义机器指令(或指令)-指示计算设备执行一个由操作码(OP码)和可选的一个或多个操作数规定的操作的指令。
虚拟机指令-软件仿真的微处理器或计算机体系用的指令(也称虚拟代码)。
本机机器指令-为特定微处理器或计算机体系设计的指令(也称本机代码)。
过程(method)-软件例程(也称函数、子例程、过程(proceduce)成员函数)域-类类型的的变量,包括静态变量和实例变量。
实例变量-每个实例只存在一次的类的实例的变量。
静态变量-每个类只存在一次的类的变量。
运行时编译-运行时刻进行的对代码的编译。
运行期执行-运行时刻进行的对代码的执行。
在以下说明中,将结合减少为编译的Java虚拟机指令进行动态类加载和初始化检查的花费的优选实施例来描述本发明。特别地,将通过举例说明可以为IBM个人电脑或兼容机生成、目的是为编译的Java虚拟机指令进行运行时类加载和初始化检查的实际本机机器指令。不过本发明并不局限于任何特定语言、计算机体系结构或专门实现。因此以下对实施例的描述的目的是示例性的而不是限制性的。
图1表示一例可用来执行本发明的实施例的软件的计算机系统。图1所示的计算机系统1包括显示器3、屏幕5、机箱7、键盘9及鼠标11。鼠标11可有一个或多个能与图形用户界面交互作用的按钮。机箱7上安装了CD-ROM驱动器13、系统内存和硬驱(见图2),它们可用来存储、提取包含实现本发明的计算机代码的软件程序、本发明所用数据等等。尽管图中是用CD-ROM15来代表计算机可读存储介质的,但是也可以采用其它计算机可读存储介质,包括软盘、磁带、快速存储器、系统内存和硬盘。此外,实现在(例如包括因特网在内的网络中的)载波中的数据信号也可算作是计算机可读存储介质。
图2表示用于执行本发明实施例的软件的计算机系统1的系统框图。如图1一样,计算机系统1包括监视器3和键盘9以及鼠标11。计算机系统1还包括一些子系统,诸如中央处理器51、系统内存53,固定存储器(例如硬驱)、可卸式存储器57(例如CD-ROM驱动器)、显示适配器59、声卡61、音箱63和网络接口65。其它适于本发明使用的计算机系统包含的子系统或多一点,或少一点。例如,另一个计算机系统可以有一个以上的处理器51(例如多处理器系统),或者有高速缓冲存储器。
计算机系统1的总线结构由箭头67表示。不过这些箭头是示意性的,表示能连接各子系统的任何互连方案。例如,可用本地总线将中央处理器连接到系统内存和显示适配器。图2所示的计算机系统仅仅是适宜用于本发明的计算机系统的一个例子。其它具有不同子系统配置的计算机结构也是可以采用的。
一般来说,用Java程序设计语言编写的计算机程序,首先要被编译成字节代码或Java虚拟机指令,然后再由Java虚拟机执行。字节代码被存储在类文件中,再输入到Java虚拟机去解释。图3表示一段简单的Java源代码由解释器即Java虚拟机执行的过程。
Java源代码101包括有用Java编写的经典Hello World程序。该源代码然后被输入到能将源代码编译成字节代码的字节代码编译器103。字节代码是虚拟机指令,因为它们是由软件仿真的计算机执行的。一般来说,虚拟机指令是通用的(即不是专门为任何特定微处理器或计算机体系结构设计的),但这一点并非必要。字节代码编译器输出的Java类文件105包含用于Java程序的字节代码。
Java类文件被输入到Java虚拟机107。Java虚拟机是一个解释器,能解码和执行Java类文件中的字节代码。Java虚拟机是一个解释器,但通常被称为虚拟机,这是因为它用软件来仿真微处理器或计算机体系结构(例如硬件上可能并不存在的微处理器或计算机体系结构)。
Java类(和接口)是动态加载、链接和初始化的。加载是系统寻找类的二进制形式(例如类文件)并由该二进制形式构造一个类对象来代表该类的过程。类类(Class class)是一种用于存储或表示类的结构的类。链接是采用类的二进制形式、将其联合到系统的运行状态从而使其可以执行的过程。类的初始化包括执行类的静态初始化程序和类中所声明的静态域的初始化程序。
每个Java类都有一个与其关联的常量池。常量池存储在Java类文件中,起着与符号表相类似的功能。一般来说,常量池中的每一项都由一个数字作索引,数字的范围是1到常量池中项的数目。类的过程通过索引来访问常量池中的项。一个类的过程不能访问另一个类的常量池。
除了存储直接量常量的常量池外,常量池还用符号来存储类、过程、域、接口。用符号来存储这些项,意思是存储标志该项的名称而不是物理地址。换言之,如果类A有个域F,则A和F的两个名称(连同一个F的类标记)都会在常量池存储。由于存储名称而不是地址,Java运行时系统在运行期动态地解决到物理地址的符号引用。
图4表示一个Java运行时系统一个实现的部件。Java虚拟机的实现称为Java运行时系统。Java运行时系统201为了执行Java程序,可以接受Java类文件203、标准内置Java类205和本机过程207的输入。标准内置Java类可以是诸如线程、串之类的对象的类。本机过程可以用Java程序设计语言以外的其它程序设计语言来编写。本机过程一般存储在动态链接库(DLL)或共享库中。
Java运行时系统也可以与操作系统209连接。例如,输入-输出功能可以由操作系统来处理,包括为Java运行时系统提供到Java类文件203、标准内置Java类205和本机过程207的接口。
动态类加载器和检验器211通过操作系统209将Java类文件203和标准内置式Java类205加载到内存213。此外,动态类加载器和检验器还检查Java类文件中字节代码的准确性,报告检查出的错误。
本机过程链接器215通过操作系统209将本机过程207链接到Java运行时系统,并将本机过程存入内存213。如图所示,内存213包含一个用于Java类的类与过程区,一个用于本机过程的本机过程区。内存213中的类与过程区可存储在垃圾收集堆中。新的对象被创建后,就被存储在垃圾收集堆中。当存储空间不再使用时,由Java运行时系统而不是应用程序负责收回垃圾收集堆中的内存。
图4所示Java运行时系统的核心是执行引擎217。执行引擎执行在内存213中储存的指令,可以由软件、硬件或二者的结合来实现。执行引擎支持面向对象的应用程序,理论上讲,有多个与每个Java线程对应的执行引擎在同时运行。执行引擎217也可以使用支持代码221。支持代码可提供有关异常、线程、安全之类的功能。
执行引擎217一般都包括有解释器和编译器。执行引擎可以编译过程或过程的部分,以提高系统的性能。因此,“运行期”(或运行时)可以包含编译和执行二者。运行期编译是Java字节代码可以被编译时的时间框架,运行期执行是Java字节代码(无论是否编译过)可以被执行(例如,Java字节代码中的判定被计算和执行)时的时间框架。在每个线程中,运行期编译和运行期执行之间可以反复转换,这种转换在线程间可以是独立的。
图5表示本发明一个实施例的高层次流图。该流图表示如何将一条需要运行期执行信息的指令进行编译以高效率地进行运行期检查。所示流图是为了解释本发明的实施例,因此本领域的熟练人员容易知道,该流图并不暗示各步骤有特定顺序。此外,流程步骤可以增加,减少,组合,这些都不偏离本发明的范围。
一般来说,系统在编译指令时要循环进行提取和编译指令的过程。图5的流程图表示的是对单一指令编译的过程。在步骤301,系统接受一条要求运行时信息的用于运行期编译的指令。例如,该指令要访问一个尚未加载的类的一个域。尽管可以将该类加载以帮助编译,但这会降低系统的性能,因为它在运行期执行时可能并不需要。
在步骤303,系统将指令编译成一条或多条本机指令。由于有对运行期执行信息的需要,所以可以在本机指令中插入占位符数据。占位符数据可以是随机数据,或者是表示运行期执行期间某些信息的选定数据。有些实施例中的占位符数据是哑值。
在步骤305,系统将本机指令从第一个位置拷贝到第二个位置。第一个位置一般是本机指令将要被执行的位置,第二个位置可以是一个缓冲器,指令在运行期要在这里处理。系统改写位于第一个位置的本机指令,以将控制转移给一段代码。转移控制的机制可以是一个能执行这种功能的本机指令之一,这些指令包括jump(跳转)、goto(无条件转移)或call(调用)。一般地,转移控制的本机指令是一条不会改写所有本机指令的短指令。因此在有些实施例中,只将本机指令中被改写的部分拷贝到第二个位置。
在步骤309,系统将代码放入将用在运行期执行时需要的运行期执行信息替换第二个位置上本机指令中的占位符数据的代码段。例如,如果所需要的运行期信息是某实例变量的某偏移量,则该段中的代码就可在运行期执行时确定该实例变量的该偏移量。然后,该实例变量的该偏移量就会被适当地插入到本机指令中以便完成本机指令。
在步骤311,系统把代码放入将在运行期执行时把第二个位置上的本机指令拷贝到第一个位置的代码段。这样,就可以把完成的本机指令以编译的代码拷回它们原来的位置。本机指令的拷回,也会覆盖掉在步骤307生成的、转移控制的本机指令。在有些实施例中,第二个位置上的本机机器指令是在运行期执行时拷回到第一个位置的,从而可以插入所需的运行期执行信息。
在步骤313,系统把代码放入将在运行期执行时向第一个位置上的本机指令转移控制的代码段。简而言之,该实施例在本机指令首次被执行时插入不完全的本机指令,但是随后对本机指令的执行,是按它们正确的编译形式来执行的。这就使得本发明的实施例能快速完成运行期类加载和/或初始化检查。
尽管图5描述了一个实施例的流程图,分析一下该实施例中的本机指令的样式是有益的。图6A示出一个本机指令的序列401。为区别起见,按顺序赋予各机器指令一个标签下标。本机指令(带下标7和8)403是通过编译一条指令而生成的。现在假定生成本机指令的该指令需要运行期执行信息。
图6B表示包括了运行时类加载与初始化检查的图6A的本机指令序列。图6A和图6B中相同的标号表示类似结构。本机指令403包括一个将控制转移到本机指令段405的跳转指令(jump)。该段包括原始本机指令403的一份拷贝,定位该本机指令拷贝的代码,将该拷贝插回原来位置的代码,以及将控制转回到本机指令403的跳转指令(jump)。本机指令段可以由图5的步骤309,311和313生成。
本机指令段405可以在过程被编译之后生成。标签M和B用来表示控制被转移到的位置。这样,只有首次执行了本机指令403,该本机指令段才被执行,用所需的运行期执行信息去完成本机指令。
图7A和7B示出Java虚拟机中编译一个过程的流图。在步骤501,系统提取一个要编译的虚拟机指令。一旦提取该虚拟机指令后,系统就在步骤503判定该虚拟机指令是否访问一个域。访问是虚拟机指令可要求运行时执行信息的一种方式。然而本发明可以有利地应用于其它类型的运行时执行信息。
如果该虚拟机指令并不访问一个类域,在步骤505完成该虚拟机指令。否则,就在步骤507判定该域的类是否被加载。如果该类被加载,系统将能计算任何所需的偏移量,并前进到步骤505。另外,对于静态变量,该系统可检查该类是否加载但未初始化。如果未初始化该类,可以进行运行时执行检查以确定该类是否已被初始化。这种检查对于实例变量可能不是必需的,因为为了创建该类的一个实例,该类将被初始化。
如果该类没有加载,系统就在步骤509用占位符数据代替所需的运行期执行信息来编译虚拟机指令。系统也可以在步骤511标记所生成的本机机器指令的位置,以便该过程被编译后,能生成用于完成本机机器指令的代码(例如图6B的代码段405)。标志可记录图6B中M指定的位置。
在步骤513,系统判断是否还有虚拟机指令要编译。如果有,系统执行步骤501。如果没有虚拟机指令要编译,则该过程的编译完成,只是在步骤511作了标记的本机机器指令尚不完整。
现在参见图7B,系统要处理各个标志,首先在步骤551检查是否有任何剩余的标志。如果有剩余的标志(一个编译的过程可能有多个标志),系统就在步骤553将所标记的本机机器指令拷贝到缓冲器。缓冲器可以位于过程编译时生成的本机机器指令的末端。
在步骤555,系统将作标记的本机机器指令改写为一个向一个残桩(stub)的跳转指令(jump),本文用残桩描述一个代码段。在步骤557。系统在残桩中放置修正或完成缓冲器中本机机器指令的本机机器指令。在步骤559,系统在残桩中放置将修正的本机机器指令拷回它们原来位置(例如由标志指示的位置)的本机机器指令。
在步骤561,系统在残桩中放置跳转到修正的本机机器指令的本机机器指令。控制的返回转移可能只需要用单一一条本机机器指令,例如用跳转(jump)指令。因此本说明中所用术语的单、复数形式,视具体实施例会有所变化。
图8表示可以由图7A和7B所示流程图生成的一个编译的过程的一个本机指令序列。所示的一个本机机器指令序列601代表该过程的本机机器指令。由本机机器指令603代表的Java虚拟机指令是putstatic。putstatic虚拟机指令将一个值写入一个类的一个静态变量。
适于IBM兼容机的本机机器指令可以按下述编写MOVL EAX,CLASSMOVL[EAX+OFFSET],EBX其中CLASS代表内存中类定义的位置,OFFSET代表静态变量在类定义内的偏移量。第一条移动语句将内存中该类定义的位置移动到寄存器EAX。第二条移动语句将寄存器EBX的内容(它包含要在静态变量中存储的值)移动到通过寄存器EAX与OFFSET相加得出的一个位置,这个位置就是静态变量在内存中的位置。
如果该类没有加载,则CLASS和OFFSET这两个的值可能是只有到运行期执行时才能解决。因此,在运行期编译时可用哑值来代替它们。
图中所示的本机机器指令段605中含有(如上所述的)本机机器指令603的拷贝。在有些实施例中,该本机机器指令段是一个缓冲器,能存储要处理的本机机器指令和含有处理该缓冲器的本机机器指令的残桩。在其它实施例中,该缓冲器起着一个临时存储器的作用,用于存储本机机器指令被覆盖的部分,以及在原来位置处理本机机器指令。
本机机器指令段605包括一条push语句,其功能是将指向常量池的、用于域的索引压到运行期堆栈上。常量池一般包含类、域名和类型标记。然后,从该本机机器指令段调用一个解析例程。
解析例程可以完成本机机器指令。图9是这种例程的一个实施例。在步骤701,如果需要,该例程就加载类。该类由在调用解析例程之前推上运行期堆栈的指向常量池的索引规定的。在步骤703,例程如果需要就初始化该类。该类可能并不需要加载或初始化,因为这些步骤可能已经在Java程序其它部分的运行期执行期间进行过。此外,所示的解析例程对类加载和初始化二者都进行检查。尽管在优选实施例中执行这两个步骤,也可以用本发明方法进行其它不同的运行期执行的检查。
在步骤705,例程解析类域。例程可以只解析内存中某个域的位置,也可以解析该域及其所属类这二者的位置。在步骤707,例程修正本机机器指令,方法是用解析出的类域信息替换占位符数据。在步骤709,例程返回到修正的本机机器指令去继续执行。
如图8和9所示,该本机机器指令段可以调用其它例程去完成该本机机器指令,所以并非所有实施例中的该本机机器指令段都必须包含所有的代码。在优选实施例中,由本发明生成的每个这种本机机器指令段都调用该解析程序。
以上完整地说明了本发明的优选实施例和各种可以采用的各种替代、修改与等同方案。然而很明显的是,对上述实施例作适当改进后,本发明也完全适用。例如,尽管以上描述的实施例是针对特定的运行期执行信息的,本发明的原理也完全可以适用于任何在运行时编译期间得不到运行期信息的情形。因此不应认为以上说明限制了本发明的范围。本发明的范围由后附的权利要求的界定及其全部等同范围而定义。
权利要求
1.一种在计算机系统中编译指令的方法,该方法包括接受一条需要运行期执行信息的用于运行时编译的指令;将该指令编译成位于一个第一位置上的至少一条本机机器指令,这至少一条本机机器指令包括有用于所需运行期执行信息的占位符数据;以及用一条将控制转移给一段本机机器指令的本机机器指令覆盖第一位置上的这至少一条本机机器指令,这段本机机器指令在运行期将用所需的运行期执行信息替换占位符数据。
2.权利要求1的方法,进一步包含将这至少一条本机机器指令拷贝到一个第二位置。
3.权利要求2的方法,其中,该段本机机器指令用所需的运行期执行信息替换第二位置上的这至少一条本机机器指令中的占位符数据。
4.权利要求3的方法,其中,该段本机机器指令将第二位置上具有所需运行期执行信息的这至少一条本机机器指令拷贝到第一位置。
5.权利要求4的方法,其中,该段本机机器指令将控制转移给第一位置上具有所需运行期执行信息的这至少一条本机机器指令。
6.权利要求2的方法,其中,该段本机机器指令在运行期执行时将至少一条本机机器指令拷贝到第一位置。
7.权利要求6的方法,其中,该段本机机器指令在运行期执行时用所需运行期执行信息替换第一位置上至少一条本机机器指令中的占位符数据。
8.权利要求7的方法,其中,该段本机机器指令将控制转移给第一位置上具有所需运行期执行信息的这至少一条本机机器指令。
9.前述任一权利要求的方法,其中,所需运行期执行信息在运行期编译期间不可用的原因是某个类尚未加载。
10.权利要求9的方法,其中,所需运行期执行信息涉及的是尚未加载的类的一个实例变量。
11.权利要求9的方法,其中,所需运行期执行信息涉及的是尚未加载的类的一个静态变量。
12.权利要求1-9之一的方法,其中,所需运行期执行信息是在运行期执行时某个类是否为某个静态变量作了初始化。
13.权利要求12的方法,其中,要进行一次运行期执行检查以判断该类是否作了初始化。
14.前述任一权利要求的方法,其中,该指令是虚拟机指令。
15.权利要求14的方法,其中,该指令是Java虚拟机指令。
16.权利要求15的方法,其中,该指令是getfield、putfield、getstatic或putstatic。
17.一种提供可扩充应用程序的计算机程序产品,包含接受一条需要运行期执行信息的用于运行时编译的指令的计算机代码;将该指令编译成位于一个第一位置上的至少一条本机机器指令的计算机代码,其中这至少一条本机机器指令包括有用于所需运行期执行信息的占位符数据;以及用一条将控制转移给一段本机机器指令的本机机器指令覆盖第一位置上的这至少一条本机机器指令的计算机代码,其中这段本机机器指令在运行期用所需的运行期执行信息替换占位符数据;以及存储该计算机代码的计算机可读介质。
18.一种在计算机系统中编译指令的方法,该方法包括接受一条需要运行期执行信息的用于运行时编译的指令;将该指令编译成至少一条位于一个第一位置的本机机器指令,该至少一个本机机器指令包括有用于所需运行期执行信息的占位符数据;将该至少一条本机机器指令复制到一个第二位置;生成一段本机机器指令,这段本机机器指令在运行时,用所需的运行期执行信息替换第二位置上至少一条本机机器指令内的占位符数据,将第二位置上具有所需运行时执行信息的至少一条本机机器指令拷贝到第一位置,并将控制转移给第一位置上具有所需的运行期执行信息的至少一条本机机器指令;用一条将控制转移给这段本机机器指令的本机机器指令覆盖第一位置上的该至少一条本机机器指令。
19.权利要求18的方法,其中,所需运行期执行信息在运行期编译期间不可用的原因是某个类尚未加载。
20.权利要求19的方法,其中,所需运行期执行信息涉及的是尚未加载的类的一个实例变量。
21.权利要求19的方法,其中,所需运行期执行信息涉及的是尚未加载的类的一个静态变量。
22.权利要求18-21之一的方法,其中,所需运行期执行信息是在运行期执行时某个类是否为某个静态变量作了初始化。
23.权利要求22的方法,其中,要进行一次运行期执行检查以判断该类是否作了初始化。
24.一种提供可扩充应用程序的计算机程序产品,包含接受一条需要运行期执行信息的用于运行时编译的指令的计算机代码;将该指令编译成位于一个第一位置上的至少一条本机机器指令的计算机代码,其中该至少一条本机机器指令包括有用于所需运行期执行信息的占位符数据;将该至少一条本机机器指令复制到一个第二位置的计算机代码;生成一段本机机器指令的计算机代码,该段本机机器指令在运行时,用所需的运行期执行信息替换第二位置上至少一条本机机器指令内的占位符数据,将第二位置上具有所需运行时执行信息的至少一条本机机器指令拷贝到第一位置,并将控制转移给第一位置上具有所需的运行期执行信息的至少一条本机机器指令;用一条将控制转移给这段本机机器指令的本机机器指令覆盖第一位置上的该至少一条本机机器指令的计算机代码;存储该计算机代码的计算机可读介质。
25.一种在计算机系统中编译指令的方法,该方法包括接受一条需要运行期执行信息的用于运行时编译的指令;将该指令编译成至少一条位于一个第一位置的本机机器指令,该至少一个本机机器指令包括有用于所需运行期执行信息的占位符数据;将该至少一条本机机器指令复制到一个第二位置;生成一段本机机器指令,这段本机机器指令在运行时,将第二位置上的至少一条本机机器指令拷贝到第一位置,用所需的运行期执行信息替换第一位置上至少一条本机机器指令内的占位符数据,并将控制转移给第一位置上具有所需的运行期执行信息的至少一条本机机器指令;用一条将控制转移给这段本机机器指令的本机机器指令覆盖第一位置上的该至少一条本机机器指令。
26.权利要求25的方法,其中,所需运行期执行信息在运行期编译期间不可用的原因是某个类尚未加载。
27.权利要求26的方法,其中,所需运行期执行信息涉及的是尚未加载的类的一个实例变量。
28.权利要求26的方法,其中,所需运行期执行信息涉及的是尚未加载的类的一个静态变量。
29.权利要求25-28之一的方法,其中,所需运行期执行信息是在运行期执行时某个类是否为某个静态变量作了初始化。
30.权利要求29的方法,其中,要进行一次运行期执行检查以判断该类是否作了初始化。
31.一种提供可扩充应用程序的计算机程序产品,包含接受一条需要运行期执行信息的用于运行时编译的指令的计算机代码;将该指令编译成位于一个第一位置上的至少一条本机机器指令的计算机代码,其中该至少一条本机机器指令包括有用于所需运行期执行信息的占位符数据;将该至少一条本机机器指令复制到一个第二位置的计算机代码;生成一段本机机器指令的计算机代码,该段本机机器指令在运行时,将第二位置上的至少一条本机机器指令拷贝到第一位置,用所需的运行期执行信息替换第一位置上至少一条本机机器指令内的占位符数据,并将控制转移给第一位置上具有所需的运行期执行信息的至少一条本机机器指令;用一条将控制转移给这段本机机器指令的本机机器指令覆盖第一位置上的该至少一条本机机器指令的计算机代码;存储该计算机代码的计算机可读介质。
全文摘要
本发明提供减少编译的代码中动态类加载和初始化检查的代价的技术。在编译时,即使得不到所需的运行期执行信息,虚拟机指令也被编译成一条或多条本机机器指令。本机机器指令包括所需运行期执行信息应当位于的占位符数据。本机机器指令可以由一条将控制转移给一段代码或残桩的本机机器指令覆盖,代码段或残桩在运行期执行时用所需的运行期执行信息替换占位符数据,继续执行。
文档编号G06F9/45GK1234553SQ9910408
公开日1999年11月10日 申请日期1999年3月23日 优先权日1998年3月23日
发明者L·巴克, S·米特罗维 申请人:太阳微系统有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1