在具备解释器和编译器的混合式系统中用于无用存储单元收集的被编译激活框架内的惰...的制作方法

文档序号:6427892阅读:154来源:国知局
专利名称:在具备解释器和编译器的混合式系统中用于无用存储单元收集的被编译激活框架内的惰 ...的制作方法
发明
背景技术
领域本发明涉及用于计算机系统的编译器。更具体地说,本发明涉及一种简化用于编译激活的惰型标记以便于无用存储单元收集的方法和装置。
背景技术
因特网呈指数的增长部分是由计算机语言的发展、诸如由美国加利福尼亚州Palo Alto的太阳微系统公司开发的JAVATM程序设计语言的发展所推动的。JAVA程序设计语言允许一个应用软件被编译为一个模块,该模块包括不依赖平台的字节代码,其可以通过由很多不同的计算机系统组成的网络被分配。因此任何计算机系统在拥有相应的不依赖平台的虚拟机如java虚拟机的情况下,均能够执行字节代码。通过这种方式,单一一种形式的应用软件即可以容易地被许多不同的计算平台分配和执行。
当以不依赖平台的形式接收一个应用软件时,该应用软件可以通过解释器直接得到解释,或者其可以被编译为用于本计算平台的本地体系结构的机器码。执行本机代码通常显著快于解释不依赖平台的字节代码。但是,本机代码所占据的空间远大于相应的字节代码。某些“混合式”计算机系统既支持字节代码的解释,也支持被被编译本机代码的执行。
不依赖平台的虚拟机周期性地执行无用存储单元收集操作,以收回预先分配的已不再使用的存储空间。在无用存储单元收集操作期间,必须识别在堆栈上激活框架(activation frame)内的指示字。传统上,这是通过对当前执行的每种方法保持栈地图(stack map),或者通过对于在每个激活框架中的每个值保持一个标记、表示是否该值是一个引用类型或者基本类型来完成的。虽然对于每个值保持标记便于更简单的无用存储单元收集,但对于每个值保持标记所带来的开销会降低执行速度。这可以通过下面的事实解释很多方法从执行到完成并非一定要通过无用存储单元收集操作来查验。因此,对这些方法保持标记所占用的时间基本上是被浪费了。
此外,在“混合式”系统中,无用存储单元收集操作典型地利用二种不同类型的激活框架工作,因为用于被编译方法的激活框架通常在结构方面与用于被解释方法的激活框架不同。请注意,一个用于某方法的被解释版本的激活框架典型地大于一个相应的用于该方法的被编译版本的激活框架。这是因为用于被解释版本的激活框架通常包括附加数据,如类型标记,其占据更多的空间。因此,以二种不同类型的激活框架工作使无用存储单元收集操作以及其他借助于激活框架直接处理的操作大幅地复杂化。
因此,需要这样一种方法和装置其便于供编译激活用的类型标记,而又没有如上所述的问题。

发明内容
本发明的一个实施例提供了一种系统,用于在被编译激活框架中以惰性方式标记类型值以便于无用存储单元收集。这种系统以一种混合式环境工作,其既支持字节代码的解释,也支持被编译本机代码的执行。当接收到一个方法的调用时,该系统在执行栈上生成一个用于该方法的激活框架。如果该方法以被解释的模式执行,在执行期间解释器对于每个值在该激活框架中保持一个标记。该标记表示是否该值是一个引用类型或者基本类型。但是,如果该方法以被编译模式执行,则系统在激活框架中对于每个值分配用于标记的空间,然而在执行期间不在该标记中进行填充。这使得该标记可以在将来需要时被填充。
在对这个实施例的变化中,在接收到一个方法调用之前,系统将该方法的字节代码编译为本机代码,并在完成该任务时,在该方法的激活框架中采集每个值的类型信息。该系统将此类型信息嵌入到与该方法有关的本机代码中。
在对该实施例的进一步变化中,该系统将该类型信息作为位向量嵌入,其中每一位指定是否在该激活框架中的相应值是一个基本类型或者引用类型。
在对该实施例的另一种进一步的变化中,该系统在本机代码中的空指令的操作数中嵌入该位向量。
在对该实施例的再一种进一步的变化中,该系统在本机代码中调用其他方法或者运行系统的指令之后的位置嵌入该位向量。
在对这个实施例的变化中,该系统执行无用存储单元收集操作。在该无用存储单元收集操作期间,系统由本机代码恢复类型信息,并且在该方法的激活框架中的标记中存储该类型信息。
在对该实施例的变化中,该系统对于以编译模式执行的方法和以解释模式执行的同样方法生成在结构上相同的激活框架。


