基于标记的链接的制作方法

文档序号:6407186阅读:127来源:国知局
专利名称:基于标记的链接的制作方法
技术领域
本发明一般涉及用于资源受限装置如智能卡等的面向对象、结构中性的程序。
背景技术
虚拟机是一种通过处理器执行的软件应用程序或指令序列产生的抽象计算机。术语“结构中性”指的是例如用JavaTM编程语言写的程序,它们可以在具有各种不同计算机结构的各种计算机平台上通过虚拟机来执行。这样,例如在基于WindowsTM的个人计算机系统上执行的虚拟机将使用与如在基于UNIXTM的计算机系统上执行的虚拟机相同的指令组。虚拟机的指令序列的独立平台编码的结果是一个或多个字节代码流,其中每一个例如是一个字节长的数字代码。
已经在包括例如与网络浏览器有关的应用程序的许多应用程序中使用了Java编程语言。
Java编程语言是面向对象的。在一个面向对象的系统中,“类”描述了数据的集合和操作该数据的方法。与数据和方法一起的标记描述了对象的状态和性能。
Java编程语言也是可检验的,以便在执行以Java编程语言编写的应用程序之前,可以确定是否程序中的指令序列试图处理那些用于字节代码的类型不正确的数据或者是否程序的字节代码指令的执行将引起操作数堆栈的下溢或上溢。
JavaTM虚拟机执行Java编程语言写的虚拟机代码并且被设计用于32位的结构。然而,许多资源受限装置如智能卡具有8位或16位的结构。
智能卡也称为智能便携式数据携带卡,一般由塑料或金属制成并且具有电子芯片,该芯片中包括用于执行程序的嵌入式微处理器以及用于存储程序和数据的存储器。这种大小可与信用卡相似的装置通常具有有限的存储容量。例如,一些智能卡具有小于1千字节(1K)的随机存取存储器(RAM)以及有限的只读存储器(ROM),和/或非易失性存储器如电擦除可编程只读存储器(EEPROM)。
一般地,在智能卡处理器上运行的程序确定了该卡所提供的服务。随着时间流逝,卡上的程序可能需要更新,例如为了增加新的功能或改进现有的功能。为此,该卡应该能够接受可以替代其它程序的新程序。
执行字节代码的虚拟机(例如,完全的Java虚拟机)通常要求相当大的存储量以加载字节代码和解析标识(reference)。特别地,在Java虚拟机中,符号标识用于指出诸如类、方法和字段之类的程序元素。通过使用它的符号名来定位该元素可以解析这些程序元素的标识。这种操作要求相当大的随机存取存储器(RAM)。在只有较小RAM的环境中,这可能是不方便的。因为智能卡对于成本是敏感的,它们依靠便宜的、低性能处理器和低容量存储器装置。因为成本和功率的原因使得在这种资源受限的计算机中配置低功率和低容量处理器以及存储器组件,在这种资源受限装置上操作Java虚拟机的能力是困难的但仍然是需要的。

发明内容
根据本发明的一方面,提供了一种用于实现适用于在一资源受限的装置上执行的小的虚拟机的方法,该方法包括在一资源丰富装置上执行一处理功能;记录所述执行的结果;及使用一或多个标记将所述结果传送给一资源受限装置,所述资源受限装置被构成以使用一或多个标记来替代执行所述处理功能。
根据本发明的另一方面,提供了一种用于实现适用于在一资源受限的装置上执行的小的虚拟机的设备,该设备包括执行装置,用于在一资源丰富装置上执行一处理功能;记录装置,用于记录所述执行的结果;及传送装置,用于使用一或多个标记将所述结果传送给一资源受限装置,所述资源受限装置被构成以使用一或多个标记来替代执行所述处理功能。
根据本发明的再一方面,提供了一种用于实现适用于在一资源受限的装置上执行的小的虚拟机的方法,该方法包括接收一或多个标记,该一或多个标记包括在一资源丰富装置上执行一处理功能的结果;及在所述资源受限装置上使用所述一或多个标记来替代执行所述处理功能。
根据本发明的再另一方面,提供了一种用于实现适用于在一资源受限的装置上执行的小的虚拟机的设备,该设备包括接收装置,用于接收一或多个标记,该一或多个标记包括在一资源丰富装置上执行一处理功能的结果;及使用装置,用于在所述资源受限装置上使用所述一或多个标记来替代执行所述处理功能。
根据本发明的再另一方面,提供了一种资源受限装置,包括存储装置,用于存储一或多个标记,该一或多个标记包括在一资源丰富装置上执行一处理功能的结果;及处理器,被连接至所述存储器并被构成以接收所述一或多个标记;且在所述资源受限装置上使用所述一或多个标记来替代执行所述处理功能。
本发明的优点可以包括下面的一个或多个。本发明通过唯一的标记标识符使用较小的存储空间以有效地使用资源受限装置上的资源。另外,本发明能够链接和判定资源受限装置上输出项的标识。经过元数据文件如输出文件,本发明允许将输出元素公开。然而,能够进行的这种公开不能暴露专用的或专有的元素和小应用程序(applet)以及相关库的细节。因此,许多分开的改进的应用程序可以加载到资源受限装置并且相互共享它们的组件而不用考虑专用的保密信息。
另外,结构中性的语言如Java的优点是能够在资源受限装置上实现,同时保留它的语义。标记也可以用于内部的或专用的元素。这样,标记可以分配给专用的和包可视实例(instance)字段以及包可视虚拟方法。本发明在分配标记上施加较少的限制,并且对于特定的应用程序可以进一步定义或优化该标记种类。这样,本发明支持一次写入并且可以在任何地方,甚至在资源限制装置如具有有限存储容量的智能卡上运行的便携的、结构中性代码。


