用于减少预装类的脚印的系统和方法

文档序号:6416328阅读:242来源:国知局

专利名称::用于减少预装类的脚印的系统和方法
技术领域
:本发明主要涉及一种类预装器,尤其涉及一种用于减少预装的Java类在只读存储器中的大小的系统和方法。一个Java程序包括几个小的软件成分,称为类。每个类包括代码和数据,由各个类文件中的信息来定义。每个类文件根据相同的独立于平台的“类文件格式”来组织。参看图1,示出了类文件格式的方框图,根据该方框图,每个类文件400包括首部信息402、常数存储池404、方法表406和字段表408。首部信息402确认类文件格式、常数存储池的大小、在方法表406中的方法的数目和在字段表408中的字段的数目。常数存储池404是结构表,代表各种串常数、类名、字段名和在类文件结构和其子结构内所参看的其它常数。方法表406包括一个或多个方法结构,其中每个给出了由类显式声明的方法的全部描述和Java代码。字段表408包括一个或多个字段结构,其中每个给出了由类声明的字段的全部描述。字段表408的一个例子现在参看图1B描述。Java程序是在一台包括称为虚拟机(VM)的程序的计算机上执行的,该虚拟机负责执行Java类的代码。习惯上在程序执行中尽可能迟地装载Java程序的类在程序执行中,当第一次引用时,它们根据从网络服务器或从本地文件系统来的命令被装载。VM为不同的成分定位和装载每个类,分析类文件格式,分配内部数据结构,和将其与其它的已装载的类链接。该进程使类中的方法代码容易被VM执行。对于小的和嵌入的系统,类装载需要的设施,诸如网络连接、本地文件系统或其它永久存储器是没有的,希望能够将类预装入只读存储器(ROM)。在美国专利申请序列号No.08/655474(“一种用于在只读存储器中预装类的方法和系统”)中描述了一种预装方案。这里完全地录入,以供参考。在该方法和系统中,在存储器中的代表类、字段和方法VM数据结构是由类预装器离线产生的。然后,预装器输出被链接在包括VM的系统中和放在只读存储器中。这样就不必存储类文件和进行动态类装载。参看图2A,示出了由类预装器产生的VM数据结构1200的更详细的方框图。数据结构1200包括类块1202、多个方法块1204,多个字段块1214和常数存储池1224。类块1202是固定大小的数据结构,可以包括以下信息●类名1230;●指针1232,指向当前类的类块的即时超类;●指针1234,指向方法块1204;●指针1236,指向字段块1214;和●指针1238,指向类的常数存储池。类块数据结构的元素这里被称为类块成员。方法块1204是固定大小的数据结构,代表一种类方法。方法块数据结构的元素这里被称为方法块成员。字段块1214是固定大小的数据结构,代表一种类的实例变量。字段块数据结构的元素这里被称为字段块成员。VM数据结构的每个类型,包括类块1202、方法块1204、字段块1214和常数存储池1224,都具有由对应的数据结构声明定义的格式。例如,单个方法块声明定义了所有方法块1204的格式。数据结构声明也定义了存取器函数(或宏),由VM使用以存取数据结构成员。这些数据结构声明对VM是内部的,不能由类成分使用。现在参看图2B描述现有技术的数据结构声明。参看图2B,示出了数据结构声明1230的描述,其定义了由特定的VM采用的所有数据结构类型的格式。每个声明1230包括一组成员声明1232和用于存取各个成员的存取器函数1234。成员声明1232和存取器函数1234是根据在VM的实施所用的语言的语法,传统地定义的。例如,假定在数据结构声明1230中使用C语言,类属的(genenc)字段数据结构1230.N(图2B中所示)可以被定义为有五个下面的类型的成员和相应的存取器函数的结构T成员名成员类型存取器函数member1mtype1(T)的mem1T->member1member2mtype2(T)的mem2T->member2member3mtype3(T)的mem3T->member3member4mtype4(T)的mem4T->member4member5mtype5(T)的mem5T->member5在该例子中,成员类型可以是由相关的计算机语言定义的任何类型,包括用户定义的类型或语言类型,诸如整型、浮点型、字符型或双精度型。存取器函数是由VM使用的宏,以存取字段,而无需直接存取包含该字段的结构。例如,替代采用表达式“T->member1”,以存取结构类型T中的字段1,VM仅需要采用表达式“(T)的mem1”。存取器函数在诸如C的程序语言中是众所周知的,它能够提供复杂的数据结构。用于存储“类元数据”(即,类、方法和字段块1202、1204、1214)的内部数据结构,需要只读存储器中大的固定量的空间。实际上,测量显示这种类元数据常常比类方法本身的字节代码占据更多的空间。这些内部数据结构因而常常不适用于小的资源受限的装置,在这些装置中类预装是想要的和/或必须的。另外,如果内部数据结构被单个修正,以节约存储空间,VM代码将需要被大范围地修改,以便使VM能够正确地存取修正的数据结构。对VM做这样的变化是艰巨的和低效的。因而,需要修正内部数据结构,它比现有技术的数据结构要小,且包括VM需要的所有信息,不需要VM代码的大范围的或艰巨的修正。总的来说,本发明是一种减少预装Java类所需的ROM空间的方法和系统。特别地,本发明的方法和系统的根据是,在JavaVM类被预装的环境中,很可能VM应是一个封闭的系统,具有一组类和类成分,诸如字段和方法。这样的封闭的VM应包括固定数目的内部数据结构,诸如类块、方法块和字段块。另外,这些数据结构的每个成员(例如,方法块或字段块成员)应有已知组的各异值之一。在这一假设及其推论下,本发明减少了需要的存储空间,用下面的方法表示内部数据结构1)确定每个数据结构成员的类型的各异值;2)确定每个数据结构成员类型的出现(例如,在方法块中字段块成员类型的每次出现)和每次出现的值;3)确定如果每次出现用数据结构成员类型的值表的索引表示而不是用传统的方式(在通用变量中存储每次出现的值)表示所节省的存储空间;4)如果结果是节省了足够的空间,那么分配包含各异数据结构成员类型值的值表,用合适的值表入口的索引构造该字段块成员类型的每次出现;和5)产生新的源给VM,这样其对修正的结构的存取被自动适应。在一个优选实施例中,如果下面的比较为真,就决定用值表索引和值表来表示数据结构成员类型(#类型的出现次数)×(索引的大小)+(值表的大小)<(#类型的出现次数)×(通用变量的大小)一旦本方法已经确定,对于每个数据结构成员类型,该类型的出现是用值表的索引来表示,还是用存储值的通用变量来表示,那么本方法发出该类型的合适的信息,包括存取器函数,语言声明和初始化值表的源代码。存取器函数是宏,通过它,所有的运行时的对数据结构成员的存取由VM完成。最好是,在发出上述信息之前,本方法确定值表索引、传统的成员表示法和值表的最紧密的安排,相应地产生值表、值表索引,存取器函数和类。本方法在确定是否修正数据结构成员的传统表示法之后,发出存取器函数,声明和其它数据结构信息。结果是,所有发出的数据结构信息与在内部类表示法中的变化一致。这种一致的数据结构信息的自动产生使VM的改变最小化,这一点在新类加入VM和类表示法改变的任何时候都是需要的。这一点是对现有技术的重大改进。本发明的系统包括类文件、实现了上述方法的Java类预装器和由预装器产生的输出文件的集合,该文件包括预装类、首部文件和源代码文件。类文件定义了要预装的类的完整的组。预装器在类文件上执行第一通路(pass),以确定内部数据结构的成员的不同类型,每个类型成员的各异值,存储这些值需要的空间量,值索引的大小,和每个成员类型的出现的次数。预装器然后在类文件和内部数据结构上执行第二通路,以确定每个成员要如何表示,是用传统的方式还是用值表入口的索引,然后发出合适的输出文件。输出文件和由传统的Java系统采用的类似文件是兼容的。就是,预装类可以被装配或编辑到类对象数据中,首部文件和源文件可以用VM被编辑到VM对象数据中。VM和类对象数据然后可以被以传统的方式链接到特定Java环境的可执行的VM中。通过参照附图的以下详细描述和所附权利要求,本发明的其它目的和特点将更加清楚,附图中图1示出了现有技术和本发明的公共的类文件格式;图2A是在现有技术中所用的VM内部数据结构的方框图,该数据结构是为了编码类、方法和字段信息;图2B是示出定义图2A所示的VM内部数据结构的格式的数据结构声明;图3是分布计算机系统的方框图,其中本发明的类预装器方法和系统可以被实现;图4是在图1的分布计算机系统中的执行引擎的方框图,其中,由图3的类预装器产生的预装的类被装载入ROM;图5是示出用于产生预装的可执行模块的进程成分的流程图;图6是示出用于减少预装的可执行模块的存储脚印(footprint)的进程成分的流程图;图7A示出更新的图6的首部文件614的组织;图7B示出图6的值表616的组织;图8A示出根据本发明在执行引擎ROM208中分配后同一成员的出现和值的组织;图8B示出根据现有技术在执行引擎ROM208中分配后同一成员的出现的组织;图9A示出了具有由本发明产生的五个成员的数据结构实例的紧密组织;图9B示出了由现有技术产生的图9A的数据结构实例的组织;图10是流程图,示出了由类预装器使用的方法,以建立在预装类中使用的内部数据结构;和图11是示出预装的应用程序映射到只读存储器和随机访问存储器中和指示由静态类启动程序映射到随机访问存储器的方法和数据的部分的装载的方框图。这里描述的方法和系统是针对Java类预装器的。该Java类预装器被构造成输出预装Java类,该Java类被优化以存储在目标计算机(这里被称为执行引擎)的ROM中。假若执行引擎可能是有很少或没有辅助存储器的计算机,最好Java类预装器在独立的计算机中实现,该计算机这里被称为服务器。假定这种结构,预装的类可以从服务器以各种方式(例如,网络连接、直接通信链接或可读媒体如软盘或CD的“寄生者网络”传递)传递到执行引擎。相应地,这里描述的本发明的优选实施例是针对有服务器和执行引擎的计算机系统的,其中预装的类由服务器产生,随后被传递到执行引擎以用于VM中。现在参看图3和4描述优选实施例。参看图3,示出了分布计算机系统100,本发明在其中实现。计算机系统100有一个或多个执行引擎102和一个或多个服务器计算机104。在优选实施例中,每个执行引擎102经因特网106连接到服务器104,尽管也可以使用计算机102、104之间的其它类型的通信连接(例如,网络连接、直接通信链接或可读媒体如软盘或CD的“寄生者网络”传递)。最好是,服务器和执行引擎是桌面计算机,诸如Sun工作站,IBM兼容机和/或苹果Macintosh计算机;然而,实际上任何类型的计算机都可以是服务器或执行引擎。另外,该系统不限于分布计算机系统。它可以在各种计算机系统中和在紧密连接的处理器的各种结构、或者模型中或者在松散连接的微处理器系统的各种结构中实现。服务器计算机104一般包括一个或多个处理器112、通信接口116、用户接口114和存储器110。存储器110存储●操作系统118;●因特网通信管理器程序或其它类型的网络存取过程120;●编辑器122,用于将用Java程序语言写的源代码翻译为字节代码流;●源代码仓库124,包括一个或多个包含Java源代码的源代码文件126;●类文件仓库128,包括一个或多个独立于平台的类文件130和一个或多个包含类文件的类库131,每个类文件包含代表特定类的数据;●类预装器132,产生一组预装类148,用于执行引擎的特定结构(类预装器有时称为静态类装载器);●装配器134,产生链接器可识别的格式的代表类成员的对象文件,类数据结构和存储器指示器;●链接器136,用于确定一组预装类的存储布局和解决所有的符号引用;和●一个或多个数据文件146(包括预装类148),由服务器使用。注意类文件仓库128、类预装器132、装配器134、链接器136不需要驻留在服务器104上,但是可以在任何其输出(例如,代表预装类148的文件和消息)可以被拷贝到执行引擎102的计算机上。参看图4,执行引擎102可以包括一个或多个处理器202、通信接口206、用户接口204、只读存储器208和随机访问存储器210。只读存储器208存储没有未解决的引用的程序方法和在程序运行中保持常量的程序数据。在优选实施例中,在ROM208中存储的方法和数据包括Java应用程序212的部分和执行引擎的支持过程。执行支持过程包括操作系统213、网络存取过程214、预装类232和由预装类232使用的内部数据结构1200(图2)。随机访问存储器210存储●Java应用程序215的第二部分和支持过程216、217,包括有未解决的引用的方法和在应用程序的执行中改变的数据;和●一个或多个数据文件228,执行引擎在其进程中可能利用。参看图5,示出了一个流程图,表示用于产生预装的可执行模块的步骤的顺序。应该注意这里所述的方法和系统属于预装一Java应用程序和其它支持过程。任何Java应用程序或者任何其它系列的在运行时间中正常链接的方法可以用这里所述的方法和系统预装。包括Java应用程序的每个类的源代码126,由编辑器122编辑进入类文件130,类文件130是独立于平台的类的表示法。如图1中所述,类文件包含字段和方法表、每个方法的字节代码、常数数据和其它信息。或者,对应于应用程序的类文件可以已经驻留在一个或多个类库131中。整个组的类文件128构成预装的应用程序,被传送到类预装器132。类预装器的工作是为执行引擎102(图4)产生预装类148。预装类148包括参考图2描述的类块1202、方法块1204、字段块1214和常数存储池1224。在其它物件中,类预装器132确定哪个与每个类130相关的方法和字段可以被存储在只读存储器208中,哪个必须存储在随机访问存储器装置210中。例如,调用Java接口或利用非静态实例变量的方法需要驻留在随机访问存储器中。这是因为实现接口的字节代码在运行时间确定,对于每个相关的类的实例化,非静态实例变量是变化的。在代码被装载入执行引擎ROM208时,类预装器132也执行许多优化,以便产生更紧密可执行代码的内部表示法。例如,类预装器132结合与每个类相关的常数存储池,以便去除在类常数存储池310的内部表示法中的冗余。根据本发明,类预装器132也修正内部数据结构1200(图2A),以便在执行引擎102的ROM中占据较少的空间。本发明的一个优点是该数据结构优化使内部表示法大大摆脱了现有技术中所用的的低效标准数据结构格式1200。预装类148被传送到装配器或编辑器134,编辑器134产生具有链接器136需要的格式的对象模块304,以便将数据映射到合适的地址空间。最好是有两个地址空间,一个用于随机访问存储器装置,另一个用于只读存储器装置。然后对象模块304被传送到链接器136,链接器136为应用程序中的类产生存储布局。一旦确定了存储布局,链接器136就解决所有的符号引用,并用直接地址取代它们。存储布局被分区为两个地址空间。只读存储器标志(flag)的方法和字段包括在第一地址空间中,随机访问存储器中标志为需要的存储器的方法和数据包括在第二地址空间中。链接器136的输出是预装的可执行模块306,可执行模块306包含这两个地址空间的方法和数据。现在参考图6描述本发明的进程流。参考图6,示出了本发明采用的进程的数据流图,目的是减少由VM使用的内部数据结构的存储脚印。如已参考图3所描述的,类预装器132从类文件128产生一组特定平台的预装类148。预装类148是数据结构声明,可以在装配器源中声明或由高级语言声明。装配器134或编辑器122然后将这些数据声明转化成对象数据622。类预装器132也确定组成预装类232的内部数据结构1200的最有效的表示法。在优选实施例中,内部数据结构的一个成员可以用两种方法之一来表示1.作为一种类属的记忆字(genericmemoryword)(例如,32位),该记忆字是成员的值;或2.作为各异值的表的索引,每次成员出现时该值可以被成员采用。第一种表示法仅是在现有技术的类预装器的数据结构中所用的表示法。当特定成员仅有几个不同值而存在成百上千次的出现时,该表示法是很低效的。在该情况下,即使仅存储几个不同的值,全宽的记忆字(例如,32位宽)也被分配给每次出现,在ROM208中占据了成千个字的难得的存储空间(scarcestorage)。本发明采用的第二种表示法解决了该问题。它产生一个值表616,以保持这样成员的有限的值,它为成员的每次出现产生一个索引,该索引只有寻址所有的值表入口所需要的那么多位。第二种表示法的优点是,当应分配给特定成员类型的索引和值表的存储器小于类属的表示法需要的被分配的存储器时,第二种表示法是有利的。参看图10,下面描述本发明确定的方法如何编码成员数据结构。一旦确定如何表示这些成员,类预装器132为要以索引+表的格式表示的每个成员输出更新的首部信息614(包括修正的成员声明和能够使VM246存取修正的成员信息的存取器函数)和相应的值表616。作为源代码产生的首部信息614和值表616,与虚拟机源618一起由编辑器122编辑。虚拟机源618定义了要在执行引擎102中执行的虚拟机。链接器136链接导出的对象数据620和对象数据622,以产生预装的可执行模块306,预装的可执行模块306可以被装载入执行引擎102。本发明的一个副产品是,无论何时新类或成员要被加入预装类148中时,必须产生新的VM246。这是因为对应的首部信息614和值表616必须和VM源618一起被编辑。然而,因为本发明自动产生任何组的类的首部信息614和值表616,所以产生新VM不需要或需要最少的VM代码的改变。这是因为VM246总是利用存取器函数,存取器函数是首部信息614的一部分。这样,本发明能够产生有效的数据结构成员的表示法,同时使VM的产生容易。类预装器132能够产生有效的索引/表成员表示法,因为成员的所有可能值是已知的。作为结果,每个索引需要的位的数目也是已知的。每个成员的出现数目也是已知的。另外,优选实施例假定,类文件128代表要被预装入目标执行引擎102的全部组的类。这一假定特别适用于执行引擎102,该执行引擎102是小的手持计算机,不可能有计算功率和/或通信带宽,以用传统方式在空中下载类。假定索引的数目和值是已知的,且没有可能性加入附加的成员或类,那么当由执行引擎102分配时,对于类预装器132,有可能安排索引具有最佳的紧密的或近似最佳的安排。类预装器132通过在更新的首部信息614中选择索引的次序,实现这一层次的紧密性。参看图7A和7B,示出了更新的首部信息614和值表616的组织,以及每个数据结构的特定例子。这些例子表示了对应于图2B的数据结构声明1230.N的由类预装器132产生的输出。图7A中所示的更新的首部信息614包括一组数据结构声明702,其每个可以以任何结合的方式包括更新的成员声明704和未更新的成员声明706。每个数据结构声明702对应于由VM246使用的数据结构之一。更新的成员声明704是用于已经由类预装器132修正的数据结构成员作为索引/表成员,未更新的成员声明706是用于类预装器132确定的数据结构成员,最好用类属的方式表示。每个数据结构声明702与更新的成员表声明708、更新的成员存取器函数710和未更新的成员存取器函数712相联系。每个更新的成员表声明708与对应的值表616相联系,以合适的程序语言声明该表。更新的成员存取器函数710用在相应的更新的成员表声明708中定义的表名,为更新的(即,索引/表)成员定义存取器函数。未更新的成员存取器函数712和由传统的类预装器132产生的是一样的。例如,图7A示出更新的首部文件信息614,用于图2B的数据结构1230.N(StructT)。该例子假定类预装器132确定1)member1有400个值,最好以索引/表成员来表示,2)member2最好传统地表示,3)member3有200个值,最好以索引/表成员来表示,4)member4有1500个值,最好以索引/表成员来表示,和5)member5最好传统地表示。结果是,类预装器132已经产生一修正的“StructT”声明704,其中member1以9位整数索引ml_idx(9位足够存取400个值)表示,member3以8位整数索引m3_idx(足够存取200个值)表示,member4以11位整数索引m4_idx(足够存取1500个值)表示。其它成员,member2和member5分别留下不修正,作为类型mtype2和mtype5的类属成员。类预装器132也已经产生member1的更新的成员表声明708,表明member1的值存储在类型member1的值表(member1_value[])中。member1_value表被声明为外部变量(extem),告诉编辑器122表的实际值定义在另一文件中,在此例中,是在值表文件616中。为member3和member4产生相似的更新的成员表声明708。更新的member1的存取器函数710相应地修正,这样每次相应的存取器函数(T)的member1被调用时,存取预装的方法的VM246使用member1值(即,9位m1_idx)作为member1_value表的索引。更新的member3和member4的存取器函数710以相似的方式被修正。参看图7B,示出了值表616的表示法,包括表722.1,定义了可以被在首部文件614中声明的member1_value表采用的有限值。在该情况下,member1_value表被定义为常数数列(“constmtypememeber1_value[]”),包括400个值val1,…,val400。也提供了类似的member3和member4的值表的表示法(例如,在member3和4表722.3,722.4中)。参看图8A,示出了本发明的内部数据结构(具体说,单个成员类型的成员出现(occurrence)802和值表806)在执行引擎ROM208中的组织方式。每次发生表示在预装类中同一成员802和拥有其的数据结构类型805的一次出现(数据结构类型805可能包括多个成员,见图2B)。假定一个特定成员有N个各异的值808,存储在值表806中,该成员的M次出现802的每一次被分配为到值表806的入口的宽(|log2(N)|+1)位的索引804,该值表806保持了成员的值。例如,出现802.1和802.6的每个都是到值表806.N的索引。该入口806.N存储了与那些成员出现相关的有限值808.N。这样,该模型的整个存储使用量是每成员M×(|log2(N)|+1)+value_table_size位。参看图8B,示出了现有技术在特定成员的执行引擎ROM中组织出现852的方式。出现852的每一个表示在预装类中特定成员的一次出现。该成员的M次出现852的每一次被分配为全宽记忆字,该全宽记忆字存储了该成员这次出现的值854(即,这些出现的每个都以上述第一格式来表示)。这样,该模型的整个存储使用量是M×32位(假定32位记忆字)。结果是,当M×(|log2(N)|+1)+value_table_size小于M×memory_word_size(例如,M×32)时,本发明节省了在数据结构中分配给特定成员的存储器。如图8A的例子中,字段802可能正是数据结构声明中的一个元素。参看图9A,示出了本发明的类预装器132如何在执行引擎ROM中有效存储特定数据结构902的所有成员802(例如,图2B的StructT1230.N的结构的成员)的例子。通常,本发明封装存储的值(即,索引804),这样它们占据了尽可能多的固定长度记忆字。在所述的情况下,记忆字是32位宽,但是本发明适用于任何长度的记忆字。在图9A中所示的例子中,StructT902的9位、8位和11位成员m1、m3和m4被封装入单个的32位记忆字。成员m2和m5的值,用传统的方式表示(例如,作为32位值),被存储在跟着第一个字的相应的32位通用变量中。在优选实施例中,这些传统地表示的成员必须被统一为字的范围(例如,每个成员32位)。对于修正的成员没有这一要求。因而,对于每个数据结构实例,在第四个成员m4和第一个通用变量m2之间仅有4位的未用空间904。类预装器132目的在于,对给定的任何成员表示法和成员大小的结合,将内部数据结构的成员尽可能有效地封装在记忆字中。参看图9B,示出了图解由现有技术类预装器存储的同一数据结构StructT的格式。注意,在该系统中,数据结构需要5个字以存储5个成员。这样,现有技术远比本发明(仅需3个字以存储同样的数据结构信息)低效。现在参看图10描述本发明的方法。这一安排不会给存取器函数的预装类的使用带来问题,由于索引804的不同的存储位置由编辑器122解决且索引本身存储了它们的相关值808的索引。参看图10,示出了在类预装器132中实现的本发明的方法的流程图。本方法的实现有两条通路,包括一条记帐通路(由1104所标的方框表示)和数据结构声明产生通路(由其余的步骤表示)。作为第一记帐步骤(对所有内部数据结构执行),类预装器132识别内部数据结构的所有成员类型(1106)。例如,参看图2B,StructT的五个成员是数据结构的成员类型。类预装器132然后对于每个成员类型执行以下进程识别成员类型的M个出现(1108);识别M次出现的N个值(1110);确定存储每个值所需要的存储空间(1112);确定存储可以寻址N个值的一个索引所需要的存储空间(索引必须至少是|log2(N)|+1位)(1114);确定成员出现的传统表示法的大小(1116)。该进程在进行以方框1118开始的步骤之前,对所有内部数据结构的所有成员执行。该进程次序较好,由于在方框1104中由过程产生的记帐统计数字被随后的第二通路步骤使用。通常,暂时存储记帐统计数字,以用于第二通路。一旦所有的统计数字已经产生,类预装器132为每个成员类型计算传统的成员出现的表示法所需的存储空间(LHS)(1120);和新型的每个成员出现作为值表的索引的表示法所需的存储空间(RHS)(1122)。类预装器132按下式计算步骤1120中的LHS值LHS=(传统表示法的大小)×出现的次数=(传统表示法的大小)×M位。类预装器132按下式计算步骤1122中的RHS值RHS=(成员值的大小)×出现的次数+值表的大小=(成员值的大小)×M+M×(|log2(N)|+1)位。如果RHS小于LHS(1124-Y),类预装器132表示成员类型为值表和索引(1126)。如果RHS不小于LHS(1124-N),类预装器132将传统地表示成员类型(1128)。类预装器重复步骤1120、1122、1124、1126、1128,同时,其它成员保留以待处理(1124-N)。一旦每个成员已经被处理(1124-Y),类预装器132执行数据结构声明产生过程1130。在该过程中,对于每个数据结构,类预装器132确定数据结构成员的最佳次序(1132)。进程次序及其考虑因素已经参看图9A描述了。类预装器132然后根据最佳次序产生成员首部信息614和值表616(1134)。首部信息614和值表616的产生已经参看图7A和7B描述。参看图11,预装的可执行模块和引导时间启动程序1320永久地存储在执行引擎计算机的只读存储器中。每次执行引擎计算机被通电或重新引导时,引导时间启动程序1320自动执行。在其它的任务中,引导时间启动程序在执行中,拷贝必须驻留在随机访问存储器中的所有方法和数据,到由链接器指定给它们的随机访问存储器位置。尽管这里描述的方法和系统是参照Java程序语言描述的,本发明适用于使用利用类的动态运行时间装载的其它面向对象类的计算机系统。另外,本发明适于在除了诸如随机访问存储器的存储装置之外的各种类型的可执行媒体上执行。其它类型的可执行媒体可以被使用,诸如,但不限于,可读计算机存储媒体,可以是任何存储装置、光盘或软盘。前述方法和系统已经就执行类属的Java应用程序进行了描述,它适用于任何Java应用程序。例如,本发明可被用于趋向运行在手持计算机上的Java编码的个人信息管理器使用的预装类。另外,Java应用程序可不必运行在分布的环境中,它可以运行于在执行引擎或服务器计算机中执行的单机模式下,而无需从外部系统输入新类。尽管本发明已经参考几个特定实施例进行了描述,但该说明是本发明的示例,不是想要解释为限制本发明。在不脱离本发明的精神和范围的情况下,本领域的技术人员可以进行各种修正,本发明以所附权利要求及其等效物的全部范围来限定。权利要求1.一种用于减少要加入到运行时的环境中的预装类的存储器脚印(memoryfootprint)的方法,包括以下步骤确定在一个或多个用于定义多个预装类的类文件中表示的数据结构的类型,每个数据结构类型包括一个或多个成员;确定可以由每个成员采用的各异的值;为至少一个子组成员存储所述的每个值,以减少包括所述的预装类的相应的内部数据结构的大小;产生一组值索引,用于寻址在存储步骤中存储的值;产生存取器函数和成员声明,能够使运行时的环境使用用所存储的值和所述组的值索引表示的所选择的成员。2.一种用于减少要加入到运行时的环境中的预装类的存储器脚印的系统,包括一组类文件;和一个类预装器,构造成从所述的类文件产生一组预装类和多个内部数据结构声明,该结构声明使所述的预装类在存储器中分配时其大小最小化;所述类预装器构造成产生内部数据结构声明,以使每一组所选择的数据结构成员都用存储结构的索引来表示,所述存储结构保持了所选择的数据结构成员的各异值。3.一种计算机程序产品,用于在计算机系统中减少要加入到运行时的环境中的预装类的存储器脚印,在执行引擎上执行,该计算机程序产品包括计算机可读存储器媒体和嵌入其中的计算机程序机构,所述的计算机程序机构包括一个类预装器,构造成从一组类文件中产生所述预装类和多个内部数据结构声明,所述结构声明使所述的预装类在执行引擎的存储器中分配时其大小最小化;所述类预装器构造成产生内部数据结构声明,以使每一组所选择的数据结构成员都用存储结构的索引来表示,所述存储结构保持了所选择的数据结构成员的各异值。4.一种运行时的环境,从一预装类的集合中建立,所述预装类由一个或多个内部数据结构类型来定义,每个内部数据结构类型包括一个或多个成员,所述运行时的环境包括一存储结构,保持了可以被至少一个子组的成员采用的各异值;和一存储结构入口的索引,该存储结构入口保持了所述的子组的成员的各个成员的各异值,用所述的各异值作为所述的各个成员的每次出现;这样,运行时的环境在必要时通过在由所述索引定义的位置提取所述存储结构的内容,来确定所述的各个成员的各异值。5.如权利要求4所述的运行时的环境,其中所有的所述的各异值是已知的,并且使用能够索引所有与所述各个成员相关的各异值的最少位,来实现所述存储器结构入口的索引。6.一种方法,用于将要在执行引擎上执行的要加入到运行时的环境中的预装类来装载所述的执行引擎,包括下载所述预装类到所述的执行引擎,所述预装类包括构成所述预装类的多个内部数据结构声明,以使每一组所选择的数据结构成员都用存储的所选择的数据结构成员的各异值的索引来表示,所述选择的组使所述预装类在所述执行引擎的存储器中分配时其大小最小化。7.如权利要求6所述的方法,其中所述预装类在因特网上下载。8.如权利要求6所述的方法,还包括将所述预装类分配在所述的执行引擎的存储器中。9.一种方法,用于产生和装载要由客户执行的要加入到运行时的环境中的预装类到客户,以便在所述客户上执行,包括在服务器上产生所述预装类,该预装类包括构成所述预装类的多个内部数据结构声明,以使每一组所选择的数据结构成员都用存储结构的索引来表示,所述存储结构保持了所选择的数据结构成员的各异值,所述选择的组使所述预装类在所述客户的存储器中分配时其大小最小化;和下载所述预装类到所述的客户。10.一种用于减少要加入到运行时的环境中的预装类的存储器脚印的方法,包括以下步骤确定可以由构成所述预装类的内部数据结构的成员采用的各异的值;为至少一个子组的成员存储所述的每个值,以减少所述的内部数据结构的大小;和用子组成员的每次出现的值的索引取代该每次出现,使该每次出现的值能够经所述索引被提取。11.一种系统,用于减少要加入到运行时的环境中的预装类的存储器脚印,包括一个类预装器,构造成产生一组内部数据结构声明,所述声明使所述的预装类在存储器中分配时其大小最小化,所述内部数据结构声明声明构成所述的预装类的内部数据结构;所述类预装器构造成产生所述内部数据结构声明,以使每一组所选择的数据结构成员都用存储结构的索引来表示,所述存储结构保持了所选择的数据结构成员的各异值。全文摘要一种减少由运行时引擎为内部数据结构分配的ROM空间的方法和系统。内部数据结构存储应用程序使用的预装类的成员信息。该系统确定类中表示的内部数据结构的类型,识别每类成员的可能值。该系统还确定在值表中存储每个类型的值所需的空间量和索引该表的每个进入所需的位数。该系统确定成员的出现是用一组值表索引和值表表示,还是用传统方式表示。该确定取决于通用变量大小、成员出现次数、每个索引需要的存储器和值表的大小。文档编号G06F9/54GK1229944SQ99104169公开日1999年9月29日申请日期1999年3月22日优先权日1998年3月20日发明者川原秀也,内蒂姆·弗雷斯科申请人:太阳微系统有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1