用于在运行时间选择编译方式的方法和装置的制作方法

文档序号:6417507阅读:200来源:国知局
专利名称:用于在运行时间选择编译方式的方法和装置的制作方法
技术领域
本发明一般地涉及计算机软件和软件可携带性领域。具体地,本发明涉及根据特定平台的要求对程序进行编译的方法。
JavaTMvirtual machine(JVM)可在各种不同的计算机体系结构上执行并且可适应源于不同微处理器的不同的技术要求和标准。这样一种标准的例子是当操作浮点数时由某些微处理器所采用的扩充精度浮点格式。一种这样的微处理器是Intel Corporation的IA-32微处理器体系结构,这种体系结构采用扩充精度(80比特)浮点计算。其它的处理器通常采用单(32比特)或双(64比特)精度浮点计算。
当扩充精度格式中计算的数值被转换到单或双精度格式时会出现问题。作为举例的一个问题是,由于JavTM语言规定浮点运算必须产生具有由IEEE754所规定的范围和精度的结果,该规定在本文中认为适于各种用途;然而,由Intel Corporation of Santa Clara,California所制造的IntelIA-32会产生具有较大范围和精度的结果。这些较宽的结果必须精确地被舍入到IEEE754的单和双精度格式。在IA-32微处理器中至少存在有二种实施这种舍入的方式,各具不同的代价(代码规模和执行速率)。一个静态编译器(或一个一次动态编译器)必须选择一种执行过程,而这种选择对所有环境来说不是最佳的选择。此问题由