图1示出了将独立于硬件平台的代码转换和加载到智能卡。
图2示出与图1所示的智能卡进行通讯的计算机系统。
图3是说明内部包相关性的示意图。
图4A和4B是说明两个转换器操作的示意图。
图5是说明解析静态标识的两个包和包登记的示意图。
图6是结合图5的包说明链接处理的流程图。
图7A-7I是说明不同的类、字段和方法标识的示意图。
图8A-8I是说明用于分配标记和支持表格的处理的流程图。
图9A-9C是说明用于判定实例字段和方法的标记的处理流程图。
具体实施例方式
本发明描述了一种采用压缩、保密格式表示用于面向对象程序的链接信息的方法。利用这种方法,能够在资源受限装置上下载、链接和执行所述程序。资源受限装置一般认为是在存储器和/或计算功率或速度上受限制的装置。虽然下面参照智能卡描述了特定的实现,本发明也可以用于其它的资源受限装置,包括但不限于蜂窝式电话、边界扫描装置、字段可编程装置、个人数据辅助(PDA)和寻呼机、以及其它小型或微型装置。在某些情况下,资源受限装置可以具有小到1K的RAM或小到16K的ROM。类似地,某些资源受限装置基于为小于32位设计的结构。例如,能够使用本发明的某些资源受限装置基于8位或16位结构,而不是32位结构。
参照图1,对于资源受限装置如智能卡40的小应用程序的开发以类似于Java程序开发的方式开始。换句话说,开发器编写一个或多个Java类并且采用Java编译器来编译源码以产生一个或多个类文件10。例如在工作站上能够使用模拟工具运行、测试和调试小应用程序以模仿卡40的环境。当准备将小应用程序下载到卡40上时,类文件10被转换器14转换成一个经转换的小应用程序(CAP)文件16。转换器14可以是由台式计算机执行的Java应用程序。除了被转换的类文件10以外,转换器14可以接受一个或多个输出文件12作为其输入。输出文件12包含用于通过转换的类输入的其它包内容的命名或链接信息。
一般地,CAP文件16包括在单个Java包中定义的所有类和接口并且由一个8位字节流表示。所有的16位和32位参数都是分别通过读取两个或四个连续的8位字节来构造的。除此以外,CAP文件16包括常数池组件(或“常数池”)18,该组件与方法组件20分开打包。常数池18可以包括不同类型的常数,这些常数包括程序被链接或下载到智能卡40时或在智能卡执行时判定的方法和字段标识。方法组件20指定了下载到智能卡40并且随后由智能卡执行的应用程序指令。
在转换之后,CAP文件16可以存储在计算机可读介质17上,如硬盘、软盘、光存储介质、闪速(flash)设备或某些其它适当的介质上。或者计算机可读介质可以采用载波形式,例如网络数据传输或射频(RF)数据链接。
然后CAP文件16可以通过外围设备的卡接收装置(CAD)24复制或传送到终端22如台式计算机。CAD24允许在智能卡40上写入和检索信息。CAD24包括一个可以插入智能卡40的卡插口(未示出)。一旦插入,连接器的触点紧压在智能卡40的表面连接区域上以提供功率并且允许与智能卡通讯,不过在其它实施方式中,也可以使用无接触的通讯。终端22还包括安装工具26,它将用于传输的CAP文件16加载到卡40上。智能卡40具有可以包括一组触点的输入/输出(I/O)端口42,经过这些触点提供程序、数据和其它通讯。卡40还包括安装工具46,用于接收CAP文件16的内容和准备在卡40上执行的小应用程序。安装工具46可以例如通过Java程序实现并且可以在卡40上执行。卡40还具有存储器,包括易失性存储器如RAM50。卡40还具有ROM52和非易失性存储器如EEPROM54。通过控制器44准备的小应用程序可被存储在EEPROM54中。
在一个特定实施方式中,小应用程序通过在微处理器48上运行的虚拟机49来执行。可被称为Java卡虚拟机的虚拟机49不需要加载或操作CAP文件16。而是Java卡虚拟机49执行先前作为CAP文件16部分存储的小应用程序代码。Java卡虚拟机49和安装工具46之间的功能划分允许虚拟机和安装工具都保持相对较小。
一般地,为资源受限平台如智能卡40而编写的实施方式和小应用程序遵循Java平台包的标准规则。在T.Lindholm等人的“Java虚拟机规范(1997)”和K.Arnold等人的“Java编程语言第二版(1998)”中描述了Java虚拟机和Java编程语言,在此将它们整个作为参考。用于智能卡平台的应用程序编程接口(API)类可以作为包括包标示的Java源文件来写,这里一个包包括了许多编译单元并且具有唯一的名称。包机构用于识别和控制对于类、字段和方法的存取。Java卡API允许对于一个Java卡使能平台所写的应用程序可以运行在任何其它Java卡使能平台上。另外,Java卡API兼容于正式的国际标准如ISO7816以及业界特定的标准如Europay/MasterCard/Visa(EMV)。
虽然已将运行在微处理器48上的虚拟机49作为一个在智能卡40上执行字节代码的实施例进行了描述,但在其它实施例中,也可以使用专用集成电路(ASIC)或硬件和固件的组合来代替。
参照图1,控制器44使用安装工具46来接收CAP文件16的内容和准备处理器48执行的小应用程序。安装工具46可以作为例如已经适当地被转换在智能卡40上执行的Java程序来实现。在下面的描述中,假设控制器44包括在微处理器48上运行的虚拟机程序49。虚拟机49不需要加载或操作CAP文件16。而是虚拟机49执行CAP文件16中的小应用程序代码。虚拟机49和安装工具46之间的功能划分允许虚拟机和安装工具都保持相对较小。在其它实施例中,控制器44可以是硬连线的,例如作为专用集成电路(ASIC)或者它可以作为硬件和固件的组合来实现。
可以用于其它资源受限装置的智能卡平台也支持动态创建的对象,包括类实例和数组。一个类作为单个已有类的扩展或子类被实现并且它的成员是方法以及称为字段的变量。一种方法声明(declare)将可以被调用和传递固定数量的值的可执行代码作为变元。类也可以实现Java接口。接口是标识类型,它的成员是常数和抽象方法。虚拟机49可以包括解释器或提供对运行期(runtime)系统存取的本地实现,该系统包括Java卡API和支持功能。
如图2所示,计算机22备有用于接收图1的卡40的卡接受装置24。计算机22可以连接到与多个其它计算装置,如服务器47通讯的网络45。它可以使用卡配备装置经过网络45将数据和软件加载到智能卡上。这种特性的下载可以包括加载到智能卡的小应用程序或其它程序以及根据电子商务和其它应用所使用的数字兑付和其它信息。用于控制卡接受装置和智能卡的处理元素的指令和数据可以存储在易失性或非易失性存储器或者可以经过通讯链路例如作为包含指令和/或数据的载波直接接收。另外,例如网络45可以是LAN或WAN如互联网或其它网络。
图3是说明加载到智能卡40的一组程序包(包括应用程序接口(API)和小应用程序)之间典型的分层相关性的示意图。应用程序可以递增地加载到智能卡40和链接到卡上执行,使得除了出厂时所编的功能以外可以采用另外的性能来更新智能卡40的功能。在示意图中,Java语言框架50和Java卡框架52存在于Java卡API级别上。在Java卡API级别以上是具有一个或多个定制框架54的定制API级别。定制框架54可以通过一个或多个加值提供者经过不同的软件开发包(SDK)来提供以扩展现有的框架或其它的API。最高级是应用级,这里驻留不同的小应用程序56、58和60。
如图3所示,一个包可能取决于相同API级别的其它包或较低API级别的那些包。例如,小应用程序58可以表示小应用程序58中的程序元素并且Java卡框架52可以具有与Java语言框架50的相关性。另外,在定制API级别的定制框架54和小应用程序58和60可以具有取决于Java卡框架52的标识。接下来,小应用程序56和58可以具有取决于定制框架54的标识。小应用程序56和定制框架54也可以取决于Java语言框架50。虽然图3的例子示出了线性相关性,也可以使用适当的转换器14和安装工具46来支持非线性相关性,如圆形的相关性。
从例如Java应用程序到CAP文件74的一个类文件集合的转换一般可能发生在台式计算机上以备在智能卡40上安装。台式计算机22一般不像典型的智能卡40一样是资源受限的。另外,转换操作也可以在其它适当的平台上进行。
图4A示出了用于转换一个包的系统,它可以定义一个准备下载到智能卡40的小应用程序或库。转换器72接收从一个或多个类文件70输入的数据,该文件定义小应用程序的功能。转换器72接着产生适用于下载的Java卡CAP文件74。
如下面更详细描述的,CAP文件74包含输出组件82用于判定其包中元素的标识,这里这些元素可以通过其它包来标识。输出组件82包含用于静态项如类、方法和字段的入口。对于动态项如实例字段、虚拟方法和接口方法的标识不要求出现在输出组件中,但可以根据下面描述的处理进行控制。
在资源受限装置中,为了表示项而使用的单代码(Unicode)串占用了存储器和处理器资源。代替这些单代码串,输出组件82将标记、或简单的唯一数值映射到CAP文件74中其它组件定义的特定元素上。用于表示输出组件中这些元素的标记值匹配于在相应输出文件80中公开的那些值。
更详细地说,CAP文件74还具有标题组件76、常数池78、方法组件80以及输出组件82。常数池78通常包括一个或多个类、字段和方法标识,从而可以通过包的常数池78间接地进行对程序元素或项的一般标识。方法组件80包含由CAP文件74所表示的小应用程序包实现的所有方法。方法标识判定位于方法组件中的方法。类和静态字段标识分别判定在类组件和静态字段组件中的位置。
输出组件82包括一个或多个具有标记值84和相应的程序元素链接信息86的入口,该信息描述了在CAP文件A74定义的包中可以找到特定的程序元素。链接信息专用于CAP文件74的内容,而不是特定卡上的内部表示。因此,这个组件不描述专用卡的个人或保密信息。
转换器72还可以在类文件转换到CAP文件74期间产生输出文件80。每个CAP文件产生一个输出文件。输出文件80典型地具有一个或多个具有用于CAP文件74中特定程序元素的符号名90及其相应标记值92的入口。输出文件80提供关于类文件包的每个外部可存取程序元素的信息和可以通过第二个包参照(输入)到第二CAP文件(下面进一步描述)的CAP文件74中的程序信息。例如,输出文件80包含一个Java包中定义的所有公共类和接口的标识、以及在这些类和接口中定义的所有公开和受保护的字段和方法的标识。输出文件80还包含这些程序元素或项到标记的映射,这些标记可以随后用于在包转换期间将输入项的名称映射到标记。输出文件不暴露小应用程序和相关库的专用或专有细节。因此,不同的单独开发的应用程序可以加载到资源受限装置并且相互共享它们的组件而不用考虑专用的保密信息。输出文件80不暴露小应用程序和相关库的专用和专有元素和细节,单独开发的应用程序可以加载到卡40并且相互共享它们的输出元素而不用考虑专用的保密信息。
参照图3和图4A,如果一系列包含javacard.framework API52的类文件70被转换,则在转换期间产生的输出文件80允许其它被单独转换的小应用程序知道使用哪个标记来外部参照javacard.framework API52的项。例如,如果小应用程序参照框架类PIN,用于javacard.framework的输出文件80包含用于类javacard.framework.PIN与它相应标记的入口。转换器72将这个标记放在新的小应用程序的CAP文件的常数池中,以表示对一个框架中该类的未判定标识。如下面进一步解释的,在小应用程序执行期间,该标记可以用于定位框架API包的输出组件78的标识项以检索元素链接信息。例如,一种方法的链接信息可以提供用于定位该包的方法组件80中包含的适当方法的信息。
图4B示出转换类文件94第二个包的转换器72,这里这些类文件94输入来自第一个包70的类文件的元素(图4A)。例如,第二个包可以是一组小应用程序类,它例如取决于在先前转换的javacard.framework库包中包含的某些类(如上面参照图4A描述的)。转换器72接收从类文件94和从先前转换包的一个或多个输出文件80输入的数据。转换器72产生适用于下载到例如智能卡40的CAP文件100。
用于第二个包的CAP文件B100包括具有小应用程序类参照的所有包清单的输入组件104。每个这种外部包标识包括用于该包的内部包标记和外部唯一应用程序标识符(AID)之间的映射106。每个包标记在CAP文件100的其它组件中用于以简明的方式识别一个特定标识的外部包,因此减少了表示小应用程序的脚印(footprint)尺寸。
CAP文件100中还具有标题组件102、输入组件104和常数池108。常数池108包括一个或多个类标识110,它采用相应的包标记和类标记映射每个类标识,因此将特定的类映射到它相应的外部包和该包内的类上。下面进一步描述这些标记的使用。常数池108也可以包括一个或多个方法标识112,它类似于采用相应的包标记、类标记和方法标记来映射每个方法标识。常数池108还包括一个或多个字段标识114,每个分别具有其包标记、类标记和字段标记。
一般地,可以通过每个包的常数池108间接进行对程序元素或项的标识。对其它包中的项的标识被称为外部的,并且根据标记来表示。对相同CAP文件中的项的标识被称为内部的,并且可以根据标记或以不同的内部格式(如对于CAP文件内位置的指针)来表示。例如,对于类的外部标识110包括包标记和类标记。同时,这些标记规定某一外部包中的某一类。对于一个类的内部标识可以是对于CAP文件内类结构位置的指针。另一方面,外部标记系统也可以内部使用。外部标识112-114表示静态的类成员,字段或方法,具有包标记、类标记、以及用于静态字段或静态方法的标记。对于静态类成员的内部标识可以是对于CAP文件中项的位置的指针,但也可以使用标记系统。对于实例字段、虚拟方法和接口方法的标识包括类标识和适当类型的标记。类标识表明该标识是外部的还是内部的。
CAP文件的外部标识可以在卡上从标记形式解析为由Java卡虚拟机使用的内部表示。标记可以仅仅通过定义的包的上下文来判定。正如输出文件从包的外部可视名称映射到标记,对卡上的每个包来说,都有一组用于从标记映射到解析标识的链接信息。以这种方式,转换器97处理类文件92和输出文件94,创建适用于将小应用程序下载到资源受限装置的图像并解析对第一个包的标识(链接)。
在图4A和图4B完成预处理之后,图4B的CAP文件可以下载到智能卡40或包含图4A的CAP文件的资源受限装置上。图5和图6进一步说明了基于标记的链接如何用于智能卡40或小装置上的静态元素。静态元素包括的元素的精确表示在转换处理期间可以由转换器识别。
在图5中,包P2的图像200已经从例如CAP文件B100加载到卡40上并且在执行之前或执行期间连接到先前的包P1。包P2 200的程序元素可以包括对外部包P1中的方法和其它数据的标识,该外部包P1已经作为(CAP文件A74的)卡40上的图像174存在。除此以外,图像174还包括标题组件176、常数池178、方法组件180以及包含了对所有输出静态项185的标记清单的输出组件182。为了帮助解决对于外部包的标识,在卡40上创建包登记120以提供用于定位一个或多个外部包的信息,包括包P1的图像174,它包含包P2的图像200所需的特定方法。
除此以外,包P2的图像200包括标题组件202、输入组件204、常数池208以及方法组件216,所有都对应于CAP文件B100中的相应组件102、104、108和116。上面相对于CAP文件描述了这些组件的一般构成。通常,方法组件216将包括程序标识如“new”(218)、“invokestatic”(220)和“getstatic_b”(222)以及它们各自调用的类标识、方法标识和字段标识。
图6示出对图5中的包P2 200的链接处理140。当方法组件216中的执行方法调用一种特定方法例如位于外部包(包1)的方法组件180中的方法T时,要求链接(步骤142)。利用作为操作数提供给指令的索引,处理140定位和检索常数池208中匹配的方法标识212(步骤144)。如下面描述的,方法标识包括用于定位外部包中该特定方法的包标记、类标记以及方法标记。接着,处理140检验输入组件204以根据检索的包标记找出外部包P1唯一的AID(步骤146)。然后对包登记120进行检验以根据AID找出包P1的位置(步骤148)。一旦从包登记120中找到包P1的图像174,就搜索图像174的输出组件182以定位具有特定的类标记的类(步骤150)。然后通过搜索与步骤150找出的特定类有关的方法清单来找出所需方法例如方法T的程序链接信息,以定位具有特定的方法标记的方法(这里方法标记Y对应于包P1 174的方法T)(步骤152)。最后,根据提供给输出组件182中的方法的链接信息,确定方法组件180中特定的方法例如方法T的位置(步骤154)。
使用图6的处理,可以将包下载到卡上并且准备由虚拟机执行。这个处理过程被称为“安装”。可以使用处理和链接操作次序不同的不同安装处理(当在卡上接收数据时和当存储它时)。这些安装处理可以根据卡上可利用的资源来优化。在一个实施例中,没有链接产生,这样,当数据被接收时,它被立刻存储。在代码的解释或执行期间,发生外部标识的解析。这样,这个实施方式被用于较大的(较少限定)小装置,因为所有的临时链接信息被永久地存储在这个卡上。
如上面讨论的,代替在Java类文件中使用的单代码串,使用标记来识别CAP文件的项和解析资源有限装置上的标识。API的标记由API的开发器分配并且在用于该API的包输出文件中公开。因为公开了名称到标记的映射,API开发器可以选择本发明限制内的任何标记序列。
同时,图5和图6描述了对于静态项即类、静态字段和静态方法的标识的解析。这些项的实施方式在编译和转换期间是完全可定位的。相反,在编译和转换期间,对于实例字段、虚拟方法和接口方法的标识并不静态地限制于特定的实施方式。这些项要求仅仅在运行时参照实例可用的附加信息。参照图9A-9C描述了这些类型的标识解析。
虚拟方法的标记分配保留了面向对象的类层次内的关系。虚拟方法和接口方法的标记分别用作到虚拟方法表和接口方法表的索引。特定卡的平台可以将标记解析成对资源受限装置VM的实现最为有用的内部表示。
一些标记可被解析为索引。例如,实例字段标记可被解析为对类实例的索引。在这种情况下,标记值可以与解析的索引值不同并且无关。
包中每一类型的项都具有其对该类型的标记的不相关范围。下面列出对于每一类型标识的样本标记区域和分配规则。也可以制定其它的标记区域和分配规则。

