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

技术编号:2887680 阅读:216 留言:0更新日期:2012-04-11 18:40
本发明专利技术提供减少编译的代码中动态类加载和初始化检查的代价的技术。在编译时,即使得不到所需的运行期执行信息,虚拟机指令也被编译成一条或多条本机机器指令。本机机器指令包括所需运行期执行信息应当位于的占位符数据。本机机器指令可以由一条将控制转移给一段代码或残桩的本机机器指令覆盖,代码段或残桩在运行期执行时用所需的运行期执行信息替换占位符数据,继续执行。(*该技术在2019年保护过期,可自由使用*)

【技术实现步骤摘要】

本专利技术涉及编译软件。更具体来说,本专利技术涉及减少编译代码中动态(即运行期)类加载和初始化检查的代价的技术。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个人电脑或兼容机生成、目的是为编译的J本文档来自技高网...

【技术保护点】
一种在计算机系统中编译指令的方法,该方法包括: 接受一条需要运行期执行信息的用于运行时编译的指令; 将该指令编译成位于一个第一位置上的至少一条本机机器指令,这至少一条本机机器指令包括有用于所需运行期执行信息的占位符数据;以及 用一条将控制转移给一段本机机器指令的本机机器指令覆盖第一位置上的这至少一条本机机器指令,这段本机机器指令在运行期将用所需的运行期执行信息替换占位符数据。

【技术特征摘要】
...

【专利技术属性】
技术研发人员:L巴克S米特罗维
申请(专利权)人:太阳微系统有限公司
类型:发明
国别省市:US[美国]

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1