在面向对象系统中用于接收器类型的联机数据库的制作方法

文档序号:6414682阅读:145来源:国知局
专利名称:在面向对象系统中用于接收器类型的联机数据库的制作方法
技术领域
本发明涉及增加面向对象程序的执行速度。特别地,本发明涉及在面向对象程序的执行期间使用收集的信息用于后续执行。
面向对象的语言的基本思想是将数据和在数据上运算的方法(或函数)组合为一个称之为对象的单独的单元。一个对象的函数一般提供唯一的方式来访问被该对象所封装的数据。通过向对象发送一个信息、指示对象调用由该信息所指定的方法,来访问数据。
在面向对象的语言中,有效的信息分配是至关重要的。这是因为信息分配是面向对象程序中一项频率很高的操作,并且是在运行时执行的;因此,应使其尽可能地快。然而,信息分配远不是一个微不足道的操作。与在运行之前就可以确定一个函数的地址的过程程序设计语言(例如,C程序设计语言)不同,面向对象的语言必须在运行时确定处理已经被分配给接收器对象的信息的方法,并且可能要进行大范围的搜索。
为了更好地理解信息分配的复杂性,

图1显示了一个包括每一类方法的类分级结构。类分级结构1在其根部包括一个定义了两个虚拟函数foo()和bar()的父类A3。虚拟函数是可以在父类中定义并在子类中重新定义的函数。类B5和类C7继承父类A的数据和方法。如图所示,类B并没有重新定义虚拟函数foo和bar中的任一个。但类C重新定义了虚拟函数foo。当类C的对象被请求调用方法foo时,调用的方法将是由类C定义的方法,而不是由父类A定义的方法。类D9和E11也重新定义了方法foo。
由于通常不可能静态地确定一个对象的类,所以在信息分配期间,在运行时执行对正确方法的搜索。有许多已知的技术用于实现方法分配。例如,图2显示了一内联高速缓存。假定方法51最初如下所示<pre listing-type="program-listing"><![CDATA[main(){x.foo();... }]]></pre>因此,该方法主要包括语句x.foo(),以调用对象x的方法foo。
在运行期间,在调用处理该方法的方法之前,系统必须确定对象x属于哪个类。应用一内联高速缓存,系统第一次确定对象x所属的类,并将对此类的方法的直接调用写入计算机代码。
假设对象x是类A中的一个成员,将调用x.foo()改为直接调用A∷foo()。箭头指定类A53的一个方法foo。由于对象x可能不是每次都属于类A,则用一个序言(prolog)55确认对象x处于正确的类,该序言由表达式x=A表示,表明如果对象x的类等于类A则为确定。对象的类可以从一个存储在该对象中的值来确定。如果对象处于正确的类,则执行到处理该信息的方法代码57的跳转。
回到序言55,如果对象不是属于类A,则调用一个方法查找程序,以便于确定正确的方法。一旦找到正确的方法,系统就用对该方法的直接调用更新信息分配(或调用)位置。此外,系统更新序言,以指定新的类。例如,假设系统第一次遇到x.foo(),对象x为类A,并且数据结构如图2所示被修改。
一旦数据结构如图所示被修改,如果对象x为类A,对x.foo()的后续调用将明显地更加有效。然而,如果对象x接下来为类B,则序言55调用一个方法查找程序来寻找方法,我们假设其确定现在的对象x为类B。再参看图1,可以看到,用于类B的方法foo是与在类A中定义的方法foo相同的方法(即,类B没有重新定义虚拟函数foo)。因此,在方法51中的信息分配将变为B∷foo(),在序言55中的条件将变为x=B。
如果在一个调用位置条的对象保持相同的类,则一个内联高速缓存可以是一种实现信息分配的有效方式。然而,如果该对象是多类的,则系统继续调用方法查找程序,并修改调用位置和序言。因此,此系统实际上是不够有效的。
用于实现信息分配的另一种技术是使用一个如图3所示的多形内联高速缓存。与前面相同,方法101最初包括一个方法分配x.foo()。应用一个多形内联高速缓存产生一个能够为不同的接收器类型执行信息分配的残桩(stub)103。最初的信息分配用一个对多形内联高速缓存残桩103的调用被重写。每次遇到一个新的接收器类型时,将一个语句加到残桩上。如图所示,至此已经遇到了三种不同的接收器类型。如果该接收器类型已经遇到过,则为该接收器类型调用方法以处理该信息。否则,调用方法查找程序来确定处理该信息的合适的方法。一般会将一个新的语句加到残桩103上,以便处理每个新的接收器类型。
由于多形内联高速缓存能够处理多种接收器类型,因此它比内联高速缓存更灵活。然而,多形内联高速缓存的一个缺陷是随着遇到的接收器类型的增多,残桩继续增长,从而在执行信息分配时会变得越来越不够有效。例如,在找到处理信息的正确的方法之前,系统可能需要通过多个if语句。
图4显示了另一种被称作为散列法的信息分配技术。在散列法中,在方法151中的最初的信息分配x.foo()利用一个对散列函数153的调用被重写。散列函数将接收器类型和信息散列,以形成一个散列密钥,该散列密钥一般为进入一个散列表155的索引。散列表包括一个索引157、接收器类型159、信息161和方法163。一旦散列函数散列在散列表155的一行中,则从散列表的列159和161中检索出接收器类型和信息。如果在调用位置处的接收器类型和信息与散列表的行中的接收器类型和信息相匹配,则调用在散列表155的列163中所指定的方法。否则,调用一个方法查找程序以找到正确的方法。一般地,然后将这个新方法加到散列表中。
虽然散列法是我们至此所描述的最灵活的信息分配技术,但它比其他技术在计算和存储上更加密集。我们已经描述的这些信息分配技术的另一个缺陷是没有一种技术是位置特定的。换句话说,没有一种信息分配技术提供了在不同的调用位置以不同的方式处理信息分配的灵活性。
上述的信息分配技术中没有一个考虑到在后来的程序执行过程中使用被收集的接收器类型的信息。另外,希望在后来的程序执行过程中可以得到内联信息。因此,这里需要能考虑在以后的程序运行中使用被收集的接收器类型和/或内联信息的技术。
本发明的实施例提供了用于在以后的程序执行期间使用收集的接收器类型和/或内联信息的创新技术。通过允许程序利用来自以前执行的信息,该程序可以很快地被最优化而不需要再次收集信息。所以,面向对象程序在它每次运行时会变得越来越有效直到它达到一个稳定的最佳状态。下面将描述本发明的一些实施例。
在一个实施例中,本发明提供了一种用于面向对象程序的实现信息分配的方法。在将信息分配给接收器对象的方法的位置上收集接收器类型信息。然后存储该收集的接收器类型信息以用于后来的程序执行。在一个最佳实施例中,在该方法的解释和编译执行期间中都要收集接收器类型信息。
在另一个实施例中,本发明提供了用于实现面向对象程序的信息分配的方法。在解释期间中,在将信息分配给接收器对象的方法的位置上收集接收器类型信息。该接收器类型信息可以包括每一个不同的接收器类型和到用于将信息从该位置分配到每个不同的接收器类型的位置的一个引用。然后确定希望编译包括将信息分配到接收器对象的位置的方法。当编译该方法时,在被编译的方法中的该位置上包括接收器类型信息。同样,存储该接收器类型信息以用于后来的程序执行。在一些实施例中,在一个多形内联高速缓存中收集接收器类型信息。
在另一个实施例中本发明提供了一种由计算机可读介质存储的数据结构。通过带有嵌套的接收器类型的计算机可读介质至少可以存储一种接收器类型。该嵌套的接收器类型是在一个方法的信息分配位置上被分配信息的接收器类型。在一个最佳实施例中,数据结构被存储在Java类文件的一个属性部分中。
通过下面参考附图对本发明的详细说明,本发明的其他特征和优点将变得更加明显。
图1显示了在一个面向对象的环境中的包括虚拟函数的类的类分级结构。
图2显示了用于面向对象的信息分配的内联高速缓存技术。
图3显示了用于面向对象的信息分配的多形内联高速缓存技术。
图4显示了用于面向对象的信息分配的散列法技术。
图5显示了可以用于执行本发明的一个实施例的软件的计算机系统的一个例子。
图6显示了图5中计算机系统的系统方框图。
图7显示了一个Java源代码程序是如何执行的。
图8显示了用于面向对象的信息分配的位置特定内联高速缓存技术的一个实施例。
图9显示了用于面向对象的信息分配的位置特定内联高速缓存技术的一个实施例的高级流程图。
图10显示了位置特定信息分配技术的一个实施例的高级流程图。
图11显示了动态地确定在一个特定位置是否需要另一个信息分配技术的流程图。
图12显示了应用NOP指令对遇到的不同接收器类型的数目计数的位置特定信息分配技术的一个实施例。
图13示出了被用来存储用于后来的程序执行的接收器类型信息的内联数据库的高级流程图。
图14示出了在用于内联数据库的程序的解释和编译执行过程中收集接收器类型信息的流程图。
图15说明了一种已经被编译从而包括用于面向对象的信息分配的多形内联高速缓存技术的方法。
图16说明了其中在其类别文件的属性部分已经存储了接收器类型信息的Java类别文件。
定义函数-一个软件程序(也被称为子程序、过程、成员函数和方法)。
信息分配-一个确定处理已经被发送给在面向对象的环境中的对象的方法的过程。
接收器对象(或接收程序)-在一个面向对象的环境中的信息所发送到的对象。
接收器类型-接收器对象所属的类。
调用位置(或位置)-在一个程序中将信息分配到一个对象的位置或区域。
概述在下面的说明中,将参考为一个JavaTM虚拟机设计的最佳实施例说明本发明。特别地,将说明针对IBM个人计算机的例子。但本发明并不限于任何特定的语言、计算机结构或专用工具。因此,下面对实施例的说明是出于例示的目的,而不是为了限制。
图5显示了可以用于执行本发明的一个实施例的软件的计算机系统的一个例子。图5显示的计算机系统301包括显示器303、屏幕305、机箱307、键盘309和鼠标311。鼠标311可以具有一个或多个与图形用户界面交互的按钮。机箱307罩盖着一个CD-ROM驱动器31 3、系统存储器和一个硬盘驱动器(参看图6),该硬盘驱动器可以用于存储和检索包含实现本发明的计算机代码、本发明使用的数据等的软件程序。虽然CD-ROM315在这里显示为一个典型的计算机可读存储介质,也可以使用其他的计算机可读介质,包括软盘、磁带、闪速存储器、系统存储器和硬盘驱动器。另外,在载波中(例如,在一个网络例如因特网中)包含的数据信号也可以是计算机可读存储介质。
图6显示了用于执行本发明的一个实施例的软件的计算机系统301的系统方框图。与在图5中一样,计算机系统301包括监视器303、键盘309和鼠标311。计算机系统301还包括子系统,例如中央处理器351、系统存储器353、固定存储器355(例如硬盘驱动器)、可移动存储器57(例如CD-ROM驱动器)、显示适配器359、声卡361、扬声器363、以及网络接口365。其他适于本发明使用的计算机系统可以包括更多或更少的子系统。例如,另一个计算机系统包括不止一个处理器351(即,一个多处理器系统)或一个高速缓存。
计算机系统301的系统总线结构由箭头367表示。然而,这些箭头只是显示用于连接子系统的任一种互连方案。例如,可以应用一个本地总线将中央处理器连到系统存储器和显示适配器。图6中显示的计算机系统301只是一个适于本发明使用的计算机系统的例子。也可以使用其他具有不同的子系统结构的计算机结构。
JavaTM程序设计语言是由Sun Microsystems开发的。一般将以Java程序设计语言编写的计算机程序编译成可以由一个Java虚拟机执行的字节代码或Java虚拟机指令。字节代码存储在输入给Java虚拟机的类文件中用于解释。图7显示了由解释程序(interpreter)、即Java虚拟机执行一段简单Java源代码的过程。
Java源代码401包括用Java编写的典型的Hello World程序。然后将源代码输入到一个将源代码编译成字节代码的字节代码编译器403。当这些字节代码将由一个软件仿真计算机来执行时,它们是虚拟机指令。一般地,虚拟机指令是通用的(即,不是为任何专门的微计算机或计算机结构而设计的),但这不是必须的。字节代码编译器输出一个包括Java程序的字节代码的Java类文件405。
将Java类文件输入Java虚拟机407。Java虚拟机是解码并执行Java类文件中的字节代码的解释程序。Java虚拟机是一个解释程序,但由于它以软件来仿真微计算机或计算机结构(例如,微计算机或计算机结构可以不存在于硬件中),所以通常称之为虚拟机。为了提高Java虚拟机的执行速度,方法可以被编译成本机指令,以便更快地执行。在下面对最佳实施例的说明中,将用编译来表示将Java虚拟机指令翻译为本机指令的过程。
本发明提供了一种用于实现在面向对象环境中的信息分配的位置特定的内联高速缓存技术。接收器类型信息存储在调用位置,这样允许每个调用位置可以根据调用位置的运行特性而改变。这不仅使得信息分配更为有效,而且更为灵活。
图8显示了依据本发明的一个实施例的位置特定的内联高速缓存技术。如同上面在发明背景技术中所描述的,方法51最初包括一个用于分配的信息x.foo()。当此信息第一次被分配时,系统可以调用一个方法查找程序来确定合适的处理该信息的方法的位置。或者,系统可以在运行之前执行一个静态分析,以便确定哪一个有可能是正确的方法。
一旦应用一个位置特定的内联高速缓存确定了将要处理信息的对象的类,则在调用位置产生一个指令来存储接收器类型或类。然后用一个对要处理该信息的特定方法的调用来重写信息分配。于是,信息分配变成两条指令,一个存储接收器类型,另一个调用合适的方法。
如图所示,方法451包括将类A的一个id存储进一个专用寄存器的移动指令。该寄存器被称为一个专用寄存器仅仅出于识别的目的。重要的是如果使用一个寄存器,那么在别的情况下在这个调用位置则不能使用该寄存器。尽管使用寄存器可以提供最高效的执行速度,但也可以使用其他的存储装置。例如,接收器类型可以存储在系统存储器中,或者作为一个参数传送给信息处理方法。
一旦存储了接收器类型,进行一个到处理表示为A∷foo()的信息的方法453的调用。序言455检验对象x是否是从专用寄存器检索出的存储的接收器类型。在显示的例子中,类A是存储的接收器类型。因此,如果对象x是属于类A的,则跳转到A∷foo()的方法代码457。否则,调用方法查找程序来找出合适的方法处理该信息。然后,可以更新调用位置,以保存对象x的接收器类型和对由方法查找程序找到的方法的调用。
因此,存储在调用位置的接收器类型是预测的接收器类型。正是系统预测的接收器类型将会是下一个接收信息的对象的接收器类型。如果预测的接收器类型与对象的接收器类型相匹配,则信息分配更加有效。另外,每个信息分配位置具有特定于该调用位置的存储的接收器类型信息,另一个位置将不会重写存储的接收信息。
图9显示了用于信息分配的位置特定的内联高速缓存技术的一个实施例的流程图。在步骤501,在一个信息被分配到一个接收器对象的位置处保存预测的接收器类型。在最佳实施例中,通过应用一个将接收器类型放在寄存器中的移动指令来保存接收器类型。但也可以应用其他的对于本领域普通技术人员来说是公知的保存接收器类型的方法,包括使用系统存储器或参数传递。
在步骤503,将信息发送给接收器对象。该信息是由一个对处理该信息的方法的直接调用来发送,而不是应用一个方法查找程序。
一旦接收器对象接收了该信息,则在步骤505确认接收器对象是保存的预测接收器类型。在最佳实施例中,这种确认是在方法的序言中执行的(参见图8)。在步骤507,如果接收器对象是与保存的预测接收器类型相同的类型,则在步骤509执行处理该信息的方法。步骤509可以包括执行到处理该信息的方法代码的开始的跳转。
如果接收器对象不是与保存的预测接收器类型相同的类型,则在步骤511将在调用位置的预测接收器类型变为接收器对象的接收器类型。在步骤513调用方法查找程序以获得一个新的方法。所采用的方法查找程序可以是任何对本领域普通技术人员来说是公知的查找程序,包括分配表检索和虚拟函数表。方法查找程序提供出合适的方法来处理该信息。然后在步骤515将在调用位置的信息分配改变到由方法查找程序返回的方法。
举例来说,假设在图8中,对象x属于类A,则存储在方法451的调用位置的预测接收器类型属于类A。但是,如果对象x接着是属于类B的,则序言455可以修改移动指令,以便将类B作为预测接收器类型存储在专用寄存器中。另外,将修改信息分配,以调用由方法查找程序返回的方法。从而将更有效地分配在该调用位置的针对一个类B的接收器对象的后续的信息分配。
在图9中,在改变在该位置的方法的步骤515之后,执行该方法。执行该方法的步骤实际上可以在步骤513或其他位置就开始。因此,在所示的流程图中,可以根据不偏离本发明的精神的特定实施重新安排、增加和删除步骤。
如上所述,提供了一种位置特定的内联高速缓存技术,该技术在一个调用位置保存预测的接收器类型。通过在调用位置保存预测的接收器类型,信息分配变得更为有效,并且更为灵活。例如,在每个调用位置的操作可以相互隔离,以使得一个调用位置不会改变另一个调用位置的设置。
位置特定的信息分配本发明提供了一种位置特定的信息分配技术,能够灵活地允许在每个位置应用不同的信息分配技术。另外,在一个调用位置应用的信息分配技术可以在运行时随时间改变。一旦确定在一个特定位置需要一个新的或不同的信息分配技术,则为在该特定调用位置的使用设置新的信息分配技术。于是,信息分配不仅在调用位置上变得更加灵活,在程序执行期间的不同时间的调用时应用的信息分配技术上也变得更加灵活。
图10显示了位置特定的信息分配的一个实施例的高级流程图。在步骤511,在一个专用信息分配位置执行一第一信息分配技术。第一信息分配技术可以是现有技术中已知的任何一种信息分配技术。第一信息分配技术最好是依据本发明的一种技术。例如,第一信息分配技术可以是上面所说的位置特定的内联高速缓存的一个实施例。第一信息分配技术可以在运行之前静态地确定,也可以在运行期间动态地确定。
在步骤553,系统在运行期间动态地确定在该特定位置是否需要一第二信息分配技术。可以应用任何方法来确定第二信息分配技术时所需要的。例如,一旦在该调用位置遇到的不同接收器类型的数目超过了一个阈值,则需要转向一个不同的信息分配技术。另外,可以计算方法查找程序被调用的频率,如果此频率过高,则有必要使用一个新的信息分配。
总之,一旦确定需要一第二信息分配技术,则在步骤555在该特定位置执行第二信息分配技术。用于切换到新的信息分配技术的方法一般取决于该新技术本身。既然已经描述了高级流程,下面将更加详细地讨论动态地确定是否需要一第二信息分配技术的步骤的一个实施例。
图11显示了动态地确定是否需要一第二信息分配技术的一个实施例。第一和第二信息分配技术的标记表示为在一个特定调用位置一个信息分配技术可以切换到另一个的通用的指示。然而,本发明并不仅限于两种技术,也可以有利地运用到三个或更多的技术上。因此,第一和第二的标记并不是本发明仅限于两种信息分配技术的指示。
在图11中所示的实施例依赖于在一个特定调用位置遇到的不同接收器类型的数目,将其作为何时应该改变信息分配的一个指示。例如,可以将一个位置特定的内联高速缓存一直使用到在该调用位置遇到了五个不同的接收器类型。当在该上下文中使用了不同的接收器类型时,这意味着已经有五个预测接收器类型与实际的接收器类型不同的实例。这将意味着方法查找程序已经被调用了大约五次,存储在调用位置的预测接收器类型已经改变。例如,在类A和B的接收器对象之间变换五次的调用位置可以被计为五个不同的接收器类型。
虽然在每个调用位置可以使用一个专用的接收器类型计数器,但这需要使用存储器和计算机代码来保持计数器。在最佳实施例中,在处理该信息的方法之前将计数器实施为多个空操作(NOP)指令。如同下面将参考图12要详细说明的,在方法之前实施的NOP指令数表示已经遇到的不同接收器类型的数目。
参考图11,该流程图假设方法查找程序已经被调用,否则,更有可能的是,当前的信息分配技术正在有效地执行。在步骤601,系统将信息分配到在处理该信息的方法之前的NOP指令。系统通过确定在方法之前执行了多少个NOP指令来对不同接收器类型的数目进行计数。一般地,通过从包括任何序言的实际方法的地址中减去为该位置将信息分配到的地址来确定该计数值。
在步骤605,将计数值与一预定数进行比较。预定数是在需要切换到一个不同的信息分配计数之前在一个调用位置可以遇到的不同接收器类型的数目。预定数可以被静态地确定或在运行期间动态地计算出来。
在步骤607,如果计数值比预定数大,则在步骤609切换到第二信息分配技术。如果计数值小于或等于预定数,这表明在目前还不需要切换到第二信息分配技术。一个例子将有助于显示NOP指令是如何被用作为一个计数器的。
图12显示了NOP指令是如何被用作为一个在一个特定调用位置已经遇到的不同接收器类型的数目的计数器的。如前所述,所显示的方法651带有一个位置特定的内联高速缓存。方法653处理该信息,但是,在方法之前有一个具有多个NOP指令的NOP部分655。可以将NOP指令选择为不作任何处理并且不会特别影响方法的操作速度。在其他的实施例中也可以采用其他的指令来代替NOP指令。
NOP部分655在方法653的序言657和方法代码659之前。NOP部分由预定数目的NOP指令组成,一般是与在到一个不同的信息分配技术的切换被启动之前在一个调用位置遇到的不同接收器类型的数目相同的数目。每次在序言657调用方法查找程序时,用对象x的接收器类型修正移动指令。此外,将后续的信息分配(例如,A∷foo())改变到在由方法查找程序找到的新方法的NOP部分655中的NOP指令中的一个。
如图所示,信息分配指向在方法653之前的第三个NOP指令。如果序言657确定对象x不是类A,则序言计算在调用位置的特定地址和方法653的开始之间的差别,这可以在运行期间由多种已知方法来得到。该差别或计数值表示在该特定调用位置已经遇到的不同接收器类型的数目。如果计数值大于一预定数,则序言657可以切换在该调用位置使用的信息分配技术。
在一个方法之前采用NOP指令容易实施、快捷,并且不需要过多的计算机代码来保持计数器。此外,在NOP部分655中的NOP指令可以由多个不同的调用位置来引用而不会相互影响。
第一信息分配技术被显示为位置特定的内联高速缓存。第二信息分配技术可以是多形内联高速缓存或散列技术,其中每个技术都是用来处理多个接收器类型的。当然,在可以用于本发明的信息分配技术上并没有限制。这里已经描述了特定的信息分配技术以帮助读者理解。
如上所述,提供了一种位置特定的信息分配技术,在认为需要时允许在一个特定调用位置使用一个新的信息分配技术。通过允许每个调用位置在需要时切换信息调用技术,信息调用可以变得更为有效和灵活。此外,在每个调用位置的操作可以彼此隔离,以使得一个调用位置不会改变另一个调用位置的设置。
内联数据体本发明提供了存储用于程序的随后执行的接收器类型和/或内联信息的技术。在程序的运行期间收集接收器类型和内联信息,然后存储收集的运行信息以便于后来的程序执行能够得益于所收集的信息而不用再次收集该信息。这样使程序在运行期间可以达到最佳状态并且在随后的程序运行过程中很快地返回到最佳状态。
图13示出了本发明的一个实施例的高层次流程图,该实施例收集接收器类型信息并存储以用于后来的程序执行。在步骤701,系统收集位于程序方法的信息分配位置上的接收器类型信息。可以通过任何一种在这里描述过的信息分配技术或其它公知技术收集接收器类型信息。该接收器类型信息最好是特定于调用位置以便于可以收集用于多个调用位置的接收器类型信息。
一旦收集到一个特定调用位置的接收器类型信息,在步骤703存储该信息以用于后来的程序执行。可以在程序正常结束时将这个接收器类型信息存储,或在运行期间的某个时间点上存储,可以具有用户输入也可以不具有用户输入。详细地描述收集接收器类型信息的实施例是很有好处的。
图14示出了收集接收器类型信息实施例的流程图。在步骤751,在方法的解释过程中收集接收器类型信息。一般地,在Java虚拟机中对该方法进行解释,直到确定它有益于编译该方法。在方法立即被编译的系统中,流程可以从下一步开始。
在编译期间收集诸如在一个具体的调用位置上遇到的不同的接收器类型的接收器类型信息时,可以使用一到多个信息分配技术。在某些点,可能会有在步骤753是否应当编译该方法的问题。例如,如果一个方法已经被解释多于预定数的次数,那么可以确定该方法应该被编译。否则,可以在方法的解释过程中继续收集接收器类型信息。
在步骤755,编译该方法以及将收集到的接收器类型信息编译入该方法。这样,被编译的方法将利用所收集的类型信息。另外,在最佳实施例中,在编译的方法中产生计算机代码并在步骤757继续收集类型信息。
在一个最佳实施例中,系统也维持一种编译方法的工作集。该工作集也可以与收集的类型信息分开存储,以便于在后来的程序执行中,当系统有处理能力(例如,当系统等待用户输入时)时,系统可以编译来自工作集的方法。
一旦编译了方法,有利于在某些时间点重新编译该方法。在步骤759,确定是否应该要重新编译方法。例如,如果已经收集到相当数量的新接收器类型信息,这将有利于重新编译该方法。在一个最佳实施例中,如果确定(例如,试探法)一个方法应该内联这个方法中,则重新编译该方法。内联意味着代替调用方法,该方法被编译成这个调用方法中。例如,如果确定内联一个方法将是有利的,则该方法被编译进该调用方法并因此该调用方法现在包括被内联方法的调用位置。
对于普通的面向对象系统而言内联方法即使不是不可能的,也是很困难的,因为直到运行时还不能确定接收器对象。但是,使用收集接收器类型信息的本发明,可以有利于执行方法的内联。另外,可以将被内联的方法和接收器类型信息一起存储以便于后来的程序执行可以使用内联信息和内联该同样的方法,如果希望的话。如果确定该方法应该重新编译,则在步骤755重新编译它。
在一些点处,如图所示在步骤761将停止接收器类型信息的收集并将它存储。在流程图的末端示出的步骤761可能发生在图14流程图中的任何一点处。例如,在执行过程中可以存储收集的接收器类型信息,可以是自动的或是作为用户输入的直接结果。尽管如此,一般地,将在程序的正常结束时停止接收器类型信息的收集。
在步骤755,收集的接收器类型信息曾被编译入方法中。图15示出了接收器类型信息被编译入一个方法中的实施例。图中示出了带有一个被编译为计算机代码的多形内联高速缓存器的方法801。被编译的代码一般应该是本机指令,但是多形内联高速缓存器的总的流程可以如图所示。如果对象x是类型A,则直接调用方法来处理信息。同样,显示了用于类B和C的表示。如果对象x是以前没有见过的类。那么将通过调用方法查找程序查找它。这个新的接收器类型信息可以通过编译的方法来累计以便于后来的重新编译可以利用这个新的接收器类型信息(见步骤759)。
存储收集的接收器类型信息使得程序的随后执行可以利用以前收集的接收器类型信息。因此,如果方法是最佳的,该方法可以很快地返回后来的程序执行中的最佳状态。图16说明了如何将收集的接收器类型信息存入Java类文件中。
Java类文件851包括多个区域。开始区域853包括一个幻数(OXcafebabe)、次要版本号和主要版本号。一个常数存储区855包括常数。存储信息区857包括存取标记和指向常数存储区中的这个类和超级类的指针字。另外,还有一个界面区域859、字段区域861和方法区域863。
在类文件851的末端是一个属性段865。如图所示嵌套的接收器类型被存在属性段。如图所示,有一个对调用位置的引用,在该调用位置曾遇到接收器类型。该引用可以是在这个方法中的偏移。根据在该方法中该调用位置所在的深度来嵌套接收器类型。因此,如果调用位置来自内联的方法,这些调用位置将嵌套得更深。在一个最佳实施例中,被嵌套的接收器类型是类似于被用于收集接收器类型信息的多形内联高速缓存器的文本。需要将Java虚拟机实现成沉默地忽略任何或所有的它不能识别的位于属性段865中的属性。另外,将收集的接收器类型信息放入这个位置将对其它虚拟机实现没有不利影响。
属性段865示出了包括内联信息的嵌套的接收器类型信息。数15表示在由15指示(例如,偏移)的调用位置上曾遇到过的类A、B和C。对于类A,在这个位置上调用的方法曾被内联,这通过嵌套项显示出。4表示在内联的方法中在由4指示的调用位置处曾遇到类R。同样,在内联的方法中在由4指示的调用位置处遇到类C、R和T。另外,接收器类型信息能提供来自以前程序执行的内联信息。
如上所述,本发明提供了在调用位置存储用于后续程序执行的被收集的接收器类型信息的内联数据库。下次运行该程序时,Java虚拟机可以使用以前收集的接收器类型信息从而使该程序达到最佳而不用再花时间收集这个信息。因此,当Java程序达到最佳状态并且具有存在类文件中的收集的接收器类型信息时,该程序可以在后续的运行中更为有效地操作。另外,因为类文件不依赖于机器,所以其有效性不局限于任何一种计算机系统或计算机结构。
尽管以上是对本发明最佳实施例完整的描述,但可以使用替换、变型或等效的方法。很显然,通过对上述实施例作适当的变型,同样可以适用本发明。例如,如上所述的内联数据库技术使用多形内联高速缓存器来收集接收器类型信息。但是,本发明并不局限于任何一种信息分配技术并且可以将它们应用到包括那些这里描述过的信息分配技术。所以,上述说明书不应该被用来限制本发明的范围,本发明是通过随后权利要求的集合和范围以及它们的所有等效范围来确定范围的。
权利要求
1.在一个计算机系统中,一种实现用于面向对象程序的信息分配方法,包括收集将信息分配到接收器对象的第一方法的一个位置上的接收器类型信息;以及存储该接收器类型信息以用于后续的程序执行。
2.根据权利要求1的方法,其特征在于所述的接收器类型信息包括每一个从所述位置上向之分配信息的不同接收器类型。
3.根据权利要求1的方法,其特征在于所述的接收器类型信息包括用于对从所述位置上向之分配信息的每个不同接收器类型的调用位置的引用。
4.根据权利要求1的方法,其特征在于所述的接收器类型信息包括在内联方法的调用位置处遇到的接收器类型。
5.根据前述的任一个权利要求的方法,其特征在于当对该程序进行解释时,收集所述的接收器类型信息。
6.根据前述的任一个权利要求的方法,进一步包括确定何时希望编译包括将信息分配到接收器对象的位置的第一方法的步骤。
7.根据权利要求6的方法,其特征在于确定何时希望编译第一方法包括确定何时所述的第一方法已经被调用超过预定次数。
8.根据前述的任一个权利要求的方法,进一步包括编译所述的第一方法从而在将信息分配到接收器对象的位置处包括接收器类型信息。
9.根据权利要求8的方法,其特征在于被编译的第一方法继续收集接收器类型信息。
10.根据权利要求1和5-9的任一种方法,其特征在于在一个多形的内联高速缓存器中收集所述的接收器类型信息。
11.根据权利要求1和5-9的任一种方法,其特征在于将所述的接收器类型信息存入用于第一方法的类文件中。
12.根据权利要求11的方法,其特征在于将所述的接收器类型信息存入所述类文件的属性段。
13.一种实现用于面向对象程序的信息分配的计算机程序产品,包括在将信息分配到接收器对象的方法的位置处收集接收器类型信息的计算机代码;和存储用于后续程序执行的接收器类型信息的计算机代码;和存储所述计算机代码的计算机可读介质。
14.一种实现用于面向对象程序的信息分配的计算机系统,包括一个执行计算机代码的处理器;收集位于将信息分配给接收器对象的方法位置处的接收器类型信息的计算机代码;和存储用于后续程序执行的接收器类型信息的计算机代码;和存储用于处理器执行的所述计算机代码的计算机可读介质。
15.在一个计算机系统中,一种实现用于面向对象程序的信息分配的方法,包括在解释期间,收集位于将信息分配给接收器对象的第一方法位置处的接收器类型信息,其中所述接收器类型信息包括每一个不同接收器类型和用于每一个不同接收器类型的位置的引用,其中消息从接收器类型分配到所述位置;确定希望编译包括将信息分配到接收器对象的位置的所述第一方法;编译所述的第一方法使其包括位于将信息分配到接收器对象的位置处的接收器类型信息;和存储所述的接收器类型信息以用于程序的后续执行。
16.根据权利要求15的方法,其特征在于所述接收器类型信息包括在内联方法的调用位置处所遇到的接收器类型。
17.根据权利要求15和16的任一方法,其特征在于确定希望编译第一方法包括确定该方法已经被调用超过预定次数。
18.根据权利要求15的方法,其特征在于被编译的第一方法继续收集接收器类型信息。
19.根据权利要求15的方法,其特征在于在其中一个多形内联高速缓存器中收集所述的接收器类型信息。
20.根据权利要求15的方法,其特征在于所述的接收器类型信息被存在用于该方法的一个Java类文件中。
21.根据权利要求20的方法,其特征在于所述的接收器类型信息被存在所述Java类文件的属性段。
22.一种实现用于面向对象程序的信息分配的计算机程序产品,包括在解释期间,收集位于将信息分配给接收器对象的方法的位置处的接收器类型信息的计算机代码,其中所述接收器类型信息包括每一个不同接收器类型和对用于每一个不同接收器类型的位置的引用,将信息从所述位置分配到各个不同的接收器对象;确定希望编译包括将信息分配到接收器对象的位置的所述方法的计算机代码;编译所述方法使其包括位于将信息分配到接收器对象的位置处的接收器类型信息的计算机代码;和存储所述接收器类型信息以用于程序的后续执行的计算机代码;和存储所述计算机代码的计算机可读介质。
23.一种实现用于面向对象程序的信息分配的计算机系统,包括一个执行计算机代码的处理器;在解释期间,收集位于将信息分配给接收器对象的方法的位置处的接收器类型信息的计算机代码,其中所述接收器类型信息包括每一个不同接收器类型和对用于每一个不同接收器类型的位置的引用,将信息从所述位置分配到各个不同的接收器类型;确定希望编译包括将信息分配到接收器对象的位置的所述方法的计算机代码;编译所述方法使其包括位于将信息分配到接收器对象的位置处的接收器类型信息的计算机代码;和该代码存储所述接收器类型信息以用于程序的后续执行的计算机代码;和存储所述计算机代码以用于处理器执行的计算机可读介质。
24.一种由计算机可读介质存储的用于面向对象方法的数据结构,包括至少一种由所述计算机可读介质存储的接收器类型;以及由所述计算机可读介质存储的嵌套的接收器类型,该嵌套的接收器类型是这样的接收器类型,它在所述方法的信息分配位置处被分配信息。
25.根据权利要求24的数据结构,其特征在于所述的嵌套的接收器类型包括在所述方法中的信息分配位置的引用。
26.根据权利要求24的数据结构,其特征在于所述的嵌套的接收器类型包括这样的接收器类型,它在位于内联方法中信息分配位置处被分配信息。
27.根据权利要求24的数据结构,其特征在于所述的数据结构被存储入用于所述方法的Java类文件中。
28.根据权利要求27的数据结构,其特征在于所述的数据结构被存入所述Java类文件的属性段。
全文摘要
本发明提供了用于实现在面向对象程序中所使用的信息分配的系统和方法。收集将信息分配到接收器对象的方法的位置处的接收器类型信息。存储该接收器类型信息以用于程序的后续执行。通过存储该接收器类型信息,程序可以不需要再次收集接收器类型信息所以该程序更为有效。另外,可以和接收器类型信息一起存储内联信息。
文档编号G06F9/42GK1237737SQ98124629
公开日1999年12月8日 申请日期1998年10月5日 优先权日1997年10月6日
发明者L·巴克, U·赫尔茨勒 申请人:太阳微系统有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1