图7A-7I是说明标识表示的示意图。图7A-7C描述了输入元素的标识,而图7D-7I描述了内部项的标识,其中一些也使用标记。
图7A示出了一个对外部类180的类标识。图7A的类标识包括包标记和类标记。图7B示出外部字段标识的表示。外部字段标识182包括包标记、类标记和字段标记。图7C示出外部方法标识184的表示。外部标识184包括包标记、类标记和方法标记。应该注意对于虚拟方法将方法标记的高位设置为“0”。高位的设置表示该方法在定义的包之外是可存取的。高位可以是最高有效位,如一个字节的第7位、一个字的第15位或一个三字节单位的第23位。
设置包标记的高位来表示一个输入包。这用于区别外部和内部标识。如图7D-7I所示,对内部元素的标识使其高位被设置为“0”。图7D-7I的格式是在选定的情况下将标记扩展使用到内部项的例子。
图7D示出内部类标识186的表示。内部类标识186包括对于类组件中类信息结构的偏置。图7E示出用于内部字段的静态字段标识188的表示。这样,静态字段标识188包括一个被设置为“0”的字段和用于包括相对于静态字段图像中静态字段的偏置的字段。图7F是用于内部方法的静态方法标识190的表示。静态方法标识190包括被设置为“0”的填充字段,以使该标识具有与输入方法标识的大小相同的大小。静态方法标识190还包括提供与偏置相关的信息到方法组件的静态方法的字段。
图7G示出用于内部字段的实例字段标识192的表示。在图7G中,实例字段标识192包括对类组件中类信息结构的偏置以及字段标记。图7H示出用于内部方法的对公用或受保护方法的虚拟方法标识194。虚拟方法标识194包括对类组件中类信息结构的偏置、一个被清零以表示外部可存取的虚拟方法和符合图7C格式的字段。虚拟方法标识194还包括方法标记。
最后,图7I示出对用于内部方法的包可视方法的虚拟方法标识196的表示。虚拟方法标识196包括一个对于类信息结构和类组件的偏置,一个被设置为“1”以表示标识的范围位于该包内部的字段。标识196还包括方法标记。
图8A-8I是说明用于分配标记以及构造虚拟方法表和接口方法表的处理流程图。如上面讨论的,这些处理可以由转换器72完成。现在参照图8A,示出用于分配包标记的处理230。一般地,来自CAP文件内的包标识被分配仅在CAP文件中使用的标记。
处理230首先包含输入包(步骤231)的清单。该清单可以是任何顺序的。接着,处理230检查输入的包数量是否超过预定的阈值如127(步骤232)。在这种情况下,使用127这个限制来表示一个8位包标记,其高位被保留。如果输入包的数量超过预定的阈值如127,则处理失败(步骤205)。
可替换地,处理230将当前标记值初始化为“0”(步骤233)。接着,处理230将当前包初始化为清单中的第一个包(步骤234)。然后处理230检查当前的包是否为空(步骤235)。如果不是,则处理230将当前标记分配给当前包(步骤236)。接着,处理230将当前标记值加1(步骤237),以及设置当前包为清单中的下一个包(步骤238)。
从步骤235开始,在当前包为空的情况下,表示没有更多的输入包,处理230将标记记录在输入组件中(步骤239)并退出。对于输入包中项的标识使用记录在输入组件中的标记值。
现在转到图8B,示出了用于分配类和接口标记的处理240。处理240首先获得一个公共类和接口的任意排序的清单(步骤241)。接着,它检查是否类和接口的数量超过预定值如256,256是可以用8位表示的最大的类数量(步骤242)。如果是这样,处理240失败(步骤205)。可替换地,处理240将当前标记值初始化为“0”(步骤243)。它也将当前项初始化到在步骤241获得的清单中的第一类或接口(步骤244)。接着,处理240确定当前项是否为空,即表示不再有类或接口保留在清单中(步骤245)。如果不是,处理240分配当前标记值给当前项,当前项可以是一个类或一个接口项(步骤246)。接着,在返回步骤245之前,处理240将当前标记值加1(步骤247)并且设置当前项为清单中的下一类或接口(步骤248)。从步骤245开始,在当前项为空的情况下,即表示在清单中没有类或接口存在,处理240将标记值记录在输出组件表中(步骤249)。另外,处理240公开输出文件中的标记值(步骤251)并退出。
图8C-1和图8C-2处理静态字段标记,图8C-2是内嵌编译时间常数的图8C-1的最佳版本。包中的外部可视静态字段被分配公开标记。包可视的和专用的静态字段没有被分配标记。图8C-2描述了处理250优化的处理280。在这个优化中,没有为被初始化成编译时间常数的最后静态字段分配标记。在这种情况下,字段没有链接到卡上。
现在转到图8C-1,示出了用于分配公共类或接口中的静态字段标记的处理250。处理250首先获得公共类或接口中的公共和保护静态字段的任意排序清单(步骤252)。然后处理250设置当前标记值为“0”(步骤254)并且将当前字段初始化为清单中的第一个静态字段(步骤256)。然后处理225确定当前字段是否为空,即表示没有剩余字段(258)。如果不是,处理250将当前标记值分配给当前字段(步骤260)并且将当前标记值加1(步骤262)。然后在处理250返回步骤258之前,它设置当前字段为清单中的下一个静态字段(步骤264)。
从步骤258开始,在当前字段为空,即表示没有剩余字段的情况下,处理250确定是否当前标记大于预定的值如255,255是可以用8位表示的最大的标记数(步骤266)。如果是这样,处理250失败(步骤205)。可替换地,如果将生成输出组件,处理250将标记值记录在输出组件表中(步骤268)。最后,处理250公开输出文件中的标记值(步骤270)。
现在参照图8C-2,示出了对公共类或接口中静态字段标记的分配优化的处理280。通过去除编译时间常数和将标识代替直接插入在字节代码中的常数,该最优化减少了存储器占用。处理280获得公共类或接口中公共和保护静态字段的清单(步骤282)。然后处理280设置当前的标记值为“0”(步骤284)并且将当前字段初始化为清单中第一个静态字段(步骤286)。然后处理280检查是否当前字段是空的(没有字段)(步骤288)。如果不是,处理280确定是否当前字段是编译时间常数(步骤290)。如果是这样,处理280分配一个值如0xFF的值作为当前字段的标记值(步骤296)。另一方面,如果当前字段不是编译时间常数,则处理280将当前标记值分配给当前字段(步骤292)并且将当前标记值加1(步骤294)。从步骤294和296开始,在循环回步骤288以继续处理标记之前,处理280随后设置当前字段为清单中下一个静态字段(步骤298)。
从步骤288开始,在当前字段是空的(没有字段)情况下,该处理检查是否当前标记超过预定的阈值如255,该值是使用8位能够表示的最大数(步骤300)。如果是这样,处理280失败(步骤205)。另一方面,如果输出,则处理280将标记值记录在输出组件上(步骤302)。然后该处理公开具有编译的时间常数的输出文件的标记值(步骤304)使得标识包能够在退出之前直接插入相应的值。
现在转到图8D,示出了用于分配公共类中静态方法标记的处理310。处理310首先获得公共类中公共和保护静态方法以及构造器的清单(步骤312)。然后处理310检查是否静态方法的数量超过预定值如256(步骤314)。如果没有,该处理设置标记值为“0”(步骤316)并且将当前方法初始化为清单的第一个静态方法(步骤318)。接着,处理310检查是否当前方法是空的(没有方法)(步骤320)。如果不是,处理310将当前标记值分配给当前静态方法(步骤322)并且将当前标记值加1(步骤324)。然后在环返回步骤320之前,处理310设置当前方法为清单中下一个静态方法(步骤326)。
从步骤320开始,如果当前方法是空的(没有方法),则该处理将标记值记录在输出组件(步骤328)并且在退出之前公开输出文件中的标记值(步骤330)。
图8E-1和图8E-2涉及实例字段分配方案。图8E-1示出分配字段标记的一般处理,而图8E-2是一个优化的处理,它将标记分配扩展到内部(或包可视和专用的)字段、类型标识的组字段并且允许将标记容易地映射到实例内的偏置。
现在转到图8E-1,示出了用于分配公共类中实例字段标记的处理340。首先,处理340获得公共类中公共和保护实例字段的清单(步骤342)。然后它检查是否实例字段的数量超过预定的值如256(步骤344),如果是这样,则处理失败(步骤205)。另一方面,处理340设置当前标记值为“0”(步骤346)并且将当前字段初始化为清单中第一个字段(步骤348)。接着,处理340检查是否当前字段是空的(步骤350)。如果不是,处理340将当前标记值分配给当前实例字段(步骤352)并且将当前标记值加1(步骤354)。从步骤354开始,在循环回到步骤350之前,该处理设置当前字段为清单中下一个实例字段(步骤360)。从步骤350开始,在当前字段是空的情况下,处理340公开输出文件中的标记值(步骤362)并且退出。
在优化图8E-1的一般方法中可以考虑各种因素。一般地,标记的排序是灵活的,使得标记安排可以适用于特定的实现。图8E-2描述了如下面例子中示出的限定分配方案