图1举例说明一个根据本发明实施例的计算装置。
图2举例说明一个根据本发明实施例的激活框架。
图3举例说明一个根据本发明实施例的被解释激活框架和被编译激活框架。
图4举例说明按照本发明的一个实施例由经过编译的代码流恢复标记信息的过程。
图5是一个举例说明在根据本发明实施例的无用存储单元收集期间恢复标记信息过程的流程图。
具体实施例方式
下面所提供的说明为的是使所有本领域技术人员均可完成和使用本发明,且本说明是以特定应用及其需求的上下文形式提供的。对所公开的实施例的各种各样的修改,对于那些本领域技术人员来说将是容易而明显的,并且无需脱离本发明的精神和范围,在此处提出的一般原理即可应用于其他实施例和应用中。因此,本发明不应被限制在示出的实施例中,而是应与符合在此处所公开的原理和特点的最宽范围一致。
在详细说明中描述的数据结构和代码被典型地存储在计算机可读存储介质上,该计算机可读存储介质可以是存储供计算机系统用的代码和/或数据的任何装置或介质。这包括但不局限于是磁性和光学存储装置,如磁盘驱动器、磁带、CD(光盘)和DVD(数字多用途光碟或者数字视频光碟),以及包含在传输媒介中的计算机指令信号(当该信号被调制时有或者没有载波)。例如,该传输媒介可以包括一个通信网,如因特网。
计算装置图1举例说明一个计算装置110,该计算装置根据本发明的一个实施例耦合到开发系统106。开发系统106通常可以包括任何类型的计算机系统,包括但不限于是基于微处理器、主计算机、数字信号处理器、便携式计算装置、个人管理器(personal organizer)、设备控制器、或处于一装置内的计算引擎的计算机系统。开发系统106包括开发单元108,其包括用于开发不依赖平台的应用软件的编程工具。这通常包括将来自源代码形式的应用软件以一种不依赖于平台的形式、如JAVA字节代码进行编译。
开发系统106经通信链路112耦合到计算装置110。计算装置110可以包括任何类型的计算装置或者系统,包括但不限于主计算机系统、服务器计算机系统、个人计算机系统、工作站、便携式计算机系统、袖珍型计算机系统、个人管理器或者设备控制器。计算装置110还可以包括一个被嵌入在另一装置如传呼机、蜂窝电话、电视接收机、汽车或者用具内的计算装置。
通信链路112可以包括任何永久性或者暂时性类型的通信信道,其可用于从开发系统106传送数据到计算装置110。这可以包括(但是不局限于)一个计算机网络,诸如以太网、无线通信链路或者电话线路。
计算装置110包括用于存储代码和数据的数据存储器114。计算装置110还包含虚拟机116,用于处理从数据存储器114恢复的不依赖平台的应用。
在开发过程期间,在开发单元108内建立一个类别文件(classfile)118。类别文件118包括在计算装置110中执行的不依赖平台的应用软件的成分。例如,类别文件118可以包括与一个面向对象的类相关的方法和字段。值得注意的是,这些方法是使用不依赖平台的字节代码119指定的。
接下来,类别文件118被从开发单元108经由通信链路112传送到计算装置110内的数据存储器114。这使虚拟机116可以执行一种利用了类别文件118内成分的应用软件。值得注意的是,虚拟机116通常可以包括能够执行不依赖平台的代码的任何类型的虚拟机,如由美国加利福尼亚州Palo Alto的太阳微系统公司所开发的JAVA VIRTUALMACHINETM(Sun,Sun Microsystems,Java和Java Virtual Machine是太阳微系统公司在美国及其他国家的商标或者注册商标)。
虚拟机116包括对象堆122,用于存储由在虚拟机116上执行的代码所操纵的对象。对象堆122还存储被编译的方法123。
虚拟机116还包括一个解释器120,其解释从数据存储器114恢复的不依赖平台的字节代码119以便于程序执行。在操作期间,当字节代码119被连续地读进解释器120内时,解释器120通常每次执行一个字节代码。
做为选择,虚拟机可以使用编译器121将方法进行编译,使其从字节代码形式被编译为本机代码形式,从而产生被编译的方法123,该被编译的方法存储在对象堆122中。
值得注意的是,一种被编译的方法可以与来自一个相关激活记录的信息一起,用于恢复该被编译方法的一种解释器等效代码。做为选择,该被编译方法的解释器等效代码可以被再次从数据存储器114恢复。因此,一种被编译方法的解释器等效代码通常可以在任何时候获得。
虚拟机116包括运行系统124。运行系统124保持用于线程130-131的状态信息。这种状态信息分别包括执行栈140-141。执行栈140-141分别存储线程130-131所执行的方法的激活记录。
运行系统124既可使用解释器120、也可使用从对象堆122接收的被编译方法123执行编码。当由虚拟机116调用一个方法时,该系统首先确定是否该方法作为一个经过解释的方法被调用。如果是,则运行系统124激活解释器120。
而另一方面,如果系统确定该方法是作为一个经过编译的方法被调用,运行系统124就执行与该方法有关的被编译的本机代码。如果没有可用的本机代码,则可以通过激活编译器121产生该本机代码,该编译器由字节代码产生本机代码指令。
虚拟机116还包括无用存储单元收集器150,其周期性地从对象堆122收回未使用的存储量。值得注意的是,无用存储单元收集器150还可以将被编译的方法移送到回收存储器。
激活框架图2举例说明一种根据本发明实施例的激活框架。激活框架200包含值204、208和212。激活框架200还包含说明值204的标记202,说明值208的标记206,以及说明值212的标记210。值204和212均是以其相应标记表示的基本值。值208则为以标记206表示的引用类型。
被解释和被编译的激活框架图3举例说明根据本发明实施例的一个被解释激活框架和一个被编译激活框架。被解释激活框架300包含值306,其为以相应的标记304表示的引用类型。被解释激活框架300还包含值310,其为以相应的标记308表示的基本类型。当解释字节代码119(该字节代码操作在被解释激活框架300中的值)的时候,解释器120以一种急迫方式(即尽可能快地更新它们)保持类型标记。这确保了被解释的激活框架300具有对于所有的值都有效的类型标记。
被编译激活框架302包含值314、318和322。被编译激活框架302还包括说明值314的标记312,说明值318的标记316,以及说明值322的标记320。标记312、316和320保持为空,且当需要它们时被填充,诸如在无用存储单元收集期间,或者在去优化操作期间,如同由发明人Urs Hoize和Lars Bak在1997年10月6日申请、并在1999年8月3日颁布、名称为“用于动态地去优化编译的激活的方法和装置”的美国专利No.5,933,635中所论述的。在此将该申请作为参考资料加以结合。如果在将来某时刻标记被填充,那么被编译激活框架302就变得实质上与被解释激活框架300相同,并且可通过同样方式处理。
在一个被编译的激活框架中填充标记信息图4举例说明按照本发明的一个实施例由被编译的代码流恢复标记信息的过程。当需用标记312、316和320来确定值314、318和322是基本类型还是引用类型的时候,用于标记的类型信息被从代码流402中恢复。这是通过使用程序计数器400去识别与被编译激活框架302有关方法的本机代码在代码流402中的位置来实现的。
在本发明的一个实施例中,代码流402包括一个紧随指令“调用foo”404的空指令406,其中指令“调用foo”404调用一个方法或者运行系统。对应于标记312、316和320的值被存储在空指令406的一个操作数中。
在本发明的另一实施例中,代码流402包含对应于标记312、316和320的值,它们紧随指令调用foo 404之后被存储为32位字。在这个实施例中,在对foo的调用之后,对foo的调用返回一个4字节地址,使得执行流跳过上述32位字。
值得注意的是,紧随指令foo的32位字包含用于每个标记的单个位,该位表示是否该标记与一个引用类型有关。因此,32位字可以存储高达32个标记的信息。
在无用存储单元收集操作期间恢复标记信息图5是一个举例说明根据本发明实施例的在无用存储单元收集操作期间恢复标记信息的过程的流程图。该无用存储单元收集操作开始于遍历执行栈以定位根(root),根是进入堆的基准,用于在堆中定位对象以便进行无用存储单元收集(步骤502)。接着,无用存储单元收集操作使用程序计数器从被编译的代码流中恢复用于激活的类型标记信息(步骤504)。一旦这一信息被恢复,无用存储单元收集操作就将该标记信息插入处于激活框架中的适当标记内(步骤506)。接着,无用存储单元收集操作使用在激活框架中被识别的基准而继续进行(步骤508)。注意,以上描述的在无用存储单元收集操作期间恢复标记信息的过程可以在一种所有方法均在执行之前被编译的系统中实现,也可以在一种混合模式的系统中实现。
以上进行本发明实施例的描述仅仅是为了举例和描述。其用意并非是要穷举或将本发明限制为所公开的形式。因此,对于本领域专业技术人员来说许多的修改和变化将是显而易见的。另外,以上所述的公开并非是要限制本发明。本发明的范围是由所附权利要求限定的。
权利要求
1.一种用于在被编译激活框架中键入标记值以便于无用存储单元收集的方法,其中该方法工作于一种混合模式系统中,该混合模式系统既支持字节代码的解释,又支持被编译本机代码的执行,该方法包括接收一个方法的调用;在执行栈上生成一个用于该方法的激活框架;解释字节代码方法;其中如果该方法以被解释模式被执行,该解释包括在执行期间,在该激活框架中对于每个值保留一个标记,其中一给定的标记表示是否一给定值为引用类型或者基本类型;和其中如果该方法以被编译模式被执行,生成该激活框架包括在该激活框架中对于每个值分配用于标记的空间,其中一给定的标记表示是否一给定值为引用类型或者基本类型,借此,在该激活框架中将类型信息存储进该标记的操作被推迟,直到发生一个后续的无用存储单元收集操作为止。
2.根据权利要求1的方法,其中在接收对于方法的调用之前,该方法进一步包括将该方法的字节代码编译为本机代码;其中该编译过程包括在该方法的激活框架中对于每个值采集类型信息;和将该类型信息嵌入到与该方法有关的该本机代码中。
3.根据权利要求2的方法,其中将该类型信息嵌入到该本机代码包括将该类型信息作为位向量存储,其中每个位规定是否在该激活框架中的一个对应值为基本类型或者引用类型。
4.根据权利要求3的方法,其中该位向量被嵌入在该本机代码中的空指令的操作数内。
5.根据权利要求3的方法,其中该位向量被嵌入在该本机代码中调用其他方法或者运行系统的指令之后的位置上。
6.根据权利要求2的方法,进一步包括执行一个无用存储单元收集操作,其中该无用存储单元收集操作包括由该本机代码恢复类型信息;和在该方法的激活框架中的该标记中存储该类型信息。
7.根据权利要求1的方法,其中当以被编译模式执行时对于该方法生成的该激活框架和当以被解释模式执行时对于该方法生成的该激活框架在结构上是相同的。
8.一种存储指令的计算机可读存储介质,当由计算机执行该指令的时候,使得该计算机去执行一种用于在被编译激活框架中键入标记值以便于无用存储单元收集的方法,其中该方法工作于一种混合模式系统中,该混合模式系统既支持字节代码的解释,又支持编译本机代码的执行,该方法包括接收一个方法的调用;在该执行栈上生成一个用于该方法的激活框架;解释字节代码方法;其中如果该方法以被解释模式执行,该解释包括在执行期间,在该激活框架中对于每个值保留一个标记,其中一给定的标记表示是否一给定值为引用类型或者基本类型;和其中如果该方法被以编译模式执行,生成该激活框架包括在该激活框架中对于每个值分配用于标记的空间,其中一给定的标记表示是否一给定值为引用类型或者基本类型,借此,在该激活框架中将类型信息存储进该标记的操作被推迟,直到发生一个后续的无用存储单元收集操作为止。
9.根据权利要求8的计算机可读存储介质,其中在接收对于方法的调用之前,该方法进一步包括将该方法的字节代码编译为本机代码;其中该编译过程包括在该方法的激活框架中对于每个值采集类型信息;和将该类型信息嵌入到与该方法有关的该本机代码中。
10.根据权利要求9的计算机可读存储介质,其中将该类型信息嵌入到该本机代码包括将该类型信息作为位向量存储,其中每个位规定是否在该激活框架中的一个对应值为基本类型或者引用类型。
11.根据权利要求10的计算机可读存储介质,其中该位向量被嵌入在该本机代码中的空指令的操作数内。
12.根据权利要求10的计算机可读存储介质,其中该位向量被嵌入在该本机代码中调用其他方法或者运行系统的指令之后的位置上。
13.根据权利要求9的计算机可读存储介质,其中该方法进一步包括执行一个无用存储单元收集操作,其中该无用存储单元收集操作包括由该本机代码恢复类型信息;和在该方法的激活框架中的该标记中存储该类型信息。
14.根据权利要求8的计算机可读存储介质,其中当以被编译模式执行时对于该方法生成的该激活框架和当以被解释模式执行时对于该方法生成的该激活框架在结构上是相同的。
15.一种用于在被编译激活框架中键入标记值以便于无用存储单元收集的装置,其中该装置被配置为工作于一种混合模式系统中,该混合模式系统既支持字节代码的解释,又支持编译本机代码的执行,该装置包括接收装置,其被配置用于接收方法的调用;生成装置,其被配置用于在执行栈上生成一个用于该方法的激活框架;解释装置,其被配置用于解释字节代码方法;其中如果该方法以被解释模式执行,该解释机构被配置用于在执行期间,在该激活框架中对于每个值保留一个标记,其中一给定的标记表示是否一给定值为引用类型或者基本类型;和其中如果该该方法以被编译模式执行,该生成机构被配置用于在该激活框架中对于每个值分配用于标记的空间,其中一给定的标记表示是否一给定值为引用类型或者基本类型,借此,在该激活框架中将类型信息存储进该标记的操作被推迟,直到发生一个后续的无用存储单元收集操作为止。
16.根据权利要求15的装置,其中该装置进一步包括编译装置,其被配置用于将该方法的字节代码编译为本机代码;其中该编译装置包括采集装置,其被配置用于在该方法的激活框架中对于每个值采集类型信息;和嵌入装置,其被配置用于将该类型信息嵌入到与该方法有关的该本机代码中。
17.根据权利要求16的装置,其中该嵌入机构其被配置用于将该类型信息作为位向量存储,其中每个位规定是否在该激活框架中的一个对应值为基本类型或者引用类型。
18.根据权利要求17的装置,其中该位向量被嵌入在该本机代码中的空指令的操作数中。
19.根据权利要求17的装置,其中该位向量被嵌入在该本机代码中调用其他方法或者运行系统的指令之后的位置上。
20.根据权利要求16的装置,进一步包括无用存储单元收集装置,其中该无用存储单元收集装置包括恢复装置,其被配置用于由该本机代码恢复类型信息;和存储装置,其被配置用于在该方法的激活框架中的该标记中存储该类型信息。
21.根据权利要求15的装置,其中当以被编译模式执行时对于该方法生成的该激活框架和当以被解释模式执行时对于该方法生成的该激活框架在结构方面是相同的。
全文摘要
本发明的一个实施例提供了一种在被编译激活框架中以惰性方式键入标记值以便于无用存储单元收集的系统。这个系统以一种混合式环境工作,其同时支持字节代码的解释和被编译本机代码的执行。当接收一个方法调用时,该系统在该执行栈上生成一个用于该方法的激活框架。如果该方法执行于被解释的模式,解释器在执行期间对于每个值在该激活框架中保持一个标记。该标记表示是否该值是一个引用类型或者基本类型。但是,如果该方法执行于被编译模式,该系统在该激活框架中对于每个值分配用于标记的空间,但是在执行期间不填充该标记中。这允许该标记在将来需要时被填充。
文档编号G06F9/44GK1556951SQ02818625
公开日2004年12月22日 申请日期2002年10月4日 优先权日2001年11月14日
发明者K·伦德, K 伦德, L·巴克 申请人:太阳微系统公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1