在面向對象系統中用於接收器類型的聯機資料庫的製作方法
2023-08-08 03:44:56
專利名稱:在面向對象系統中用於接收器類型的聯機資料庫的製作方法
技術領域:
本發明涉及增加面向對象程序的執行速度。特別地,本發明涉及在面向對象程序的執行期間使用收集的信息用於後續執行。
面向對象的語言的基本思想是將數據和在數據上運算的方法(或函數)組合為一個稱之為對象的單獨的單元。一個對象的函數一般提供唯一的方式來訪問被該對象所封裝的數據。通過向對象發送一個信息、指示對象調用由該信息所指定的方法,來訪問數據。
在面向對象的語言中,有效的信息分配是至關重要的。這是因為信息分配是面向對象程序中一項頻率很高的操作,並且是在運行時執行的;因此,應使其儘可能地快。然而,信息分配遠不是一個微不足道的操作。與在運行之前就可以確定一個函數的地址的過程程序設計語言(例如,C程序設計語言)不同,面向對象的語言必須在運行時確定處理已經被分配給接收器對象的信息的方法,並且可能要進行大範圍的搜索。
為了更好地理解信息分配的複雜性,
圖1顯示了一個包括每一類方法的類分級結構。類分級結構1在其根部包括一個定義了兩個虛擬函數foo和bar的父類A3。虛擬函數是可以在父類中定義並在子類中重新定義的函數。類B5和類C7繼承父類A的數據和方法。如圖所示,類B並沒有重新定義虛擬函數foo和bar中的任一個。但類C重新定義了虛擬函數foo。當類C的對象被請求調用方法foo時,調用的方法將是由類C定義的方法,而不是由父類A定義的方法。類D9和E11也重新定義了方法foo。
由於通常不可能靜態地確定一個對象的類,所以在信息分配期間,在運行時執行對正確方法的搜索。有許多已知的技術用於實現方法分配。例如,圖2顯示了一內聯高速緩存。假定方法51最初如下所示因此,該方法主要包括語句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·赫爾茨勒 申請人:昇陽電腦有限公司