现在参照图8E-2,示出了用于上面实例字段标记分配优化的处理370。如上所述,处理370获得类中所有实例字段的清单(步骤372)。接着,处理370检查是否编号的实例字段超过预定的值如256(步骤374)。如果是这样,处理370失败(步骤205),而如果不是这样,处理370将清单分类为包括首先是公共和保护原语类型、其次是公共和保护标识类型、再其次是包和原语标识类型、最后是包和专用的原语类型的种类(category)(步骤376)。标记值被设置为“0”(步骤378)并且当前字段被初始化为清单的第一个实例字段(步骤380)。接着,处理370检查是否当前字段是空的(步骤382)。如果不是,该处理将当前标记值分配给当前字段(步骤384)并且将当前标记值加1(步骤386)。然后处理370确定是否当前字段是整数类型(步骤388)。整数类型占用两个时隙以允许标记容易地映射到实例。如果是这样,当前标记值加1(步骤390)。从步骤388或从步骤390开始,在循环回步骤382之前,处理370将当前字段设置为清单中下一个实例字段(步骤392)。
从步骤382开始,如果当前字段是空的,则在退出之前处理370公开输出文件中公共和保护实例字段的标记值(步骤394)。
图8F-1和图8F-2分配虚拟方法的标记。图8F-1示出用于虚拟方法标记分配的一般方案,而图8F-2将标记分配扩展到包可视虚拟方法。
现在参照图8F-1和图8F-2,示出了用于分配虚拟方法标记的处理。一般地,在包中定义的虚拟方法被分配为可输出的或内部标记。可输出的标记分配给公共和保护的虚拟方法;在这种情况下,该标记的高位是“0”。内部标记分配给包可视虚拟方法;在这种情况下标记的高位是“1”。因为高位被保留,所以这些标记的区域范围从0到127。
用于类中外部可视引入的虚拟方法的可输出标记是从大于该类的超级类(superclass)的最高编号的可输出虚拟方法标记的那一个开始连续编号的。如果一种方法优于该类的超级类中实现的方法,则该方法使用如超级类中相应方法的相同的标记号,使得该占优的方法可以被识别为相关于它们优于的方法。
内部虚拟方法标记的分配不同于可输出的虚拟方法标记。如果在相同包中定义一个类和它的超级类,则用于该类中包可视的引入虚拟方法的标记从大于该类的超级类的最高编号的内部虚拟方法标记的那一个开始连续编号。如果在不同的包中定义该类和它的超级类,则用于该类中包可视引入虚拟方法的标记从“0”开始连续编号。如果该方法优于类的超级类中实现的方法,则该方法使用如超级类中相应的方法的相同标记号码。对于背景信息,Java编程语言的定义规定如果在相同的包中定义类和它的超级类,则优于包可视虚拟方法才是可能的。包含虚拟方法标记的字节的高位总是被设置为“1”,以表示它是内部标记。没有规定类中引入的包虚拟方法标记的排序。
在图8F-1中,处理400首先获得一个类中公共和保护虚拟方法的清单(步骤402)。然后处理400检查是否该类具有超级类(步骤404)。如果是这样,处理400进一步检查是否超级类在相同的包中(步骤406)。从步骤406开始,在超级类在相同包中的情况下,该处理找出超级类(步骤408)并且获得该超级类的虚拟方法和标记(步骤412)。虚拟方法的集合包括定义该类所有超级类的那些内容。从步骤406开始,在超级类不在相同包的情况下,处理400在输入包的输出文件中找出超级类(步骤410)并且随后转到步骤412。从步骤412开始,处理400将当前标记值初始化为最大的超级类虚拟方法标记并且将它的值加1(步骤414),以确保在该体系内没有标记冲突。
从步骤404开始,在该类不具有超级类的情况下,处理400将当前标记值初始化为“0”(步骤416)。从步骤414或步骤416开始,处理400将当前方法初始化为清单中第一个虚拟方法(步骤418)。接着,处理400确定是否当前方法是空的(步骤420)。如果不是,则该处理确定是否当前虚拟方法由超级类定义(步骤422)。如果是这样,则在循环回步骤420之前,该方法是占优的方法并且将相同的标记值分配给当前方法作为分配给超级类中占优方法的标记值(步骤424)。
从步骤422开始,在当前虚拟方法没有被超级类定义的情况下,它是一种引入的方法。在这种情况下,超级类400将当前标记值分配给当前方法(步骤426)并且将当前标记值加1(步骤428)。然后在循环回步骤420之前,处理400设置当前方法为清单中下一个方法(步骤430)。从步骤420开始,在当前方法是空的情况下,处理400检查是否当前标记值超过预定值如127(步骤432)。如果是这样,则处理400失败(步骤205)。另一方面,如果标记值不大于127,则在退出之前,处理400公开输出文件中的标记值以及继承的方法和它们的标记值(步骤434)。图8F-1的处理也可以用于分配标记到如图8F-2所示的包可视类中的公共和保护虚拟方法。
在图8F-2中,示出了用于将标记分配扩展到类中包可视虚拟方法的处理440。处理440首先获得该类中包可视虚拟方法的清单(步骤442)。接着,它检查是否该类具有超级类(步骤444)。如果是这样,则该处理检查是否超级类在相同的包中(步骤446)。如果是这样,则处理440找出相同包中的超级类(步骤448),获得超级类的包可视虚拟方法和标记(步骤450)并且将当前标记值初始化为最大的超级类虚拟方法标记加1(步骤452)以避免包范围的体系内的标记冲突。这确保先前在超级类内分配的标记值不再用于引入的方法。应该注意步骤450可以递归地达到相同包的超级类。
从步骤444开始,在一个类不具有超级类的情况下,或者从步骤446开始,在超级类不在相同包的情况下,处理440设置当前标记值为“0”(步骤454)。特别地,如果超级类不在相同包中,则该超级类的包可视虚拟方法是不可以使用的并且因此不包括在步骤454中。如上面图9D-2和图9D-3中描述的,这些可能的方法用于解释何时判定虚拟方法的标识。
从步骤452或步骤454开始,处理440将当前方法初始化为清单中第一个虚拟方法(步骤456)。接着,处理440检查是否当前方法是空的(步骤458)。如果不是,处理440检查是否当前虚拟方法由超级类定义(步骤460)。在这种情况下,该方法是占优的方法。如果是这样,在循环回步骤458之前,处理440如分配给超级类中占优方法一样来分配相同的标记值给当前方法(步骤462)。
从步骤460开始,如果当前虚拟方法没有被它的超级类定义,则它是一种引入的方法。在这种情况下,处理440分配当前标记值给当前方法并且设置高位为“1”(步骤464)。虚拟方法标记的高位用于确定是否它是公共或专用虚拟方法标记。接着,在循环回步骤458之前,处理440将当前标记值加1(步骤466)并且设置当前方法为清单中下一个方法(步骤468)。
在步骤458,在当前方法是空的情况下,在步骤470,处理440确定是否当前标记值超过一个值如127(它是用8位可以表示的最大的数,高位被保留)。如果是这样,则处理440失败(步骤205)。另一方面,在当前标记值在区域内的情况下,处理440退出。注意用于包可视虚拟方法的标记被内部使用并且不输出。
虚拟方法标识仅可以在执行期间判定。虚拟方法表允许该卡确定哪种方法根据该方法的类的标记以及实例来调用。标记值用作到虚拟方法表的索引。图8G-1示出用于构造类中公共虚拟方法表的处理480。首先,获得该类中公共和保护虚拟方法的清单(步骤482)。接着,处理480获得超级类的虚拟方法和标记(步骤484)。步骤484是递归的,包括类中所有的超级类。然后处理480创建一个表,通过标记值对虚拟方法排序(步骤486)并且去除重复的虚拟方法。对于占优的方法产生重复。在这种情况下,在方法表中表示在当前类中定义的方法来代替超级类中定义的那一个。然后在退出之前,处理480在步骤488设置对于最大虚拟方法标记类的计数并且将表格和计数记录在类组件中(步骤490)。
现在转到图8G-2,示出了优化类中公共虚拟方法表的结构的处理500。处理500通过去除超级类的虚拟方法表中叠加的元素来减小存储虚拟方法表所需的尺寸。
处理500首先获得类中公共和保护虚拟方法的清单(步骤502)。接着,获得超级类的虚拟方法和标记(步骤504)。步骤504是递归的,包括该类中所有的超级类。接着,处理500通过标记值将在步骤502和步骤504获得的虚拟方法排序来初始化一个表格(步骤506)。这个处理假定该处理具有至少一个入口。然后处理500将计数初始化为最大的虚拟方法标记加上1(步骤508)。处理500还设置基本计数为“0”(步骤510)。接着,处理500检查是否该计数是正的(步骤512)。如果是这样,该处理检查是否表中第一个入口由当前类定义(步骤514)。如果不是,该处理从表格中去除该方法并且将表中剩余的方法移上来(步骤518)。然后在循环回步骤512之前,处理500将计数减“1”(步骤520)并且将基本计数加“1”(步骤522)。
从步骤514开始,在当前类中定义第一个入口的情况下,或者在步骤512该计数是“0”的情况下,在退出之前,处理500转到将表格、计数和基数记录在类组件中(步骤516)。
图8H-1和图8H-2示出用于分配公共接口中接口方法标记的处理524。特别地,图8H-2更详细地示出图8H-1的步骤526。
现在参照图8H-1,处理524分配公共接口中的接口方法标记。处理524初始地获得公共接口中一组接口方法(步骤525)。接着,处理524获得接口的超级接口(superinterface)的清单(步骤526)。这个操作在图8H-2中更详细地定义。然后处理524将由接口和它的超级接口定义的方法集合和并(步骤527)。接着,处理524检查是否有大于256个方法存在(步骤529)。如果是这样,则处理524失败(步骤205)。否则,如果存在小于256个方法,则处理524将当前标记值设置为“0”(步骤530)并且将当前方法初始化为方法集合的方法中第一个方法(步骤532)。接着,处理524检查是否当前方法是空的(步骤533)。如果不是,处理524将当前标记值分配给当前接口方法(步骤534),将当前标记值加1(步骤535),以及在循环回步骤533之前设置当前方法为集合中下一个方法(步骤536)。
从步骤533开始,如果当前方法是空的,处理524公开输出文件中与接口相关的超级接口清单和方法标记值(步骤537)并且退出。
现在参照图8H-2,它更详细地示出图8H-1的步骤526。首先,图8H-2的处理选择一个接口(步骤682)。接着,它获得该接口继承的接口清单(步骤684)并且将当前接口设置为清单中第一个接口(步骤686)。接着,图8H-2的处理将结果集合初始化为空集合(步骤688)。从步骤688开始,图8H-2的处理迭代地将接口加到结果集合中。通过首先检查是否当前接口是空的,即表示没有其他接口需要处理来完成这一点(步骤690)。如果不是,该处理获得一个当前接口的超级接口集合(步骤692)。步骤692递归地调用处理526。
一旦完成步骤692,图8H-2的处理将超级接口集合加到结果集合(步骤694)以及将当前接口加到结果集合(步骤696)。然后该处理设置当前接口为下一个接口(步骤698)并且循环回步骤690以继续处理所有的接口。从步骤690开始,在当前接口是空的情况下,图8H-2的处理通过返回结果集合而退出。
接口表包含一个入口,用于类直接实现的每个接口以及用于直接实现接口的所有超级接口。接口表中每个入口包含接口的识别和接口方法表。该表格将接口方法的宣布映射到类的实现中。
图8I-1和图8I-2示出用于构造类的接口表的处理700。特别地,图8I-2更详细地示出图8I-1的步骤708。
图8I-1示出了用于构造接口表的处理700。首先,处理700获得接口的清单,包括超级接口,(见处理526)它通过当前类实现(步骤702)。接着,处理700将当前接口设置为这个集合中第一个接口(步骤704)。然后处理700检查是否当前接口是空的,这表示它已经完成(步骤706)。如果不是,处理700转到构造用于类的当前接口的接口方法表(步骤708),如图8I-2更详细示出。接着,在循环回步骤706之前,处理700设置当前接口为下一个接口(步骤710)。
从步骤706开始,在当前接口是空的情况下,在退出之前,处理700将具有它们接口方法表的接口记录在类组件中(步骤712)。
现在参照图8I-2,它更详细地示出步骤708。这个处理首先获得该类的虚拟方法表(步骤722)以及用于接口的接口方法和标记,包括继承的方法(步骤724)。接着,图8I-2的处理通过用它们的标记值将方法排序来初始化接口方法表(步骤726)。然后该处理将当前方法设置为接口方法表的第一个方法(步骤728)。从步骤728开始,该处理检查是否当前方法是空的即表示它已经完成(步骤730)。如果不是,图8I-2的处理找出虚拟方法表中接口方法的一个实现(步骤732)。接着,该处理将接口方法表的虚拟方法的标记值记录在当前方法的位置(步骤734)。然后在循环回步骤730之前,它将当前方法设置为当前接口的下一个方法(步骤736)。从步骤730开始,在当前方法是空的情况下,图8I-2的处理退出。
下面在图9A-9C中讨论执行期间元素的动态结合,它将标识判定描述为动态元素。在编译期间,不能对于特定的实现判定出转换和标记分配、对实例字段的标识、虚拟方法和接口方法,而仅仅能够判定出该项的抽象描述。
在实例字段的情况下,在定义类的范围内分配标记。该类的一个实例包含不仅由类定义,而且由所有它的超级类定义的所有字段。该标记不表示该实例内字段的位置,因为它们不反映该实例的特定安排并且不能解释由超级类定义的专用和包可视字段的位置。
在虚拟方法的情况下,在编译和转换期间,名称和类型特征标记以及实现这样一种方法的体系内的类是公知的。然而,当根据调用的方法可能确定实例的特定类时,直到执行为止才能知道精确的实现。例如,类A和它的超级类B实现方法定义M。直到执行为止才能知道是否编译时类型B的实例的方法M的调用将导致执行类A或类B的实现。
为了在执行期间提供适当地传送虚拟方法调用的手段,虚拟方法标记分配在类体系的范围内。即优于超级类继承链中先前引入方法的子类的方法必须具有如它优于的方法的相同标记值。同时,引入的方法(不优于超级类中定义方法的那些方法)必须具有在继承链内唯一的标记值。对于每个类定义虚拟方法表以提供将虚拟方法标记映射到特定的实现的手段。
接口方法类似于虚拟方法,这在于直到执行时才可以知道特定的实现,但它们的不同在于接口方法不能从多个接口继承。接口的多个继承引起一个问题,即虚拟方法标记分配的方式。优于多个接口引入的方法的类的方法不需要具有如它优于的方法相同的标记值,因为多个定义可以都具有不同的值。因此,对于一个特定接口的每组方法被分配标记值,而不用考虑任何其他接口的方法标记值。
因为各接口不共享标记值,需要另外的信息来将接口方法调用传送到特定的方法实现。因为接口方法标记在接口范围内是唯一的,需要接口方法标记和接口的识别来确定执行时由实例的类实现的方法。对于将接口识别映射到接口方法表的每个类定义一个接口表。该接口方法表对于该接口将接口方法标记映射到该类的方法实现。
图9A-9C是说明在执行期间用于判定标记的处理流程图。现在参照图9A,示出了用于判定实例字段标识的处理580。首先,处理580获得包含来自运行时堆栈的字段的实例(步骤582)。接着,处理580确定与该字段相关的标记并且将该标记映射到索引(步骤584)。从标记到索引的映射可以要求检验实例字段类型信息。另外,该操作可以要求通过超级类的实例的大小调节标记值。最后,在退出之前处理580使用索引以找出实例中字段的表示(步骤586)。
在图9B-1中,示出了对于公共或保护虚拟方法判定标识的处理620。首先,处理620从运行时堆栈获得类的实例(步骤621)并且确定实例的类(步骤622)。接着,处理620存取类的公共虚拟方法表(步骤624)并且使用该方法标记作为索引获得方法表入口(步骤626)。最后,处理620根据虚拟方法表的入口内容找出并且执行该方法(步骤628)以及退出。
现在转到图9B-2,示出了对于任何虚拟方法(包括包可视的)判定标识的处理600。首先,处理600从运行时堆栈获得类的实例(步骤601)并且确定该实例的类(步骤602)。接着,处理600确定是否该方法标记的高位被设置为“1”(步骤604)。如果不是,处理600获得公共虚拟方法表(步骤606)并且使用方法标记作为到虚拟方法表的索引(步骤608)。从步骤604开始,在方法标记的高位等于“1”的情况下,处理600将高位设置为“0”(步骤610)并且在转到步骤608之前获得包虚拟方法表(步骤612)。最后,根据虚拟方法表的入口内容,处理600找出并且执行该方法(步骤614)以及退出。
图9B-3示出使用如图8G-2描述的优化虚拟方法表,用于判定对任何虚拟方法的标识的优化处理670。首先,处理670从运行时堆栈获得类的实例(步骤671)并且将当前类设置为实例的类(步骤672)。一个方法表索引被初始化为方法标记值(步骤674)。然后处理670确定是否该方法标记的高位等于“1”(步骤676)。如果不是,处理670对于当前类的公共方法表的基数设置一个基数值(步骤678)。接着,该方法表被设置为当前类的公共虚拟方法表(步骤680)。然后处理670检查是否该方法表索引小于该基数值(步骤682),如果是这样,则将当前类设置为当前类的超级类(步骤684)。从步骤684开始,处理670循环回步骤676以继续处理。
在步骤676,如果高位等于“1”,则处理670将方法表索引的高位设置为“0”(步骤690)。在继续步骤682之前,它设置基数值为当前类的包方法表基数(步骤692)并且将该方法表设置为当前类的包虚拟方法表(步骤694)。
从步骤682开始,如果该方法表索引大于该基数,处理670使用方法表索引加上基数值获得一个方法表入口(步骤686)。然后处理670根据当前类的方法表中入口的内容找到该方法(步骤688)。接着,处理670退出。
现在参照图9C,示出了判定接口方法标识的处理650。首先,处理650从运行时堆栈获得类的实例(步骤651)并且将当前类设置为实例的类(步骤652)。接着,处理650搜索当前类的接口表中规定的接口(步骤654)。然后该处理确定是否接口已经被发现(步骤656)。如果不是,则在循环回步骤654之前,该处理将当前类设置为当前类的超级类(步骤660)。
从步骤656开始,在找到规定接口的情况下,处理650获得当前类中相应的接口方法表(步骤662)。然后它从表格的入口获得虚拟方法标记,该表格的索引等于接口方法标记(步骤664)。然后处理650获得实例的类的公共虚拟方法表(步骤666)。处理650从与虚拟方法标记相关的表格入口获得虚拟方法位置(步骤668)。然后处理650根据虚拟方法表中入口的内容定位方法(步骤669)。一旦完成这一点,处理650退出。
虽然相对于智能卡实现说明了本发明,但是本发明也可以应用于具有小脚印的其它装置,如在存储器或计算功率或速度中被相对限定或限制的装置。除此之外,这种资源受限装置可以包括边界扫描装置、字段可编程装置、寻呼机和蜂窝式电话。当在它们之间存在共享对象可以使用服务器小应用程序(servlet)时,本发明可以证明是有益的。某些台式机系统也可以利用本发明的技术。
本发明还涉及用于完成这些操作的设备。这种设备可以特别地构造用于所需的目的或者它可以包括通用计算机,作为由存储在计算机中的计算机程序选择地激活或重新配置。这里表现的过程并不固有地相关于特定的计算机或其它设备。不同的通用机可以使用根据这里的技术所写的程序,或者它可以更加方便地构造更特定的设备来完成所需的方法步骤。由上面给出的描述表现了对于这些不同的机器所需的结构。另外,应该理解符合本发明的虚拟机能够提供早期虚拟机没有的功能,如JavaTM虚拟机规范中描述的虚拟机。
JavaTM编程语言和平台适用于本发明,同时具有某些特性的语言或平台也将适用于实现本发明。这些特性包括类型安全、指针安全、面向对象、动态链接以及基于虚拟机。并不是所有这些特性需要出现在特定的实现中。在某些实施例中,可以使用缺少这些特性中一个或多个的语言或平台。“虚拟机”能够用位(虚拟机)或硅片(实际的/物理机/专用集成电路)实现。同样,虽然说明的本发明表明是逐个对象安全的,但是本发明也可以使用其他的方法如逐个类安全的。
本发明的系统可以用硬件或计算机程序实现。每个这样的计算机程序可以存储在存储介质或装置中(例如,CD-ROM,硬盘或磁盘),当存储介质或装置由计算机读出以实现描述的过程时,它可以由通用或专用可编程计算机读出用于配置和操作计算机。该系统也可以作为计算机可读存储介质实现,采用计算机程序来配置,这里这样配置存储介质使得计算机以特定的和预定的方式工作。
这里的程序一般用导致所需结果的自相容序列步骤。这些步骤要求实际参数的实际操作。虽然通常不需要,但是这些参数采用电或磁的信号形式,能够存储、传送、组合、比较以及进行其他操作。它常常证明是方便的,主要是公共使用的原因,将这些信号表示为位、值、元素、符号、字符、项、数字等。然而,应该注意所有的这些和类似的项与适当的实际参数有关并且只是方便应用于这些参数的标号。
尽管参照实施例示出和描述了本发明,但是本领域的技术人员应该理解在形式上和细节上的变化并没有背离下面权利要求书的精神和范围。
其他的实施例也在下面权利要求书的范围内。
权利要求
1.一种用于实现适用于在一资源受限的装置上执行的小的虚拟机的方法,该方法包括在一资源丰富装置上执行一处理功能;记录所述执行的结果;及使用一或多个标记将所述结果传送给一资源受限装置,所述资源受限装置被构成以使用一或多个标记来替代执行所述处理功能。
2.如权利要求1所述的方法,其中所述处理功能包括标识一或多个静态字段的位置。
3.如权利要求2所述的方法,其中所述一或多个静态字段包括一或多个内部静态字段。
4.如权利要求2所述的方法,其中所述一或多个静态字段包括一或多个外部静态字段。
5.如权利要求1所述的方法,其中所述处理功能包括标识一或多个静态方法的位置。
6.如权利要求5所述的方法,其中所述一或多个静态方法包括一或多个内部静态方法。
7.如权利要求5所述的方法,其中所述一或多个静态方法包括一或多个外部静态方法。
8.如权利要求1所述的方法,其中所述处理功能包括标识一或多个类的位置。
9.如权利要求8所述的方法,其中所述一或多个类包括一或多个内部类。
10.如权利要求8所述的方法,其中所述一或多个类包括一或多个外部类。
11.如权利要求1所述的方法,其中所述处理功能包括标识一类实例内的一或多个实例字段的位置,所述一或多个标记包括一或多个索引。
12.如权利要求1所述的方法,其中所述处理功能包括标识一类虚拟方法表中的一或多个虚拟方法的位置,所述一或多个标记包括一或多个索引。
13.如权利要求1所述的方法,其中所述处理功能包括标识一类接口方法表内的一或多个接口方法的位置,所述一或多个标记包括一或多个索引。
14.如权利要求1所述的方法,其中所述处理功能包括标识可被输出的一或多个静态公共项的位置。
15.一种用于实现适用于在一资源受限的装置上执行的小的虚拟机的设备,该设备包括执行装置,用于在一资源丰富装置上执行一处理功能;记录装置,用于记录所述执行的结果;及传送装置,用于使用一或多个标记将所述结果传送给一资源受限装置,所述资源受限装置被构成以使用一或多个标记来替代执行所述处理功能。
16.如权利要求15所述的设备,其中所述处理功能包括标识一或多个静态字段的位置。
17.如权利要求16所述的设备,其中所述一或多个静态字段包括一或多个内部静态字段。
18.如权利要求16所述的设备,其中所述一或多个静态字段包括一或多个外部静态字段。
19.如权利要求15所述的设备,其中所述处理功能包括标识一或多个静态方法的位置。
20.如权利要求19所述的设备,其中所述一或多个静态方法包括一或多个内部静态方法。
21.如权利要求19所述的设备,其中所述一或多个静态方法包括一或多个外部静态方法。
22.如权利要求15所述的设备,其中所述处理功能包括标识一或多个类的位置。
23.如权利要求22所述的设备,其中所述一或多个类包括一或多个内部类。
24.如权利要求22所述的设备,其中所述一或多个类包括一或多个外部类。
25.如权利要求15所述的设备,其中所述处理功能包括标识一类实例内的一或多个实例字段的位置,所述一或多个标记包括一或多个索引。
26.如权利要求15所述的设备,其中所述处理功能包括标识一类虚拟方法表中的一或多个虚拟方法的位置,所述一或多个标记包括一或多个索引。
27.如权利要求15所述的设备,其中所述处理功能包括标识一类接口方法表内的一或多个接口方法的位置,所述一或多个标记包括一或多个索引。
28.如权利要求15所述的设备,其中所述处理功能包括标识可被输出的一或多个静态公共项的位置。
29.一种用于实现适用于在一资源受限的装置上执行的小的虚拟机的方法,该方法包括接收一或多个标记,该一或多个标记包括在一资源丰富装置上执行一处理功能的结果;及在所述资源受限装置上使用所述一或多个标记来替代执行所述处理功能。
30.如权利要求29所述的方法,其中所述处理功能包括标识一或多个静态字段的位置。
31.如权利要求30所述的方法,其中所述一或多个静态字段包括一或多个内部静态字段。
32.如权利要求30所述的方法,其中所述一或多个静态字段包括一或多个外部静态字段。
33.如权利要求29所述的方法,其中所述处理功能包括标识一或多个静态方法的位置。
34.如权利要求33所述的方法,其中所述一或多个静态方法包括一或多个内部静态方法。
35.如权利要求33所述的方法,其中所述一或多个静态方法包括一或多个外部静态方法。
36.如权利要求29所述的方法,其中所述处理功能包括标识一或多个类的位置。
37.如权利要求36所述的方法,其中所述一或多个类包括一或多个内部类。
38.如权利要求36所述的方法,其中所述一或多个类包括一或多个外部类。
39.如权利要求29所述的方法,其中所述处理功能包括标识一类实例内的一或多个实例字段的位置,所述一或多个标记包括一或多个索引。
40.如权利要求29所述的方法,其中所述处理功能包括标识一类虚拟方法表中的一或多个虚拟方法的位置,所述一或多个标记包括一或多个索引。
41.如权利要求29所述的方法,其中所述处理功能包括标识一类接口方法表内的一或多个接口方法的位置,所述一或多个标记包括一或多个索引。
42.如权利要求29所述的方法,其中所述处理功能包括标识可被输出的一或多个静态公共项的位置。
43.一种用于实现适用于在一资源受限的装置上执行的小的虚拟机的设备,该设备包括接收装置,用于接收一或多个标记,该一或多个标记包括在一资源丰富装置上执行一处理功能的结果;及使用装置,用于在所述资源受限装置上使用所述一或多个标记来替代执行所述处理功能。
44.如权利要求43所述的设备,其中所述处理功能包括标识一或多个静态字段的位置。
45.如权利要求44所述的设备,其中所述一或多个静态字段包括一或多个内部静态字段。
46.如权利要求44所述的设备,其中所述一或多个静态字段包括一或多个外部静态字段。
47.如权利要求43所述的设备,其中所述处理功能包括标识一或多个静态方法的位置。
48.如权利要求47所述的设备,其中所述一或多个静态方法包括一或多个内部静态方法。
49.如权利要求47所述的设备,其中所述一或多个静态方法包括一或多个外部静态方法。
50.如权利要求43所述的设备,其中所述处理功能包括标识一或多个类的位置。
51.如权利要求50所述的设备,其中所述一或多个类包括一或多个内部类。
52.如权利要求50所述的设备,其中所述一或多个类包括一或多个外部类。
53.如权利要求43所述的设备,其中所述处理功能包括标识一类实例内的一或多个实例字段的位置,所述一或多个标记包括一或多个索引。
54.如权利要求43所述的设备,其中所述处理功能包括标识一类虚拟方法表中的一或多个虚拟方法的位置,所述一或多个标记包括一或多个索引。
55.如权利要求43所述的设备,其中所述处理功能包括标识一类接口方法表内的一或多个接口方法的位置,所述一或多个标记包括一或多个索引。
56.如权利要求43所述的设备,其中所述处理功能包括标识可被输出的一或多个静态公共项的位置。
57.一种资源受限装置,包括存储装置,用于存储一或多个标记,该一或多个标记包括在一资源丰富装置上执行一处理功能的结果;及处理器,被连接至所述存储器并被构成以接收所述一或多个标记;且在所述资源受限装置上使用所述一或多个标记来替代执行所述处理功能。
58.如权利要求57所述的资源受限装置,其中所述处理功能包括标识一或多个静态字段的位置。
59.如权利要求58所述的资源受限装置,其中所述一或多个静态字段包括一或多个内部静态字段。
60.如权利要求58所述的资源受限装置,其中所述一或多个静态字段包括一或多个外部静态字段。
61.如权利要求57所述的资源受限装置,其中所述处理功能包括标识一或多个静态方法的位置。
62.如权利要求61所述的资源受限装置,其中所述一或多个静态方法包括一或多个内部静态方法。
63.如权利要求62所述的资源受限装置,其中所述一或多个静态方法包括一或多个外部静态方法。
64.如权利要求57所述的资源受限装置,其中所述处理功能包括标识一或多个类的位置。
65.如权利要求64所述的资源受限装置,其中所述一或多个类包括一或多个内部类。
66.如权利要求64所述的资源受限装置,其中所述一或多个类包括一或多个外部类。
67.如权利要求57所述的资源受限装置,其中所述处理功能包括标识一类实例内的一或多个实例字段的位置,所述一或多个标记包括一或多个索引。
68.如权利要求57所述的资源受限装置,其中所述处理功能包括标识一类虚拟方法表中的一或多个虚拟方法的位置,所述一或多个标记包括一或多个索引。
69.如权利要求57所述的资源受限装置,其中所述处理功能包括标识一类接口方法表内的一或多个接口方法的位置,所述一或多个标记包括一或多个索引。
70.如权利要求57所述的资源受限装置,其中所述处理功能包括标识可被输出的一或多个静态公共项的位置。
71.如权利要求57所述的资源受限装置,其中所述资源受限装置包括一智能卡。
全文摘要
一个系统将下载的结构中性代码链接到资源受限计算机。该代码可以分离为一个或多个具有一个或多个可标识项的包。该系统将一个或多个可标识项映射为相应的一个或多个标记;相应于运行时间模式对标记排序;将包下载到资源受限计算机;并利用经排序的标记将包链接到一个可执行代码上。
文档编号G06F9/445GK1591338SQ200410048468
公开日2005年3月9日 申请日期2000年2月2日 优先权日1999年2月2日
发明者朱迪思·E·施瓦贝, 乔舒亚·B·舒塞尔 申请人:太阳微电子公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1