图1表示。
图1是示出典型的双精度浮点的格式和扩充精度浮点的格式的框图。格式102示出Intel IA-32体系结构的一种扩充精度浮点数格式,它与IntelIA-32的双精度浮点格式相反。符号位104表明该数是正还是负。接下来的位106表示一个用于代表该浮点数的一个指数的值的指数值。
位108包括的各比特用于保持一个有效位。为了表示该数的整数部分,该有效位可保持高达64比特。因此,在扩充精度浮点格式中就有80(1+15+64)比特。浮点运算通常由一个浮点单元来处理。通过操作有效位和指数,这个单元可有效地执行复杂的运算。正如在现有技术中已知的那样,以整数和指数表示浮点数使得浮点数的计算更为容易。
参见图1的由IEEE754所描述的一个双精度浮点格式112。这个格式形式上类似于扩充精度格式的形式,不同的是指数和有效位部分的比特数。如上所述,Intel IA-32处理器得出的结果以扩充格式表示。作为例子的问题来自James Gosling、Bill Joy和Guy Steele所著的JavaTM语言指南(JavaTMLanguage Specification)(ISBN 0-201-63451-1),该指南在本文中全部用作参考用途,其中需要以IEEE754单或双格式得出结果。返回到格式112,与双或单精度格式相反,符号位104与扩充格式是相同的。指数位114具有与位106相同的功能,但保持与在扩充格式中的15比特不同的11比特。有效位116保持与在扩充格式中的64比特不同的52比特。因此,该双精度浮点格式可保持64比特。有效位长度方面的差异由图1中的虚线区域所标出(该图中指数长度的4比特差别没有类似的图示)。
举例而言,当自IA-32处理器给出一个扩充精度结果时,需要单或双格式结果的Java语言会出现问题。如果扩充指数超出了单或双精度的范围,则会出现上溢或下溢在IA-32中,通过硬件处理上溢,但可通过本发明所述的方法来寻址。下溢则更难以处理,因为有效位可被移位(向右)以缩小指数。然而,这种移位损失了有效位的比特数,因此损失了该结果的精度。计算正确的、较低精度的有效位需要若干指令,并且该运算通常放入一个单独的子程序以备需要时调用。该作为例子的问题并不是计算结果的正确舍入,而是对其进行检测以校正。
图2a和2b示出了二种检测浮点下溢的方法。参见图2a,在一种方法中,程序代码202通过采用在该程序代码中的一个陷阱处理程序204来执行一个陷阱以检测该问题,以便调用一个陷阱程序206采校正该问题。在另一方法中,参见图2b,程序代码208包括代码210,用于每当在例如乘法和除法运算的方式中使用浮点时检测会潜在地出现的问题。
利用陷阱处理程序206,将停止所有的运算,同时该问题被寻址。当一个陷阱被调用时,在执行该陷阱程序之前,包括引起该陷阱的该指令位置在内的机器状态被存储。但是,如果该陷阱没有被调用,则不存在因运算引起的内部操作,仅有一次性的用于建立该陷阱处理程序的线索表内部操作,它将随后监控所有浮点运算。另一方面,程序代码210示出了在该程序中插入代码的技术以处理浮点下溢问题。利用这种方法,在每次可能引起一次下溢问题的运算之后,如果必要的话,有联机代码检验该问题并调用一个子程序以产生正确的舍入结果。对于各不出现的下溢,这种方法需要许多不必要的处理器运算。然而,当该问题被检测到时,它的解决无需暂停所有的运算,并且无需节省一个过程或线索表内容以处理陷阱。如上所述,浮点下溢是具有在一个给定平台上的另一解决方案的问题的一个例子。在对Java虚拟机有效的处理一个特殊问题的若干执行过程中,会出现其他的问题,其中各执行过程在某些情况下更为有效。
因此,在解决由特定平台变化所产生的问题时,希望合理地和动态地选择所采用的一种执行过程。浮点下溢问题仅作为一具体说明,最好是,例如在检测和校正浮点下溢的同时,减少所必须的联机代码量并且避免使用一个陷阱处理程序以调用一个子程序去校正该问题的内部操作。最好是允许一个动态运行时间编译器去选择一个执行过程,并且如果愿意的话还可监控其效率并改变其执行过程。
根据本发明,公开了用于虚拟机的、以确定在执行一个程序的同时如何编译与该程序相关的字节代码的方法、装置和计算机程序产品。在本发明的一个方面,在运行时间可以多种方式编译的程序中的一个指令被检索到,并且以一种特定方式(通常为隐含方式)被编译。虚拟机再在运行时间确定编译该指令的另一种方式是更为所希望的,并且该字节代码指令再以该另一种方式重新编译。
在一个实施例中,带有被重新编译的字节代码指令的可执行指令与被重新编译的其它指令置于一列中。虚拟机对在程序的执行中出现的任何程序上的变化要求进行检查,这些要求是从可编译该程序的多种方式的每一种的简档数据中产生的。在另一个实施例中,特定字节代码指令由虚拟机以与编译该指令的第一种或隐含方式不同的一种方式被重新编译。
在本发明的另一方面,提供了一种从一个单一程序产生不同的可执行指令组的方法。一个程序在运行时间以例如隐含方式的一种确定的方式被编译,以建立一组字节代码指令。虚拟机在运行时间再确定是否需要以一种不同的方式编译该程序,并且以此建立用于替代第一组的不同的一组本机指令。
在一个实施例中,虚拟机动态地产生一个程序的可被处理的每一种方式的简档数据,以确定以哪一种方式去重新编译该程序。该简档数据包括一个计数器,它存储以一种特定方式执行该程序的次数。虚拟机确定一组特定的本机指令是否由另一组本机指令来替代,以更有效地动态处理该程序的改变要求。
在本发明的另一方面,说明了一种用于执行在一个程序中的一个浮点指令的系统。该系统确定一个特定指令是否产生一次浮点下溢,并且检查一个指示器以确定一个浮点运算所导致的下溢次数。如果该指示器低于一预置值,则在运行时间通过虚拟机的一种方式编译该浮点运算,如果该指示器高于预置值,则在运行时间以另一种方式编译。
在本发明的又一方面,说明了一种使用一个陷阱程序或一个显式检验来产生用于检测浮点下溢的指令的方法。它确定程序中的一个运算是否可以产生一次浮点下溢,并且检验一个计数器以确定一个特定浮点运算所导致的下溢次数。如果该计数器低于一预置值,则该运算在运行时间被编译,如果该计数器高于一预置值,则使用一个联机显式检验重新编译。与该陷阱程序和联机显式检验相关的数据动态地产生,并且在运行时间被存储。
通过结合附图参考下面的说明将会更好地了解本发明。
图1示出现有技术的双精度浮点的典型格式和扩充精度浮点的格式的框图。
图2a和2b示出现有技术的检测浮点下溢的二种方法。
图3a是表明包括Java源代码的JavaTM程序的转换成本机代码在一特定平台或计算机上运行的方框/处理图。
图3b示出由下述图10所示的计算机系统1000所支持的虚拟机307的框图。
图4示出不同文本的本机指令是如何从一个Java程序产生的框图。
图5示出根据本发明的一个实施例的由Java虚拟机对Java字节代码进行编译的过程的流程图。
图6示出根据本发明的一个实施例的包括动态产生的简档数据的本机指令是如何产生的框图。
图7示出根据本发明的一个实施例的由Java虚拟机编译浮点运算和当出现下溢时确定如何对其进行校正的流程图。
图8示出参照图7的步骤713的使用一个陷阱程序处理由浮点指令所引起的下溢的更为详细的过程的流程图。
图9示出参照图7的步骤717的用于检测和校正浮点下溢的一个显式检验程序的流程图。
图10是适用于实施本发明的一个实施例的一个典型计算机系统的框图。
现在将详细参阅本发明的一个特定实施例。这个实施例的一个例子将结合附图加以说明。虽然本发明要结合一个特定实施例进行说明,但可以理解,本发明并不仅限定于一个实施例。相反,所涉及的替换、修改和等效均包括在如所附权利要求规定的本发明的精神和范围之内。
本发明所作的选择是在一个给定体系结构上执行一些给定类型的各可供选用的运算实施之间进行的。常规的方法通常一次产生代码,其或在编译时间静态,或在运行时间动态。本发明所描述和所要求保护的是允许虚拟机在运行时间去选择,根据运行时间执行数据利用该运行时间编译器而产生多个可能的代码段。它允许一个动态编译器去选择一个实施,同时如果希望的话监控其效率并改变该实施。
如前所述,有两种通用方式去检测和安置浮点下溢。一种方式是采用陷阱方式,这种方法包括采用快和短的代码,但是当该陷阱被处理时,需要停顿正常的程序执行。另一种方法包括在每一浮点运算之后在程序中插入代码以检测下溢,这种方法需要每次执行该代码,但允许程序顺序地执行。
当需要将扩展浮点格式的结果存储在一个单或双浮点格式中时,会出现下溢问题。例如,当一个结果在Intel体系结构计算机中被计算出,然后以单或双精度格式存储时,会出现下溢更具体地说,当利用很小的数执行计算时,例如当结果的指数小于可在目标(IEEE754单或双精度格式)中所表示的最小指数时,会出现此问题,并且有效位是舍入该精确结果的结果。为了在目标中存储其最接近的表示,必须了解的是有效位是不准确的(因此被舍入),并且了解以哪种方式被舍入和为什么被舍入。这种检测和校正对于保持很小数的准确度是重要的,即对于测量一趋近于0的值的率值是很重要的。
图3a示出根据本发明的一个实施例的包括在从Java源代码建立的本机指令之中的输入/输出和执行软件/系统的框图。在其它的实施例中,本发明可以利用一个用于另一种语言的虚拟机或利用除Java类文件之外的类文件来实施。由该图的左侧开始,首先输入的是以由Sun Microsystems ofMountain View,California所开发的JavaTM编程语言所写的Java源代码301。Java源代码301被输入到一个字节代码编译器303中。字节代码编译器303实质上是一个将源代码301编译为字节代码的程序。字节代码包括在一个或多个Java类文件305中。Java类文件305是可携带的,它可在任何具有Java虚拟机(JVM)的计算机中执行。一个虚拟机的部件在图3b中详细示出。Java类文件305被输入到JVM307。JVM307可用在任何计算机中,不必是用在相同的具有字节代码编码器303的计算机。JVM307可在若干功能的其中之一运行,例如作为翻译器或编译器。如果它作为一个编译器运行,则它可进一步作为一个“即时”(“just in time”)(JIT)编译器或作为一个适当的编译器而运行。当作为一翻译器运作时,JVM307对Java类文件305中包括的每一个字节代码指令进行翻译。
图3b示出例如JVM307的虚拟机311的框图,它可由下面所示的图10的计算机系统1000来支持。如前所示,当一个计算机程序例如JavaTM编程语言所写的程序从源代码翻译为字节代码时,在一个编译时间环境中源代码301被提供给一个字节代码编译器303。字节代码编译器309将源代码301译成字节代码305。通常,在源代码301由软件开发程序建立时就被译为字节代码305。
字节代码305通常可通过一个网络,例如图10的网络接口1024被再现、下载或者分布,或者存储在存储装置,例如图10的主存储器1004。在所述实施例中,字节代码303是平台独立的。也就是,字节代码303基本上可在任何运行一个适当的虚拟机311的计算机系统上被执行。由编译的字节代码构成的本机指令可被保留以便将来由该JVM使用。在这种方式中,通过多次执行使该翻译的代价被分摊,所述多次执行为本机代码提供一种优于翻译代码的速率优势。例如,在一个JavaTM环境中,字节代码305可以在运行JVM的计算机系统中执行。
字节代码305提供给一个包括虚拟机311的运行时间环境313。运行时间环境313通常可利用例如图10的CPU1002的一个处理器来执行。虚拟机311包括一个编译器315、一个翻译器317和一个运行时间系统319。字节代码305通常可提供到编译器315或翻译器317。
当字节代码305提供给编译器315时,包括在字节代码305中的方法被编译为本机机器指令(未示出)。另一方面,当字节代码305被提供给翻译器317时,字节代码305一次一字节代码地被读入翻译器317。翻译器317再随着每一个字节代码被读入翻译器317而执行由每一个字节代码所定义的操作。通常,翻译器317处理字节代码305并且基本上连续地执行与字节代码305相关的操作。
当从操作系统321调用一个方法时,如果它被确定是作为一个翻译方法而被调用,则运行时间系统319可以从翻译器317得到该方法。另一方面,如果确定该方法是作为一个编译方法而被调用,则运行时间系统319启动编译器315。编译器315再从字节代码305产生本机机器指令并执行该机器语言指令。通常,当虚拟机311终止时,该机器语言指令就被废弃。在TimLindholm和Frank Yelin所著的JavaTM虚拟机指南(The JavaTMVirtualMachine Specification)(ISBN 0-201-63452-X)中详细描述的虚拟机或更详细地说是JavaTM虚拟机的操作,在本文中全部作为参考使用。
如上所述,一个Java程序中的指令有时可以一种以上的方式而被编译。根据较早所举的例子,例如乘法(FMUL)或除法(FDIV)运算的可潜在地导致下溢的浮点运算可至少以两种不同的方式而被编译显式检验或陷阱。图4的流程图示出如何从Java程序产生不同文本的本机指令。一个Java程序401(在图3a和3b中的输入301),在由字节代码编译器编译为Java类文件之后,程序401通过框403(图3a中的系统307)中的JVM在运行时间从该字节代码编译为本机机器指令。JVM仅用于说明目的。本领域的技术人员都了解,虚拟机通常用于将一个给定的输入表示译为一个本机指令组,其中有一个实施选择。在下面的图5中描述了由JVM进行的Java类文件的编译方法。
如前所述,JVM可假定为两种功能之一翻译该类文件中所包括的Java字节代码,或编译该类文件从而建立在具有JVM的同一计算机中运行的本机指令组(即,它们是不可携带的)。因此,对于作为一个编译器而执行的JVM,参考如框405的那样,根据该JVM如何对字节代码进行编译,可从同一Java程序得到各种本机指令组。采用浮点运算作为一个例子,在其所有的FMUL或FDIV中,本机指令407都可包括显式检验(即,联机),然而,对于相同的浮点运算,本机指令409可仅包括一个陷阱,或者本机指令411可以包括此二者的组合。
这里值得注意的是,图4没有描述JVM决定在运行时间进行编译所采用的路径(即,根据如何或何时执行该源代码而决定是否编译Java源代码、翻译该代码或者执行其它的操作)。图4却示出,如果通过JVM获得的该编译路径在运行时间可以不同的“方式”编译该代码,则据此可建立不同的本机指令组。此过程由图5详细说明。
图5是示出根据本发明的一个实施例的Java机将Java字节代码编译为本机机器指令的过程的流程图。在步骤501,JVM从一个Java类文件中检索到一个或多个字节代码指令。在步骤503,JVM确定一个特定指令是否可以一种以上的方式被编译。图7中详细说明了可以一种以上方式被编译的一个字节代码指令的一个特定例子。如果JVM确定该指令可仅以如IADD或LSUB运算的方式被编译,则在步骤505中,JVM对该字节代码进行编译。在JVM对先前取得的字节代码进行编译之后,在步骤515它会确定是否还有任何剩余的字节代码。
如果JVM确定有多种方式对字节代码进行编译,则在步骤507确定它将以哪种方式编译该字节代码。在所述实施例中,采用JVM去进行这种判断的机制在图6中作了较详细的说明。该机制包括采用以能够对字节代码进行编译的每一种不同的方式所动态产生的简档信息。在步骤509,JVM确定是否采用隐含方式编译字节代码。隐含方式通常是运行时间编译器作者所信任的方式,在考虑了当时可用的选择之后,该方式通常是更为有效的或者是合乎逻辑的方式。
在步骤509,如果JVM确定字节代码应当以第一种方式编译,将在步骤513进行这项工作,并产生第一个本机指令组,例如图4的本机指令组A。在步骤515,它再确定在该类文件中是否还有任何其它的字节代码。如果还有,则返回到步骤501以检索下一个字节代码。如果没有其余的字节代码,则该程序结束。
在步骤509,如果该JVM确定编译字节代码的方式不是第一种或隐含方式,则在步骤511JVM使用另外的编译技术对字节代码指令进行编译。其后处理从步骤513开始,并在步骤515确定是否还有任何剩余的要编译的字节代码。为了简单起见,图5中仅考虑了二种不同的方式,但本发明可以其优越之处而被应用于三种或多种编译字节代码的方式。
图6的框图示出根据本发明的一个实施例的包括动态产生的简档数据的本机机器指令是如何产生的。图6除了包括有可由JVM编译的字节代码指令的各不同方式的信息之外,它与图4是相似的。如图5的步骤503所述一样,如果确定有多种方式将字节代码编译成本机代码,则相应的信息被产生。图6的项部是Java程序601,它由字节代码编译器编译为字节代码之后被输入到Java虚拟机603。JVM根据字节代码被编译成本机指令的不同方式而输出若干种不同的本机指令组605。这些本机指令组605还可包括一个数据空间,用于存储在运行时间收集的动态收集数据607。此信息可包括例如计数器、计时数据和其它与字节代码被编译的特殊方式的效率有关的信息的简档信息。
动态收集数据还可与本机指令一起被存储并且随字节代码由JVM编译而更新。在一个实施例中,如图5的步骤507所述的那样,JVM检验此信息以确定用哪种方式编译字节代码。动态简档数据可被JVM采用以确定例如某一特定的编译方式是否持续有效、字节代码以这种方式被执行了多少次,或者是否经过了一定的时间周期。JVM在编译的同时可查询该数据以确定是否现行指令是字节代码的最有效的实施。如果发现是无效执行则JVM可重新编译任何字节代码。通过查询数据607,JVM一旦确定字节代码应如何编译,它可如图5的步骤509所述那样,确定它应是第一种(隐含)方式还是其它方式的其中一种。
图7是说明根据本发明的所述实施例的编译浮点运算及如果出现下溢则如何校正之的Java虚拟机的流程图。编译浮点运算是确定如何以上述几种方式编译程序的一个具体的例子。更一般地来说,编译是由试探法所引导的,或者假定有关代码(即,编译TABLESWITCH指令)的平均表现,任何对于这种编译的运用可以确定如何以上述的几种方式编译一个程序。在步骤701,JVM从Java类文件检索一个字节代码。在步骤703,JVM确定该字节代码指令是否产生一次下溢。可产生下溢的二种典型的浮点运算是乘法和除法。在所述实施例中,如果JVM确定该具体的指令不会产生下溢问题,则它如步骤705所述的那样执行对该字节代码的编译。
如果该指令可潜在地产生下溢问题,则JVM开始确定下溢如何被检测和校正的过程。如上所述,在所述实施例中,JVM可使用显式检验(即,联机代码)或陷阱来检测下溢。在另一实施例中,可以使用检测下溢的另外方法来代替或除了所述方法之外的方法。
在步骤707,虚拟机检验与用于检测下溢的陷阱相关的计数器是否超过一预置阈值作为该陷阱的部分,这些指令被包括在内以增加与每一陷阱指令相关的一个计数器数值。如果任何特定的计数器超过某一阈值,则还包括重新调用字节代码翻译器的指令。在这些浮点指令的例子中,计数器只是可被检验以确定用哪种方式编译该特定字节代码的信息或简档数据的类型的一个例子。参照图6,计数器和类似的信息607可与本机指令组一同保持。在另外的实施例中,例如计时器的其它数据类型可用来替代或结合计数器以确定JVM用哪种方式编译字节代码。
如所述,计数器每次被更新,就以特定的方式执行一个具体的浮点运算,该运算在JVM的单个Java类文件的执行期间被执行多次。例如,计数器可依一个有条件的循环具体指令而更新。在所述实施例中,每次一个具体的浮点运算引起一次要使用陷阱校正的下溢时,计数器数值就递增。再参照图5,如步骤509所述的“第一种方式”可对应于编译一个指令的陷阱方式。在所述实施例中,当以第一种方式编译时,最好避免计数器,因为它的可取之处是在较常占用的执行通道中减少了运算次数。在图7所示的特定实施例中,如果用于被编译的特定浮点运算(它会潜在地产生下溢)的计数器没有达到一阈值时,JVM将连续使用第一种方式,在此例中,即是编译该指令的陷阱方式。如果计数器超过一阈值,则该指令/方法会标有以“第二方法”重新编译的标志。如上所述,作为该陷阱的部分,这些指令被包括在内以递增与各陷阱指令相关的计数器数值。
参见步骤709,使用陷阱方式编译指令的第一步骤是确定是否建立了一个陷阱处理程序。陷阱处理程序的第一次建立是因为Java类文件要调用该陷阱处理程序。一个陷阱处理程序第一次(由JVM)建立时,编译器会决定对需要该陷阱处理程序的代码进行编译(之前是不需要该陷阱处理程序的)。在所述的实施例以及大多数Java程序中,程序的每一线索表都有一个陷阱处理程序。对于线索表的详细说明,请见Java语言指南(the JavaLanguage Specification),该说明在这里作为参考。如果要建立一个陷阱处理程序,则在步骤711进行。如果对一个特定的线索表已建立了一个陷阱处理程序,则如步骤713所示那样,JVM采用该陷阱方式编译指令。图8较详细地说明了使用一个陷阱处理程序编译指令的过程。一旦编译完成,则在步骤715中JVM检验是否在Java类文件中还有字节代码。如果有,则JVM返回到步骤701并且重复该处理过程。
在步骤707,JVM检验计数器是否超过一预置数值(即,以某种方式执行指令的次数大于该预置数值所表示的次数)。如果是,则JVM以下一种方式编译字节代码,在本例子中,下一种方式是指如步骤717所示的采用显式检验(联机代码)去检测和校正浮点下溢。在另外的实施例中,不同于计数器方式的标准可用于确定字节代码翻译器是否以某种方式连续执行一个已编译的字节代码。图9详细说明了编译字节代码指令的显式检验方式。在步骤719,虚拟机设置一个与显式检验配合使用的计时器。该时间是用于测量使用显式检验方式的时间长度。在步骤715,虚拟机检验是否还有字节代码。如果没有,则对该Java类文件中的字节代码进行编译的过程完成。
图8的流程图详细描述了如图7的步骤713所述的采用一个陷阱去处理来自一个浮点指令的下溢的过程。在步骤801,JVM确定Java类文件中的哪一个字节代码指令正在调用该陷阱。一旦虚拟机确定出哪一个指令正在调用该陷阱,则在步骤803使与该浮点运算相关的一个计数器的数值递增。如图6所述,该计数器可与本机指令一同保持。一旦该计数器递增,则在步骤805中虚拟机检验该计数器的数值。如果该计数器大于一阈值,则在步骤807将包括该浮点指令的模块加以标志以重新编译。
在所述实施例中,该模块不立即被重新编译。而是被排入一列中,由虚拟机根据其来源和活动水平确定其重新编译的时间。在另外的实施例中,该模块可立即被编译或在一个指定的时间被编译。在所述实施例中,虚拟机不管该模块被重新编译的实际时间,而是根据一个计数器来决定重新编译。在其它的实施例中,虚拟机可以使用其它标志,有关的标志来自动态产生的简档数据并且如图6所示可与本机指令一同存储。一旦该模块被标志,或在步骤807被标志以另一种方式重新编译,则虚拟机返回到图7的步骤715以检验该Java类文件中是否还有字节代码。在步骤805,如果该计数器未超过一预置数值,则在步骤809中JVM采用一个陷阱去处理浮点下溢。然后虚拟机返回到图7的步骤715。
图9是说明在图7的步骤717所述的用于检测和校正浮点下溢的显式检验的流程图。如前所述,显式检验是在由JVM在Java类文件所产生的本机指令组中插入的用以检测和校正浮点下溢的代码。图9示出虚拟机如何能确定何时编译该显式检验方式(对应于图5的步骤511中所述的“下一种方式”),或者何时标志类似于图8的步骤807的包括要重新编译的浮点指令的模块。在步骤901,虚拟机采用显式检验方式校正浮点下溢。如前所述,显式计数器可被插入以跟踪由显式检验或由所使用的计时器所检测到的下溢次数。以这种方式使用计数器的一个潜在的缺点是从处理的角度来看相对地太昂贵。在另外的实施例中,可使用计时器和计数器的组合。虚拟机再检验从初次使用显式检验起经过了多少时间。回想图7的步骤719的内容,在所述的实施例中,在指令被编译为一个显式检验之后,虚拟机设置了一个计时器。在步骤903,使用相同的计时器以确定是否经过了一个预置的时间周期。在所述实施例中,如果经过了该预置的时间周期,则在步骤905中JVM对该模块加以标志或以另一方式标志以重新编译。
在一个实施例中,在经过一定时间之后,JVM重新编译该字节代码。这样做是为了将现行的编译方式重置回隐含方式,从而防止由于不适应新环境而增长的潜在的对该Java类文件的无效执行。该模块一旦被加以标志及被排入一列之中以在由虚拟机确定的时间重新编译,则计数器和其它对应于该特定浮点指令的简档数据就被重置或更新,从而新的简档信息可以被保持。在步骤907,计数器被重置。然后虚拟机返回到图7的步骤719。
本发明可采用各种计算机实施的运算,包括存储在计算机系统中的信息。这些运算包括,但不限于,需要对物理参量进行的物理操作。通常,虽然不是一定,这些参量具电或磁信号的形式,可被存储、传输、组合、比较和以其它方式的操作。这里对构成本发明部分的所述的运算是有用的机器运算。所执行的操作常常涉及例如产生、识别、运行、确定、比较、执行、下载或检测的项目。将这些电或磁信号变为比特、数值、元素、变量、字符等,主要是为了便于共用的原因。然而,应当记住,所有这些和类似的项目都与适当的物理量相关,并且只不过是作为方便应用于这些物理量的标记。
本发明还涉及用于执行前述操作的器件、系统或装置。该系统可以是按所需目的特别构成,或者可以是由存储在其中的计算机程序有选择地启动或构成的普通用途计算机。前述的处理并不特别地涉及任何特殊的计算机或其它的计算装置。具体地说,各种普通用途计算机都可根据本文的教导所写的程序来使用,或者也可以为了更方便起见而构成更为特殊的计算机系统以执行所需的操作。
图10示出适用于执行根据本发明的一个实施例的处理的一个通用计算机系统1000的框图。例如,JVM307、虚拟机311或字节代码编译器303都可在通用计算机系统1000上运行。图10表示了一个通用计算机系统的一个实施例。其它的计算机系统体系和结构可以用来执行本发明的处理。由下面所述的各种子系统组成的计算机系统1000,包括至少一个微处理器子系统(也称之为中央处理单元,或CPU)1002。即,CPU1002可由一个单片处理器或由多个处理器来实现。CPU1002是一个控制该计算机系统1000的操作的通用数字处理器。该CPU1002使用自存储器取得的指令来控制输入信息的接收和操作,并在输出器件上输出和显示信息。
CPU1002经存储总线1008与通常为随机存储器(RAM)的第一主存储器1004双向耦合,并且与通常为只读存储器(ROM)的第二主存储区域1006单向耦合。正如在现有技术中已知的那样,主存储器1004可以用作一个普通的存储区域和便笺式存储器,并且还可用作存储输入数据和已处理数据。除了用于在CPU1002上的处理操作的其它数据和指令之外,它还可存储编程指令和数据,并且通常用于通过存储器总线1008双向地快速传输数据和指令。另外,正如在现有技术中已知的那样,主存储器1006通常包括由CPU1002使用以执行其功能的基本操作指令、程序代码、数据和目标。主存储器件1004和1006可包括下述的任何适合于计算机可读存储介质,该介质取决于例如数据存取是双向或单向的。CPU1002还可直接和极快地从/向一个超高速缓冲存储器1010取得/存储所需的数据。
可拆卸大容量存储器件1012为计算机系统1000提供附加的数据存储能力,并通过外设总线1014双向或单向地耦合至CPU1002。例如,通常通称为CD-ROM的特定的可拆卸大容量存储器件通常是单向地向CPU1002传递数据,而软盘则可双向地向CPU1002传递信息。存储器1012还可包括计算机可读介质,例如磁带、快速存储器、包括在载波中的信号、聪明卡、可携带大容量存储装置和其它存储装置。固定的大容量存储器1016还提供附加的数据存储能力,并通过外设总线1014双向地耦合到CPU1002。通常,对这些介质的存取比对主存储器1004和1006的存取要慢。大容量存储器1012和1016通常存储附加的程序指令、数据等,这些指令、数据等通常是CPU1002不常用的。可以预计到,如有必要的话,大容量存储器1012和1016中所保存的信息可以按标准方式相结合,如同虚拟存储器那样作为主存储器1004(即RAM)的部分。
除了为CPU1002提供对存储器子系统的存取用途之外,外设总线1014也用于提供对其它子系统和装置的存取。在所述实施例中,这些子系统包括显示监视器1018和适配器1020、打印装置1022、网络接口1024、辅助输入/输出装置接口1026、声卡1028和扬声器1030以及其它所需的子系统。
采用所述的网络连接,网络接口1024使CPU1002与另外的计算机、计算机网络或电通信网络相连接。通过网络接口1024,可预期CPU1002可接收信息,例如目标、程序指令、或来自另一网络的一部计算机的字节代码指令,或者可以在执行上述方法的步骤中向另一网络的一部计算机输出信息。通常以指令序列所表示的可在CPU中执行的信息可从另一网络接收并输出给另一网络,例如,其形式是包括在载波中的计算机数据信号。接口卡或类似的器件以及由CPU1002所实施的适当的软件可用于将计算机系统1000连接到一外部网络并且根据标准协议传送数据。也就是,本发明的方法实施例可只在CPU1002上单独执行,或者可以与一个共享该处理部分的远距离CPU相配合,通过例如因特网、内部网或局域网而被执行。附加的大容量存储装置(未示出)还可通过网络接口1024连接至CPU1002上。
辅助I/O装置接口1026表示普通的和定做的允许CPU1002发送、并且更为典型的是从其它装置接收数据的接口。通过本机总线1034连接到CPU1002的是键盘控制器1032,它用于接收来自键盘1036或指示器装置1038的输入,并从键盘1036或指示器装置1038向CPU1002发送已解码的符号。该指示器装置可以是一个鼠标、记录笔、跟踪球或一个图形输入板,对于与作图用户接口相互作用是很有用的。
另外,本发明的实施例进一步涉及具有其上带有用于执行各种所实施的计算机操作的程序代码的计算机可读介质的计算机存储器产品。该计算机可读介质是可存储可再由计算机系统读取的数据的任何数据存储装置。计算机可读介质的例子包括,但不限于,硬盘、软盘和例如专用集成电路(ASIC)或可编程逻辑装置(PID)的特殊构成的硬件装置的所有上述介质。该计算机可读介质还可以存在于计算机系统网络中的载波中的数据信号方式而分布,因而计算机可读代码以一种分布形式被存储和执行。
本领域的普通技术人员将会预计到,上述硬件和软件元件是标准设计和结构的部件。适用于本发明的其它计算机系统可以包括附加的或少量的子系统。另外,存储器总线1008、外设总线1014和本机总线1034是用来说明连接子系统的任何互连方式。例如,本机总线可以用来将CPU连接到固定的大容量存储器1016和显示适配器1020。图10所示的计算机系统收是适用于本发明的计算机系统的一个例子。还可以利用具有不同子系统结构的计算机体系结构。
虽然为了清晰理解的目的而在前面对发明作了某些详细的说明,但显然某些变化和修改可在所附权利要求的范围之内进行。例如,虽然结合浮点下溢对陷阱和显式联机检验方式作了说明,但其它用于检测下溢的手段也可使用并可包括在本发明中。在另一例子中,虽然说明了编译一个指令的两种方式,但是如果有更多的方式是可行的,则本发明的方法和装置可适应于多于两种编译一个程序的方式。再有,应注意的是,虽然采用浮点下溢操作对本发明进行了说明,但是本发明可以智能地和动态地选择用来解决由于特定平台变化而出现的问题的实施方案。浮点下溢仅是一个这样的问题。另外,还应注意的是还有实施本发明的处理和装置的替换的方式。因此,本实施例只是作为说明并不作为限制,本发明并不限于本文所给出的详细说明,而是可以在所附权利要求的范围和等效情况之内进行修改。
权利要求
1.一种在运行时间确定如何编译与一个计算机程序相关的字节代码的方法,包括检索出与可以多种方式编译的所述计算机程序相关的一个字节代码指令;以第一种方式编译所述字节代码指令;在运行时间确定编译所述字节代码指令的第二种方式是所希望的;和以第二种方式重新编译所述字节代码指令。
2.根据权利要求1所述的方法,其特征在于,它还包括将包含要重新编译的所述字节代码指令的一个模块排在一个列中。
3.根据权利要求1所述的方法,其特征在于,它还包括在运行时间确定可以多种方式编译所述字节代码指令。
4.根据权利要求1所述的方法,其特征在于,它还包括动态地检验所述计算机程序的改变效率。
5.根据权利要求4所述的方法,其特征在于,它还包括在运行时间搜集当前执行的能对所述计算机程序进行编译的多种方式的其中一种方式的特定数据。
6.根据权利要求1所述的方法,其特征在于,它还包括当所述第二种方式不同于所述第一种方式时,以所述第二种方式重新编译所述字节代码。
7.一种从一个软件程序中产生不同的本机指令组的方法,包括以第一种方式编译所述软件程序以建立第一个本机指令组;在软件程序的运行时间确定以不同的方式编译所述软件程序是所希望的;和以不同的方式重新编译所述软件程序以建立第二个本机指令组,据此以第二个本机指令组替代第一个本机指令组。
8.根据权利要求7所述的方法,其特征在于,它还包括动态地检验所产生的特定数据以确定哪一种方式有利于对所述软件程序重新编译。
9.根据权利要求8所述的方法,其特征在于,动态产生的特定数据包括一个计数器,它用于存储已执行的特定编译的次数。
10.根据权利要求7所述的方法,其特征在于,它还包括确定是否由第二个本机指令组替代第一个本机指令组,以更有效地动态处理所述软件程序的改变要求。
11.根据权利要求7所述的方法,其特征在于,它还包括在所述软件程序的运行时间确定在所述软件程序中的哪些特定指令要重新编译并标志注所述特定指令。
12.一种在一个程序中执行一个浮点操作的方法,包括确定一个浮点操作是否产生一次浮点下溢;检验一个特定的指示器,以确定一个特定浮点操作所导致的下溢次数;和当所述特定的指示器满足预置判定标准时,采用第一种方式编译所述特定的浮点操作,否则采用第二种方式编译所述特定的浮点操作。
13.根据权利要求12所述的方法,其特征在于,它还包括在运行时间在编译所述特定浮点操作的所述第一和第二种方式中动态地产生和存储数据。
14.根据权利要求12所述的方法,其特征在于,所述第一种方式是陷阱程序,及所述第二方式是显式检验,所述显式检验是通过将联机代码插入所述程序来实施的。
15.根据权利要求14所述的方法,其特征在于,它还包括检验从采用一个显式检验对所述特定浮点操作进行编译开始的时间是否已经过一个预置的时间量;和如果已经过所述预置的时间量,则对包括要重新编译的所述特定浮点操作的一个模块进行标志。
16.根据权利要求14所述的方法,其特征在于,它还包括初始化所述陷阱程序。
17.根据权利要求14所述的方法,其特征在于,它还包括如果采用显式检验对所述特定浮点操作进行编译,则设置一个计时器。
18.根据权利要求14所述的方法,其特征在于,所述特定的指示器是一个计数器,每当使用一个陷阱程序处理所述浮点下溢时,该计数器就递增。
19.根据权利要求14所述的方法,其特征在于,它还包括确定哪一个浮点操作导致执行所述陷阱程序;递增一个计数器;和如果所述计数器超过一个预置值,则标志包含要重新编译的所述特定浮点操作的一个模块。
20.根据权利要求19所述的方法,其特征在于,它还包括如果所述模块已被标志,则将所述模块排入一个要重新编译的列中。
21.根据权利要求19所述的方法,其特征在于,如果所述方法已被标志要重新编译,则所述方法还包括重置与所述方法相关的所述计数器。
22.一种产生用于检测浮点下溢的指令的方法,包括确定一个程序中的一个操作是否产生一次浮点下溢;检验一个下溢指示器,以测出导致一次下溢的特定浮点操作的趋势;根据所述导致一次下溢的特定浮点操作的趋势,采用一个陷阱程序对所述特定浮点操作进行编译;和根据所述导致一次下溢的特定浮点操作的趋势,利用联机显式检验对所述浮点操作进行重新编译。
23.根据权利要求22所述的方法,其特征在于,它还包括在运行时间动态地产生和存贮与所述陷阱程序和所述联机显式检验相关的数据。
24.根据权利要求22所述的方法,其特征在于,所述特定浮点操作包含在一个模块中,并且所述方法还包括将包含所述要重新编译的浮点操作的所述模块排入一个要重新编译的列中。
25.一种用于在运行时间确定如何编译与一个计算机程序相关的字节代码指令的计算机程序产品,包括检索与可以多种方式编译的所述计算机程序相关的一个字节代码指令的一个计算机代码;以第一种方式对所述字节代码指令进行编译的一个计算机代码;在运行时间确定编译所述字节代码指令的第二种方法是所希望的方法的一个计算机代码;以第二种方式对所述字节代码指令进行重新编译的一个计算机代码;和存贮所述计算机代码的一种计算机可读介质。
26.一种用于在一个程序中执行一个浮点操作的计算机程序产品,包括确定一个浮点操作是否产生一次浮点下溢的一个计算机代码;检验一个特定的指示器,以确定一个特定浮点操作所导致的下溢次数的一个计算机代码;当所述特定的指示器满足预置的标准时,采用第一种方式对所述特定浮点操作进行编译,及否则采用第二种方式对所述浮点操作进行编译的一个计算机代码;和存贮所述计算机代码的一种计算机可读介质。
27.一种在运行时间确定如何编译与一个计算机程序相关的一个字节代码指令的系统,包括一个字节代码指示器,用于检索与可以多种方式编译的所述软件程序相关的一个字节代码指令;一个编译模块,用于以第一和第二种方式的其中一种方式对所述字节代码指令进行编译;和一个可选用的编译检测器,用于在运行时间确定编译所述指令的第二种方式是所希望的。
28.根据权利要求27所述的系统,其特征在于,它还包括一个用于容纳一个或多个模块的模块列,各模块包含要重新编译的所述字节代码指令。
29.根据权利要求27所述的系统,其特征在于,它还包括一个效率分析检验程序,用于动态地检验所述计算机程序的改变效率。
30.根据权利要求27所述的系统,其特征在于,它还包括一个运行时间数据收集器,用于在运行时间从可对所述计算机程序进行编译的多种方式的其中当前运行的一种方式搜集特定的数据。
31.一种用于在一程序中执行浮点指令的系统,包括一个指令鉴别器,用于确定一个浮点指令是否产生一次浮点下溢;一个浮点下溢指示器,用于对一个特定浮点操作所导致的浮点下溢保持计数;和一个编译器,用于当所述特定的浮点下溢指示器满足预置的标准时,采用第一种方式对所述特定浮点操作进行编译,及否则采用第二种方式对所述特定浮点操作进行编译,其中所述浮点下溢指示器被检验,以确定所述特定浮点操作所导致的下溢次数。
32.根据权利要求31所述的系统,其特征在于,它还包括一个数据发生器,用于在运行时间从编译所述浮点操作的第一和第二种方式动态地产生和存贮数据。
33.一种用于在运行时间确定如何对一个包括指令的程序进行编译的系统,包括一个或多个处理器;和一种存储着由一个或多个处理器执行的一个程序的计算机可读介质,该介质包括从可以多种方式编译的所述程序中检索一个指令的计算机代码;以第一种方式编译所述指令的计算机代码;在运行时间确定编译所述指令的第二种方式是所希望的方式的计算机代码;和以第二种方式重新编译所述指令的计算机代码。
全文摘要
用于在运行时间确定如何编译程序的装置、方法和计算机程序产品。与可以多种方式编译的程序相关的字节代码指令被检索并以一特定方式编译,通常为隐含方式。在运行时间,虚拟机确定另一编译字节代码指令的方式是否更理想,如是,则字节代码以该另一方式重新编译。虚拟机可检验程序执行中出现的该程序的改变的需求,该需求由可编译程序的各种方式的简档数据产生。程序中的字节代码指令可依简档数据以更优选方式重新编译。
文档编号G06F9/455GK1255674SQ9912663
公开日2000年6月7日 申请日期1999年10月30日 优先权日1998年10月30日
发明者P·B·克斯勒 申请人:太阳微系统有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1