專利名稱::用于進行靜態(tài)初始化的方法和系統(tǒng)的制作方法
技術(shù)領(lǐng)域:
:本發(fā)明一般涉及數(shù)據(jù)處理系統(tǒng),特別涉及用于進行靜態(tài)初始化的方法和系統(tǒng)。JavaTM描述用于產(chǎn)生和運行平臺無關(guān)代碼的編程語言和編程環(huán)境。這種平臺無關(guān)代碼在JavaTM虛擬機上運行,這是一種解釋平臺無關(guān)代碼的抽象計算機JavaTM虛擬機在Lindholm和Yellin的文章“TheJavaVirtualMachineSpecification”,Addison-Wesley(1997),中詳細說明了,該文在此引為參考。Java虛擬機不專門識別JavaTM編程語言或任何其它編程語言;相反,Java虛擬機只識別特定的文件格式,類文件格式。類文件包含構(gòu)成平臺無關(guān)代碼的Java虛擬機指令(或字節(jié)代碼)。作為運行Java程序的一部分,開發(fā)人員經(jīng)過若干步驟,如圖1所示。首先,開發(fā)人員編制計算機程序(步102)。一般地說,開發(fā)人員已經(jīng)用高級語言例如Java編程語言開發(fā)了包含源碼的計算機程序,并調(diào)用JavaTM編譯程序?qū)Υa進行編譯。Java編譯程序是可從加利弗尼亞州MountainView市的SunMicrosystems公司得到的JavaTM軟件開發(fā)包的一部分。Java編譯程序輸出一個或幾個含有適合于在Java虛擬機上執(zhí)行的字節(jié)代碼的類文件。每個類文件含有一種Java編程語言,可以是一個類或一個接口。類文件格式在“TheJavaVirtualMachineSpecification”pp.83-137中詳細說明了。雖然類文件格式是健壯的文件格式,但是其不能命令虛擬機有效地靜態(tài)初始化一個數(shù)組,因而便提出了一個問題,詳述如下。在編譯程序之后,開發(fā)者把在步102輸出的類文件通過使用預加載程序(步104)統(tǒng)一成一個文件,叫做.mclass文件。預加載程序也從SunMicrosystems公司得到,其用于鏈接類文件并進行預處理以便于類文件的執(zhí)行。在統(tǒng)一類文件之后,開發(fā)者將.mclass文件加載在虛擬機中(步106)。在本步中,Java虛擬機在存儲器中存儲.mclass文件,并通過讀出字節(jié)代碼并對其進行處理和執(zhí)行來解釋包含在.mclass文件中的字節(jié)代碼。直到字節(jié)代碼的解釋被完成,.mclass文件才存儲在存儲器中。由Java虛擬機識別的字節(jié)代碼在“TheJavaVirtualMachineSpecification”pp.151-338中更清楚地說明了。如上所述,類文件格式不能命令虛擬機靜態(tài)地初始化數(shù)組,為了解決這個問題,JavaTM編譯程序產(chǎn)生一個特定的方法,<clinit>,用于進行類初始化,包括靜態(tài)數(shù)組的初始化。靜態(tài)數(shù)組初始化的一個例子如下代碼表#1staticintsetup[]={1,2,3,4};在本例中,數(shù)組“setup”包括要被靜態(tài)初始化為1,2,3,和4的4個整數(shù)。已知靜態(tài)初始化,JavaTM編譯程序便產(chǎn)生<clinit>方法,該方法在功能上按照下述的偽碼進行靜態(tài)初始化代碼表#2temp=newint[4];temp=1;temp[1]=2;temp[2]=3;temp[3]=4;this.setup=temp;如上述代碼表所示,僅僅描述<clinit>方法在功能上便需要許多語句。不過,更重要的是,由字節(jié)代碼進行的<clinit>方法的實際處理需要更多的語句。這些字節(jié)代碼控制產(chǎn)生所需的靜態(tài)初始化的堆棧。堆棧是由在Java編程環(huán)境下的方法使用的存儲器的一部分。對于由上述的示例的靜態(tài)初始化的<clinit>方法進行的步驟以字節(jié)代碼表示如下代碼表#3Methodvoid<clinit>()0iconst_4//整數(shù)值4入棧1newarrayint//建立新整數(shù)數(shù)組并入棧3dup//復制棧頂4iconst_0//整數(shù)值0入棧5iconst_1//整數(shù)值1入棧6iastore//數(shù)組下標0處存17dup//復制棧頂8iconst_1//整數(shù)值1入棧9iconst_2//整數(shù)值2入棧10iastore//數(shù)組下標1處存211dup//復制棧頂12iconst_2//整數(shù)值2入棧13iconst_3//整數(shù)值3入棧14iastore//數(shù)組下標2處存315dup//復制棧頂16iconst_3//整數(shù)值3入棧17iconst_4//整數(shù)值4入棧18iastore//數(shù)組下標3處存419putstatic#3<Fieldfoobar.setup[I>//根據(jù)棧中新數(shù)組修改設(shè)定數(shù)組22return雖然使用<clinit>方法為JavaTM編譯程序提供一種方式命令虛擬機初始化一個靜態(tài)數(shù)組,但是用于初始化數(shù)組所需代碼的數(shù)量是數(shù)組大小的許多倍,因而需要大量的存儲器。因此,需要改進靜態(tài)初始化方法。所公開的系統(tǒng)代表對常規(guī)的用于初始化靜態(tài)數(shù)組的系統(tǒng)的一種改進,其中減少了由虛擬機為靜態(tài)地初始化數(shù)組而執(zhí)行的代碼的數(shù)量。為實現(xiàn)這種減少,當統(tǒng)一類文件時,預加載程序識別所有的<clinit>方法,并模擬執(zhí)行(“假裝執(zhí)行”)這些方法,以便確定由這些方法執(zhí)行的靜態(tài)初始化。然后,預加載程序產(chǎn)生一個表示由<clinit>方法進行的靜態(tài)初始化的一個表達,并把該表達存儲在.mclass文件中,用于代替<clinit>方法。這樣,包含許多指令的<clinit>方法的代碼被一個命令虛擬機進行靜態(tài)初始化的表達所代替,因而節(jié)省大量存儲器。虛擬機被修正,以便識別這一表達,并對數(shù)組進行合適的靜態(tài)初始化。本發(fā)明的方法在處理部件上接收要被運行的代碼,以便進行操作。然后該代碼在存儲器上被模擬執(zhí)行,而不在處理部件上運行該代碼,以便識別該操作,看該代碼是否已被處理元件執(zhí)行。此后,對處理元件產(chǎn)生一個指令,以便執(zhí)行這種操作。本發(fā)明的一種數(shù)據(jù)處理系統(tǒng)包括輔助存儲裝置,存儲器和處理器。輔助存儲裝置包括具有靜態(tài)初始化數(shù)據(jù)結(jié)構(gòu)和類文件的源碼的程序,其中一個類文件含有靜態(tài)初始化數(shù)據(jù)結(jié)構(gòu)的<clinit>方法。存儲器含有編譯程序,用于對程序進行編譯并產(chǎn)生類文件和用于統(tǒng)一類文件的預加載程序,用于模擬執(zhí)行<clinit>方法,從而確定<clinit>方法進行的靜態(tài)初始化,并產(chǎn)生用于執(zhí)行靜態(tài)初始化的指令。處理器運行編譯程序和預加載程序。圖1是當在JavaTM環(huán)境下開發(fā)一個程序時執(zhí)行的步驟。圖2是本發(fā)明的數(shù)據(jù)處理系統(tǒng)。圖3是由圖2說明的預加載程序執(zhí)行的步驟流程圖。本發(fā)明的系統(tǒng)和方法提供一種改進的系統(tǒng),用于通過利用一個或幾個指令代替代替<clinit>方法,在JavaTM編程環(huán)境下初始化靜態(tài)數(shù)組,其中所述指令當被虛擬機讀取時,除去使用數(shù)量少得多的存儲器和少得多的時間之外,使虛擬機進行和利用<clinit>方法進行的相同的靜態(tài)初始化。結(jié)果,這種系統(tǒng)和方法在靜態(tài)初始化數(shù)組時,可以大大減少存儲器的利用。本發(fā)明的系統(tǒng)和方法通過在預加載程序中進行某種處理而消除了對<clinit>方法的需要。尤其是,預加載程序接收類文件,用于統(tǒng)一并掃描它們,尋找<clinit>方法。當預加載程序找到<clinit>方法時,便相對于存儲器模擬執(zhí)行(“假裝執(zhí)行”)<clinit>方法,以便確定如果由Java虛擬機解釋則<clinit>方法對于存儲器應當具有的影響。即,預加載程序模擬執(zhí)行<clinit>方法,以便識別假如由JavaTM虛擬機執(zhí)行<clinit>方法進行靜態(tài)初始化而得到的結(jié)果。在識別這一靜態(tài)初始化之后,預加載程序產(chǎn)生一個或幾個指令(或指示),以便進行和<clinit>方法相同的初始化,并向Java虛擬機輸出這些指令,因而代替<clinit>方法。然后,在運行時間,由Java虛擬機讀出這些指令,使Java虛擬機進行和使用<clinit>方法時相同的靜態(tài)初始化。所述指令需要的存儲空間比<clinit>方法少得多。例如,在上述代碼表#3描述的字節(jié)代碼被減少為下面在.mclass文件內(nèi)包含的指令,其指示4個整數(shù)的數(shù)組具有初始值1,2,3,和4CONSTANT_ArrayT_INT41234示例的實施例的虛擬機識別這一表達,并把數(shù)組靜態(tài)初始化為合適的值。結(jié)果,示例的實施例在初始化靜態(tài)數(shù)組時比常規(guī)的系統(tǒng)占用的存儲器少。圖2說明構(gòu)成本發(fā)明的數(shù)據(jù)處理系統(tǒng)200。數(shù)據(jù)處理系統(tǒng)200包括和因特網(wǎng)204相連的計算機系統(tǒng)202。計算機系統(tǒng)202包括存儲器206,輔助存儲器裝置208,中央處理單元(CPU)210,輸入裝置212,和視頻顯示器214。存儲器206進一步包括JavaTM編譯程序218,JavaTM預加載程序220和JavaTM運行時系統(tǒng)221.JavaTM運行時系統(tǒng)211包括JavaTM虛擬機222。輔助存儲器裝置208包括具有源碼的程序224,不同的類文件226,以及。mclass文件228.JavaTM編譯程序218把程序224編譯成一個或幾個類文件226。然后,預加載程序220接收類文件226,并產(chǎn)生代表所有這些類文件的統(tǒng)一化的.mclass文件228。在統(tǒng)一之后,.mclass文件228可在虛擬機222上運行。本發(fā)明的處理由用于搜索<clinit>方法的預加載程序220進行,當找到時,則預加載程序(1)模擬<clinit>方法的執(zhí)行,以便確定如果其由虛擬機222解釋則其對存儲器具有的影響,(2)產(chǎn)生靜態(tài)初始化指令復現(xiàn)這些影響,以及(3)以.mclass文件輸出這些指令來代替<clinit>方法,這樣便節(jié)省大量的存儲器。此外,本發(fā)明的處理由虛擬機222進行,因為其被修改,以便識別預加載程序的靜態(tài)初始化指令。雖然本發(fā)明的示例的實施例以被存儲在存儲器206中進行說明,但是本領(lǐng)域技術(shù)人員應當理解,它也可以存儲在其它的計算機可讀的介質(zhì)上,例如輔助存儲裝置如硬盤、軟盤或CD-ROM;從因特網(wǎng)204接收的載波;或RAM或ROM的其它形式。此外,本領(lǐng)域的技術(shù)人員應當理解,計算機202可以具有附加的或不同的元件。圖3說明由本發(fā)明的預加載程序220執(zhí)行的用于完成靜態(tài)數(shù)組的初始化的步驟的流程圖。由預加載程序進行的第一步是讀出類文件,以便獲得<clinit>方法(步302)。在獲得<clinit>方法之后,預加載程序分配在模擬執(zhí)行期間使用的各個變量(步304)。當模擬執(zhí)行時,如下所述,預加載程序由虛擬機模擬包含在<clinit>方法中的字節(jié)代碼的執(zhí)行。這些字節(jié)代碼控制和<clinit>方法相關(guān)的各種數(shù)據(jù)結(jié)構(gòu),例如常量存儲庫,堆棧,或局部變量(或寄存器)。常量存儲庫是一種可變長度結(jié)構(gòu)的表,代表各種串常量、類名和其它屬于類文件內(nèi)的常量。堆棧是存儲器的一部分,用于在方法的執(zhí)行期間存儲操作數(shù)。因而,堆棧尺寸是在執(zhí)行該方法的任一時刻由操作數(shù)占據(jù)的空間的最大的數(shù)量。局部變量是由這種方法使用的變量。當分配變量時,預加載程序獲得<clinit>方法的常量存儲庫的指針,為堆棧分配一個合適的尺寸,并這樣分配一個數(shù)組,使得數(shù)組的每個項相應于每個局部變量。如下所述,則模擬執(zhí)行根據(jù)這些變量操作。在分配變量之后,預加載程序讀出來自<clinit>方法的字節(jié)代碼(步306)。接著,預加載程序確定其是否識別該字節(jié)代碼(步308)。在這一步,預加載程序識別所有字節(jié)代碼的子集,該子集只含有一般用于進行數(shù)組的靜態(tài)初始化的那些字節(jié)代碼。下面是由一個示例的實施例的預加載程序識別的字節(jié)代碼的表代碼表#4acons_nulliastoreiconst_mllastoreiconst_0fastoreiconst_1dastoreiconst_2aastoreiconst_3bastoreiconst_4lastoreiconst_5sastorelconst_0duplconst_1newarrayfconst_0anewarrayfconst_1returnfconst_2ldcdconst_0ldc_wdconst_1ldc2_wbipushputstaticsipush任何和上述表中的字節(jié)代碼不同的字節(jié)代碼不被識別。除去上進字節(jié)代碼之外其它字節(jié)代碼的存在表明,<clinit>方法執(zhí)行附加于靜態(tài)初始化數(shù)組的功能。在這種情況下,<clinit>方法不可能被優(yōu)化。如果字節(jié)代碼不被識別,則預加載程序認為其對于優(yōu)化(或模擬執(zhí)行)是不合適的,并且處理繼續(xù)到步316。然而,如果預加載程序識別字節(jié)代碼,預加載程序就進行由字節(jié)代碼表示的操作(步310)。在這一步,預加載程序根據(jù)在步304分配的變量模擬執(zhí)行字節(jié)代碼,結(jié)果,一個值可以從堆棧中彈出,可以更新局部變量,或從常量存儲庫中檢索一個值。此外預加載程序可以遇見一個“putstatic”字節(jié)代碼,其表示以特定方式要被初始化的特定靜態(tài)變量(例如數(shù)組)。如果預加載程序接收這個字節(jié)代碼,便將請求初始化的表示存儲在一個散列表中供以后使用。例如,在散列表中的一個項如下Setup:=Array(1,2,3,4)在完成由字節(jié)代碼表示的操作之后,預加載程序確定是否在<clinit>方法中具有更多的字節(jié)代碼(步314)。如果有,處理返回步306。然而,如果沒有更多的字節(jié)代碼,預加載程序便在.mclass文件中存儲命令,以便列數(shù)組進行靜態(tài)初始化(步318)。在這一步,預加載程序在.mclass文件中存儲常量存儲庫項如下標記類型尺寸值CONSTANT-ArrayT-INT41234這個在常量存儲庫中的項表示,一個特定的數(shù)組具有初始值為1,2,3,和4的4個整數(shù)。在運行時,當虛擬機初始化類.mclass文件時,它將遇到對于這常量存儲庫的一個引用,并產(chǎn)生合適的數(shù)組。結(jié)果,在<clinit>方法中包含的許多命令被減少為這一個表達,大大節(jié)省了存儲器的數(shù)量和時間。下面的偽碼描述示例的實施例的預加載程序的采樣處理。預加載程序接收限定<clinit>方法的方法信息數(shù)據(jù)結(jié)構(gòu)作為參數(shù),這在“JavaTMVirtualMachineSpecification”pp.104-106中描述了。應當注意,所述的處理只是一個例子,例如,只有少數(shù)的字節(jié)代碼被描述為被預加載程序處理的。不過,本領(lǐng)域的技術(shù)人員應當理解,在代碼表#4中的所有字節(jié)代碼都可以利用示例的實施例進行處理。代碼表#5<prelisting-type="program-listing"><![CDATA[voidemulateByteCodes(Method_infomb)intnumberRegisters=mb.max_locals();//局部變量數(shù)intstackSize=mb.max_stack();//堆棧尺寸bytebyteCode[]=mb.code();//獲得字節(jié)代碼ConstantPoolconstantPool=mb.constantPool();//獲得常量庫Objectstack[]=newObject[stackSize];//為假裝執(zhí)行建立堆棧Objectregisters[]=newObject[numberRegisters];//為假裝執(zhí)行建立局部變量/*以空堆棧開始*/intstackTop=-1;//僅在有效單元之下/*靜態(tài)目標圖*/Hashtablechanges=newHashtable();try{booleansuccess;execution_loop:for(intcodeOffset=O,newCodeOffset;;codeOffset=newCodeOffset){intopcode=byteCode[codeOffset]&OxFF;//0..255nextCodeOffset=codeOffset+1;//最普通值switch(opcode){caseopc_iconst_m1://-1入棧stack[++stackTop]=newInteger(-1);break;caseopc_bipush:nextCodeOffset=codeOffset+2;stack[++stackTop]=newInteger(byteCode[codeOffset+1]);break;castopc_lload_3://加載整數(shù)3的內(nèi)容stack[++stackTop]=(Long)register[3];stack[++stackTop]=null;//長期使用棧中二字break;castopc_fsub:{//從下項減去棧頂floatb=stack[stackTop--].floatValue();floata=stack[stackTop].floatValue();stack[stackTop]=newFloat(a-b);break;}caseopc_ldc:nextCodeOffset=codeOffset+2;stack[++stackTop]=constantPool.getItem(byteCode(codeOffset+1));break;casesastore:{//將內(nèi)容存入“short”數(shù)組shortvalue=(short)(stack[StackTop--].intValue());intindex=stack[StackTop--].intValue();short[]array=(short[])stack[StackTop--];array[index]=value;break;}caseopc_putstatic:{nextCodeOffset=codeOffset+3;intindex=((byteCode[codeOffset+1])&OxFF<<8)+(byteCode[codeOffset+2]&OxFF);Fieldf=constantPool.getItem(byteCode[codeOffset+1]);if(f.getClass()!=mb.getClass()){//只能修改自己類中的靜量thrownewRuntimeException();}Typet=f.getType();if(t.isLong()||t.isDouble())++stackTop;Objetvalue=stack[++stackTop]Changes.put(f,value);//在數(shù)列表中加入表項break;caseopc_return:success=true;breakexecution_loop;default://未能理解的某些字節(jié)代碼success=false;breakexecution_loop;}}}catch(RuntimeException){//任何運行時意外指示故障success=false;}if(success){<如“changes”數(shù)列表指示地修改.class文件><從類中去除該<clinit>方法>}else{<某些內(nèi)容不可理解><不替換該方法>}}]]></pre>如上所述,Java虛擬機222,除去進行如下的修正之外,是一種標準的Java虛擬機,如同在“JavaVirtualMachineSpecification”中所定義的。常規(guī)的虛擬機識別各種常量存儲庫項,例如CONSTANT_Integer,CONSTANT_String,和CONSTANT_Long。這些類型的常量存儲庫項存儲各種變量信息,包括初始值。然而,示例的虛擬機還識別常量存儲庫中的CONSTANT_Array項。在類文件格式中的CONSTANT_Array常量存儲庫項的格式如下代碼表#6CONSTANT_Array_info{ultag;/*字面值CONSTANT_Array*/ultype;/*如下所示*/u4length;/*數(shù)元素個數(shù)*/unobjects[length];/*實際值*//*僅在type=T_CLASS時包括以下字段*/u2type2;/*常量庫中CONSTANT_Class的下標*/}ul類型字段是下表所列的值之一字段uxobjects[length]是一個數(shù)值數(shù)組,提供數(shù)組的元素。數(shù)組中元素個數(shù)由常量庫表項的長度字段給定。這些值的每個的實際大小如下除去T_CLASS之外,對于以上的所有類型,所示的字節(jié)是被存儲在數(shù)組元素中的實際值。不過,每個u2本身是一個常量存儲庫項的下標。所指的常量存儲庫項本身必須是CONSTANT_Array,CONSTANT_Object,或者是特殊的常量存儲庫項O,表示一個NULL值。例如,為了表示以下的數(shù)組int[]={10,20,30,40};常量存儲庫項如下標記類型大小初值CONSTANT_ArrayTTNT410203040另一個例子表示下面的組newFoo[3]/*全部被初始化為NULL*/常量存儲庫項如下標記類型大小初值類CONSTANT_ArrayT_CLASS3OOOxx其中“xx”是常量存儲庫中的下標,表示常量存儲庫中的類FOO。如下的二維數(shù)組newbyte[][]={{1,2,3,4},{5,6,7,8}};通過使兩個常量存儲庫項對子數(shù)組編碼,并使兩個附加項表示子數(shù)組之間的相關(guān)性而被編碼。這編碼相應于作為目標類型的數(shù)組和作為多個數(shù)組中的一個數(shù)組的多維數(shù)組的JavaTM概念。上述的二維數(shù)組的常量存儲庫項如下Entry1:CONSTANT_ArrayT_BYTE41234Entry2:CONSTANT_ArrayT_BYTE45678Entry3:CONSTANT_Class具有名字“[[B”并且標記類型大小初值類Entry4:CONSTANT_ArrayT_CLASS2Entry1Entry2Entry3其中每個Entry1,Entry2,和Entry3是相應于常量存儲庫項的下標的兩字節(jié)編碼。雖然根據(jù)最佳實施例說明了本發(fā)明的系統(tǒng)和方法,但是,本領(lǐng)域的技術(shù)人員應當理解,不脫離所附權(quán)利要求限定的本發(fā)明的范圍和實質(zhì)可以作出各種改變和改型。權(quán)利要求1一種數(shù)據(jù)處理系統(tǒng)中用于靜態(tài)初始化數(shù)組的方法,包括以下步驟利用靜態(tài)值編譯包含該數(shù)組的源碼,從而利用含有字節(jié)代碼的clinit方法產(chǎn)生一個類文件,以便把數(shù)組靜態(tài)初始化為靜態(tài)值;在預加載程序中接收類文件;對于存儲器模擬執(zhí)行clinit方法的字節(jié)代碼,以便由預加載程序識別數(shù)組的靜態(tài)初始化;在輸出文件中存儲需要靜態(tài)初始化數(shù)組的指令;以及由虛擬機解釋指令,從而進行數(shù)組的靜態(tài)初始化。2如權(quán)利要求1所述的方法,其中存儲步驟包括以下步驟在常量存儲庫中存儲常量存儲庫項。3如權(quán)利要求1所述的方法,其中模擬執(zhí)行步驟包括以下步驟分配堆棧;從clinit方法中讀出控制堆棧的字節(jié)代碼;以及對分配的堆棧執(zhí)行堆??刂啤?如權(quán)利要求1所述的方法,其中模擬執(zhí)行步驟包括以下步驟分配變量;從clinit方法中讀出控制clinit方法的局部變量的字節(jié)代碼;以及根據(jù)分配的變量進行局部變量的控制。5如權(quán)利要求1所述的方法,其中所述模擬執(zhí)行步驟包括以下步驟獲得clinit方法的常量存儲庫的一個基準;從clinit方法中讀出控制常量存儲庫的字節(jié)代碼;以及進行常量存儲庫的控制。6一種用于數(shù)據(jù)處理系統(tǒng)中的方法,包括以下步驟接收要在處理元件上運行的代碼,以便進行操作;模擬執(zhí)行不在處理元件上運行的代碼,以便識別所述的代碼是否曾被處理元件運行過的操作;以及產(chǎn)生使所述處理元件進行所述操作的指令。7如權(quán)利要求6所述的方法,其中所述的操作初始化一種數(shù)據(jù)結(jié)構(gòu),并且其中模擬執(zhí)行步驟包括以下步驟模擬執(zhí)行所述的碼,以便識別數(shù)據(jù)結(jié)構(gòu)的初始化。8如權(quán)利要求6所述的方法,其中所述操作靜態(tài)初始化一個數(shù)組,并且其中模擬執(zhí)行步驟包括以下步驟模擬執(zhí)行所述的代碼,以便識別數(shù)組的靜態(tài)初始化。9如權(quán)利要求6所述的方法,還包括以下步驟在處理元件上運行產(chǎn)生的指令,以便完成所述操作。10如權(quán)利要求6所述的方法,還包括以下步驟由虛擬機解釋產(chǎn)生的指令,以便進行操作。11如權(quán)利要求6所述的方法,其中所述的操作對存儲器有影響,并且其中模擬執(zhí)行步驟包括以下步驟模擬執(zhí)行所述代碼,以便識別對存儲器的影響。12一種數(shù)據(jù)處理系統(tǒng)包括存儲裝置,其包括具有靜態(tài)初始化一種數(shù)據(jù)結(jié)構(gòu)的源碼的程序;以及類文件,其中一種類文件含有靜態(tài)初始化所述數(shù)據(jù)結(jié)構(gòu)的clinit方法;存儲器,其包括用于編譯所述程序并產(chǎn)生類文件的編譯程序;以及用于統(tǒng)一所述類文件的預加載程序,用于模擬執(zhí)行clinit方法,以便確定clinit方法進行的靜態(tài)初始化,并用于產(chǎn)生進行靜態(tài)初始化的指令;以及用于運行所述編譯程序和預加載程序的處理器。13如權(quán)利要求12所述的數(shù)據(jù)處理系統(tǒng),其中預加載程序包括一種用于產(chǎn)生含有被產(chǎn)生的指令的輸出文件的機制。14如權(quán)利要求13所述的數(shù)據(jù)處理系統(tǒng),其中存儲器還包括虛擬機,用于解釋產(chǎn)生的指令,以便進行靜態(tài)初始化。15如權(quán)利要求12所述的數(shù)據(jù)處理系統(tǒng),其中所述的數(shù)據(jù)結(jié)構(gòu)是數(shù)組。16如權(quán)利要求12所述的數(shù)據(jù)處理系統(tǒng),其中clinit方法具有靜態(tài)初始化所述數(shù)據(jù)結(jié)構(gòu)的字節(jié)代碼。17如權(quán)利要求12所述的數(shù)據(jù)處理系統(tǒng),其中所述產(chǎn)生的指令包括在常量存儲庫中的一個項。18一種計算機可讀的介質(zhì),其含有用于控制數(shù)據(jù)處理系統(tǒng)而實現(xiàn)一種包括以下步驟的方法的指令接收要在處理元件上運行的代碼,以便進行操作;模擬執(zhí)行該代碼而不在處理元件上運行該代碼,以便識別所述的代碼是否曾被處理元件運行過的操作;以及產(chǎn)生使所述處理元件進行所述操作的指令。19如權(quán)利要求18所述的計算機可讀介質(zhì),其中所述的操作初始化一種數(shù)據(jù)結(jié)構(gòu),并且其中模擬執(zhí)行步驟包括以下步驟模擬執(zhí)行所述的代碼,以便識別數(shù)據(jù)結(jié)構(gòu)的初始化。20如權(quán)利要求18所述的計算機可讀介質(zhì),其中所述操作靜態(tài)初始化一個數(shù)組,并且其中模擬執(zhí)行步驟包括以下步驟模擬執(zhí)行所述的代碼,以便識別數(shù)組的靜態(tài)初始化。21如權(quán)利要求18所述的計算機可讀介質(zhì),所執(zhí)行的方法還包括以下步驟在處理元件上運行產(chǎn)生的指令,以便完成所述操作。22如權(quán)利要求18所述的計算機可讀介質(zhì),所執(zhí)行的方法還包括以下步驟由虛擬機解釋產(chǎn)生的指令,以便進行操作。23如權(quán)利要求18所述的計算機可讀介質(zhì),其中所述的操作對存儲器有影響,并且其中模擬執(zhí)行步驟包括以下步驟模擬執(zhí)行所述代碼,以便識別對存儲器的影響。全文摘要所公開的系統(tǒng)代表一種對常規(guī)的用于初始化靜態(tài)數(shù)組的系統(tǒng)的改進,其中減少了由虛擬機靜態(tài)初始化數(shù)組而執(zhí)行的代碼的數(shù)量。為實現(xiàn)這種減少,當統(tǒng)一類文件時,預加載程序識別所有的<clinit>方法并模擬執(zhí)行這些方法,以便確定由其進行的靜態(tài)初始化。然后,預加載程序產(chǎn)生一個表達,其表示由<clinit>方法進行的靜態(tài)初始化,并把該表達存儲在.mclass文件中,以便代替<clinit>方法。例如,含有許多指令的<clinit>方法的代碼被一個命令虛擬機進行靜態(tài)初始化的表達代替,從而節(jié)省大量的存儲器。虛擬機被修改,以便識別這個表達,并對數(shù)組進行正確的初始化。文檔編號G06F9/445GK1238500SQ9910773公開日1999年12月15日申請日期1999年4月7日優(yōu)先權(quán)日1998年4月7日發(fā)明者弗蘭克·耶林,理查德·D·特克申請人:太陽微系統(tǒng)公司