專利名稱::用于改變回復力的中間語言支持的制作方法
技術領域:
:本發(fā)明涉及用于改變回復力的中間語言支持。
背景技術:
:在軟件中,當對底層類庫的內(nèi)部改變導致后代庫或程序不正確地停止工作時,可存在脆弱二進制接口問題(也稱為脆弱基類問題)。當用于面向對象的語言的編譯器生成使用從對象的起始點到所關注的字段的偏移量來訪問該對象的字段的代碼時,會發(fā)生該問題。如果庫的作者改變了對象內(nèi)的公共字段的大小或布局,則偏移量會改變,并且因此依賴于先前的偏移量的軟件變得不可靠。更一般地,隨著時間的推移且在軟件和/或其環(huán)境中出現(xiàn)改變時,軟件有時候會展示出脆弱性。即,對組件、對運行時支持或對輸入數(shù)據(jù)的明顯小改變可能會導致軟件可靠性的大幅下降。軟件脆弱性可因各種各樣的因素而引起,并且所提議的對于脆弱性的解決方案也極大地變化。此外,降低脆弱性的嘗試可能會與諸如使得某一個軟件更快、其對硬件的使用更高效、更緊湊、更易于修改、和/或更易于調試的努力等其他努力相沖突。
發(fā)明內(nèi)容對程序的一個部分的改變在其他部分中可能會有反響,有時候還具有非預期且不合需要的結果。此處討論的某些實施例涉及改變回復中間語言代碼,其中寄存器已被分配但是符號引用和偽指令仍使用未綁定項目。例如,各實施例可生成和/或使用具有在所生成的中間語言代碼中的特定位置的偽指令,該偽指令請求在該位置處插入機器指令來執(zhí)行指定操作。指定操作可以廣泛地變化,在某些實施例中包括執(zhí)行或方便無用信息收集、存儲器分配、異常處理、各種方法調用和執(zhí)行引擎服務調用、托管對象字段訪問、堆管理、類屬代碼、靜態(tài)變量存儲訪問、地址模式修改、和/或對類型的符號引用的操作。綁定器可以將中間語言代碼變換成可執(zhí)行代碼。在綁定期間需要極少或不需要寄存器分配,但是諸如偏移量、大小、槽等未綁定項目被確定并指定來產(chǎn)生可執(zhí)行代碼。給出的示例僅是說明性的。本概述并不旨在標識出所要求保護的主題的關鍵特征或必要特征,也不旨在用于限定所要求保護的主題的范圍。相反,提供本概述是為了以簡化的形式介紹將在以下詳細描述中進一步描述的某些概念。本發(fā)明用權利要求書來定義,且在本
發(fā)明內(nèi)容與權利要求書沖突的情況下,應以權利要求書為準。將參考附圖來給出更具體的描述。這些附圖僅示出了所選方面,且因此未完全確定覆蓋或范圍。圖1是示出一計算機系統(tǒng)的框圖,該計算機系統(tǒng)具有存儲器中的源代碼、至少一個處理器、以及可存在于多個網(wǎng)絡節(jié)點上的操作環(huán)境中的其他項目,并且還示出了配置的存儲介質實施例;圖2是示出一示例體系結構中的改變回復中間代碼的各方面的框圖;以及圖3是示出某些實施例中的改變回復偽指令的使用的數(shù)據(jù)流圖;圖4是示出某些實施例中的一具體中間語言示例的改變回復偽指令的使用的數(shù)據(jù)流圖;以及圖5、6和7共同形成示出某種過程的步驟和配置的存儲介質實施例的流程圖。具體實施例方式概覽某些軟件開發(fā)方法包括從源代碼生成中間代碼。存在各種中間代碼,其具有各種特性。某些技術部署JIT編譯(“即時”編譯)的中間代碼。通常,此類中間代碼以抽象棧機器為目標。特別地,將該抽象機器映射到使用實際硬件寄存器的有形機器上涉及對該機器的寄存器的分配。高效的寄存器分配通常是用于JIT編譯,或實際上是用于產(chǎn)生機器語言的任何編譯的設計準則。然而,可接受的寄存器分配方案可能是復雜的,從而使其實現(xiàn)起來相對困難,并且使得其在時間和其他計算資源方面成為編譯的相對大的一部分。JIT編譯還可執(zhí)行機器無關的優(yōu)化,這使得從中間代碼到機器語言的轉換進一步變復雜。編譯的一方面可以是將字段偏移量和虛槽號插入到引用它們的代碼中。某些方法在加載時構造偏移量表,但是這具有有限的靈活性,并且未完全解決脆弱二進制接口問題。由此,尚待在某種程度上例如用假設其修改的地址中的固定改變的鏈接器來修補代碼,或者對該代碼使用某種間接手段。間接手段降低了執(zhí)行時間性能。代碼修補可以涉及JIT編譯的中間代碼,其具有附帶的寄存器分配成本。相反,此處描述的某些實施例提供了接近機器的中間代碼,因為即使尚未指定偏移量,寄存器也已經(jīng)被分配。該中間代碼在典型方式中不是JIT編譯的,因為寄存器分配已經(jīng)完成并且被嵌入在中間代碼中。相反,該中間代碼經(jīng)歷客戶機器上的綁定,這一綁定可以比涉及寄存器分配的熟悉的編譯工作更簡單。然而,盡管有嵌入的寄存器分配,該中間代碼在面對對于對象字段大小、對象字段布局、無用信息收集(garbagecollection)細節(jié)、結構分配細節(jié)、方法調用實現(xiàn)細節(jié)的改變以及對具體執(zhí)行環(huán)境中的可執(zhí)行代碼的其他方面的改變時,可以是有回復力的。例如,某些實施例提供了中間語言代碼,其中寄存器分配足夠完整以便允許高效執(zhí)行,并且還具有“抽象”實現(xiàn)細節(jié)的偽指令。即,該偽指令被設計成使某些實現(xiàn)細節(jié)從編程接口解耦,編程接口包括遵從中間代碼句法但是在實踐中可被綁定到一個或多個機器語言指令的指令。在某些實施例中,提供了抽象對象字段布局和虛方法槽指派的偽指令,從而對諸如C++等非托管語言減輕或消除了脆弱基類問題。在某些實施例中,由中間語言代碼和綁定器提供的能力擴展到托管執(zhí)行環(huán)境,并且包括抽象代碼和數(shù)據(jù)中的無用信息收集器信息、對象分配、類型描述符的表示、異常處理、用于虛或接口調用的機制、和/或軟件執(zhí)行的其他方面的偽指令。某些實施例提供了部署的中間代碼,該部署的中間代碼對于執(zhí)行引擎中的改變并且對于該執(zhí)行引擎預期以該引擎為目標的任何代碼都要遵從的數(shù)據(jù)結構和軟件約定中的改變是有回復力的。現(xiàn)在將參考諸如附圖中示出的示例性實施例,且此處將使用具體語言來描述這些實施例。但是相關領域且擁有本發(fā)明的技術人員將想到的、此處所示的特征的更改和進一步修改以及此處所示的原理的其他應用應被認為是在權利要求書的范圍內(nèi)。各術語的意義在本發(fā)明中闡明,因此權利要求書應仔細注意這些闡明來閱讀。給出了具體示例,但是相關領域的技術人員將理解,其他示例也落入所使用的術語的意義內(nèi),且在一個或多個權利要求的范圍內(nèi)。各術語不必在此具有與其一般使用中、特定行業(yè)的使用中、或特定字典或字典集的使用中相同的意義。與各種措辭一起使用附圖標記來幫助顯示術語的寬度。給定一段文本中省略附圖標記并不一定意味著該附圖的內(nèi)容沒有被該文本討論。發(fā)明人聲稱并行使其對于其自己的詞典編纂的權利。各術語此處可在詳細描述和/或申請文件的別處顯式或隱式地定義。如此處所使用的,“計算機系統(tǒng)”可包括例如一個或多個服務器、主板、處理節(jié)點、個人計算機(便攜式或非便攜式)、個人數(shù)字助理、蜂窩或移動電話、和/或提供至少部分地由指令來控制的一個或多個處理器的設備。指令可以采用存儲器和/或專用電路中的軟件的形式。具體而言,盡管可以想到許多實施例在工作站或膝上型計算機上運行,但其他實施例可以在其他計算設備上運行,且任何一個或多個此類設備可以是給定實施例的一部分?!岸嗑€程化”計算機系統(tǒng)是支持多個執(zhí)行線程的計算機系統(tǒng)。術語“線程”應被理解為包括能夠或經(jīng)歷同步的任何代碼,并且可用另一名稱來稱呼,如“任務”、“進程”或“協(xié)同例程”。線程可以并行地、順序地、或以并行執(zhí)行(例如,多處理)和順序執(zhí)行(例如,時間片)的組合來運行。以各種配置設計了多線程化環(huán)境。執(zhí)行線程可以并行地運行,或者線程可以被組織供并行執(zhí)行但實際順序地輪流執(zhí)行。多線程化可以例如通過在多處理環(huán)境中在不同核上運行不同線程、通過對單個處理器核上的不同線程進行時間分片、或通過時間分片和多處理器線程化的某種組合來實現(xiàn)。線程上下文切換可以例如由內(nèi)核的線程調度器、由用戶空間信號、或由用戶空間和內(nèi)核操作的組合來發(fā)起。線程可輪流在共享數(shù)據(jù)上操作,或者每一線程可以例如在其自己的數(shù)據(jù)上操作。“邏輯處理器”或“處理器”是單個獨立的硬件線程處理單元。例如,每一個核運行兩個線程的超線程化四核芯片具有8個邏輯處理器。處理器可以是通用的,或者它們可以對諸如圖形處理、信號處理、浮點算術處理、加密、I/O處理等特定使用來定制。“多處理器”計算機是具有多個邏輯處理器的計算機系統(tǒng)。多處理器環(huán)境以各種配置出現(xiàn)。在一給定配置中,所有處理器可以在功能上是等價的,而在另一配置中,某些處理器可以借助具有不同硬件能力、不同軟件分配或兩者而不同于其他處理器。取決于配置,處理器可在單個總線上彼此緊耦合,或者它們可以是松耦合的。在某些配置中,處理器共享中央存儲器,在某些配置中它們各自具有其自己的本地存儲器,且某些配置中存在共享和本地存儲器兩者?!皟?nèi)核”包括操作系統(tǒng)、系統(tǒng)管理程序、虛擬機、以及類似的硬件接口軟件。“代碼”意味著處理器指令、數(shù)據(jù)(包括常量、變量和數(shù)據(jù)結構)或指令和數(shù)據(jù)兩者ο關于諸如涉及“變換”、“產(chǎn)生”或“準備”代碼的操作等綁定操作的討論,對“指令”的引用意味著“指令和任何對應的數(shù)據(jù)”。元數(shù)據(jù)是一種類型的數(shù)據(jù)。例如,如此處所討論的,對變換無用信息收集寫屏障(garbage-collectionirite-barrier)偽指令的引用意味著該變換接收某些中間語言代碼(指令和相關聯(lián)的元數(shù)據(jù)/數(shù)據(jù)),并產(chǎn)生某些本機代碼(指令和相關聯(lián)的元數(shù)據(jù)/數(shù)據(jù),如無用信息收集表)。即,在綁定的上下文中對術語“指令”的使用不排除對與該指令相關聯(lián)的數(shù)據(jù)的產(chǎn)生或其他使用。關于中間語言代碼的諸如“寄存器分配是執(zhí)行就緒的”等短語意味著可從該中間語言代碼創(chuàng)建可執(zhí)行代碼,而沒有從程序源代碼變量到處理器寄存器的任何附加或不同映射。結果,綁定該中間語言代碼不需要執(zhí)行寄存器分配來從中間語言代碼產(chǎn)生機器語言代碼。換言之,中間代碼中分配給寄存器的每一用戶定義的或編譯器生成的變量將在最終可執(zhí)行代碼中使用相同的寄存器。在產(chǎn)生系統(tǒng)中,可能發(fā)生整個中間語言代碼具有寄存器分配執(zhí)行就緒,或者情況可以是整個中間語言代碼的僅僅一適當?shù)淖蛹哂屑拇嫫鞣峙鋱?zhí)行就緒。換言之,假定X是對于其寄存器分配是執(zhí)行就緒的中間語言代碼,假定指令Y不是寄存器分配執(zhí)行就緒的,且假定Y被添加到X。因此,Y的添加不破壞X的寄存器分配執(zhí)行就緒狀態(tài)。例如,在以下討論的稱為“MDIL”的一具體中間語言中,存在非本機指令,對于這些非本機指令,通過綁定產(chǎn)生的本機指令序列將使用綁定器所分配的臨時寄存器。然而,這一類型的寄存器分配在MDIL中具有有限的范圍,且其存在不會更改以下事實MDIL的大部分不包括對于其寄存器分配是執(zhí)行就緒的偽指令?!白詣印币馕吨ㄟ^使用自動化(例如,由軟件針對此處討論的具體操作配置的通用計算硬件),與不使用自動化相對。具體而言,“自動”執(zhí)行的步驟并不是在紙張上用手執(zhí)行或在人的腦海中執(zhí)行的;它們是用機器來執(zhí)行的。貫穿本文,對任選的復數(shù)的使用意味著存在一個或多個所指示的特征。例如,“指令”意味著“一個或多個指令”,或等價地,“至少一個指令”。只要參考了數(shù)據(jù)或指令,就理解這些項目配置了計算機可讀存儲器,從而將其變換為特定物品,而非簡單地存在于紙張上、人的腦海中、或作為例如線路上的瞬時信號。貫穿本文,除非明確地另外規(guī)定,否則對過程中的步驟的任何引用假定該步驟可以由感興趣的一方直接執(zhí)行和/或由該方通過干預機器和/或干預實體來間接執(zhí)行,且仍在該步驟的范圍內(nèi)。即,感興趣的一方對步驟的直接執(zhí)行并不是必需的,除非直接執(zhí)行是明確規(guī)定的要求。例如,涉及感興趣的一方的諸如向目的地“傳送”、“發(fā)送”或“傳遞”等動作的步驟可涉及某一其他方的諸如轉發(fā)、復制、上傳、下載、編碼、解碼、壓縮、解壓、加密、解密等中介動作,但仍被理解為由該感興趣的一方直接執(zhí)行。具體地,即使涉及了中介機制和/或中介實體,諸如此處討論的編譯、生成、綁定和產(chǎn)生等動作也可以由一方直接執(zhí)行。操作環(huán)境參考圖1,用于一個實施例的操作環(huán)境100可包括計算機系統(tǒng)102。計算機系統(tǒng)102可以是多處理器計算機系統(tǒng),也可以不是。操作環(huán)境可包括給定計算機系統(tǒng)中的一個或多個機器,這些機器可以是集群的、客戶機-服務器聯(lián)網(wǎng)的、和/或對等聯(lián)網(wǎng)的。人類用戶104可以通過使用顯示器、鍵盤和其他外圍設備106來與計算機系統(tǒng)102交互。系統(tǒng)管理員、開發(fā)者、工程師和最終用戶各自都是一具體類型的用戶104。代表一個或多個人來行動的自動化代理也可以是用戶104。存儲設備和/或聯(lián)網(wǎng)設備在某些實施例中可被認為是外圍設備。圖1中未示出的其他計算機系統(tǒng)可以使用經(jīng)由例如網(wǎng)絡接口設備到網(wǎng)絡108的一個或多個連接來與計算機系統(tǒng)102或與另一系統(tǒng)實施例交互。計算機系統(tǒng)102包括至少一個邏輯處理器110。如其他合適的系統(tǒng)的計算機系統(tǒng)102還包括一個或多個計算機可讀非瞬態(tài)存儲介質112。介質112可以是不同的物理類型。介質112可以是易失性存儲器、非易失性存儲器、固定在原處的介質、可移動介質、磁介質、光介質、和/或其他類型的非瞬態(tài)介質(與諸如僅傳播信號的線路等瞬態(tài)介質形成對比)。具體地,諸如CD、DVD、記憶棒或其他可移動非易失性存儲介質等配置的介質114在被插入或以其他方式安裝時可以變?yōu)橛嬎銠C系統(tǒng)的功能部分,從而使得其內(nèi)容可被存取來供處理器110使用??梢苿拥呐渲玫慕橘|114是計算機可讀存儲介質112的一個示例。計算機可讀存儲介質112的某些其他示例包括內(nèi)置RAM、ROM、、硬盤、和不可由用戶104容易地移動的其他存儲設備。介質114用可由處理器110執(zhí)行的指令116來配置;“可執(zhí)行”在此以寬泛的意義被使用來包括機器代碼、可解釋代碼、以及在例如虛擬機上運行的代碼。介質114還用通過指令116的執(zhí)行創(chuàng)建、修改、引用和/或以其他方式使用的數(shù)據(jù)118來配置。指令116和數(shù)據(jù)118配置它們所駐留的介質114;當該存儲器是給定計算機系統(tǒng)的功能部分時,指令116和數(shù)據(jù)118還配置該計算機系統(tǒng)。在某些實施例中,數(shù)據(jù)118的一部分代表了諸如產(chǎn)品特性、庫存、物理測量、設置、圖像、讀數(shù)、目標、量等的真實項目。此類數(shù)據(jù)也如此處所討論的例如通過綁定、重新綁定、指令插入、槽指派、符號變換、解析、部署、執(zhí)行、修改、顯示、創(chuàng)建、修訂、加載和/或其他操作來變換。計算機軟件源代碼120可包括例如模塊122、基類124、具有字段128的對象126、虛方法130、結構144和/或其他項目。編譯器132和/或代碼生成器可用于從源代碼生成本機指令134,即處理器110可識別的指令。鏈接器和/或其他工具組合由本機指令和修補組成的對象模塊來形成可執(zhí)行代碼136。處理器110具有寄存器138。處理器110和諸如內(nèi)核等系統(tǒng)軟件幫助定義執(zhí)行引擎140。源代碼120和圖中所示和/或此處注明的其他項目可以部分或完全地駐留在一個或多個介質112內(nèi),從而配置這些介質。操作環(huán)境還可包括其他硬件,例如總線、電源、加速計等。給定操作環(huán)境100可包括集成開發(fā)環(huán)境(IDE)142,其向開發(fā)者提供了一組協(xié)調的軟件開發(fā)工具。具體地,用于某些實施例的合適的操作環(huán)境中的某一些包括或幫助創(chuàng)建被配置成支持程序開發(fā)的MicrosoftVisualStudio開發(fā)環(huán)境(微軟公司的標記)。某些合適的操作環(huán)境包括Java環(huán)境(Sim微系統(tǒng)公司的標記),并且某些合適的操作環(huán)境包括利用諸如C++或C#("C-Sharp")等語言的環(huán)境,但是此處的教示適用于各種各樣的編程語言、編程模型和程序,以及使用中間語言,即在源代碼和本機指令之間的代碼的軟件開發(fā)領域本身之外的嘗試。在圖1中以輪廓形式示出了IDE142來強調它不一定是所示操作環(huán)境的一部分,但是可以與此處討論的操作環(huán)境中的項目互操作。在任何附圖或任何實施例中,不能得出不采用輪廓形式的項目就一定是需要的。系統(tǒng)圖2示出了適用于某些實施例的體系結構。源代碼120由生成器204變換成中間語言代碼202(此處也稱為中間代碼)。在諸如圖3所示的某些實施例中,生成器204與編譯器132集成,例如,生成器204可以在編譯的代碼生成階段期間被調用。在諸如圖4所示的實施例之類的其他實施例中,生成器204與編譯器分開,并且接收由編譯器132輸出的內(nèi)容作為輸入代碼。除非另外清楚指明,否側此處對中間代碼(或中間語言代碼)的引用指的是其中已經(jīng)完成了寄存器分配206但是尚未指定可執(zhí)行代碼136的其他方面的中間代碼202。本文之外的對“中間代碼”的某些使用可在當前意義上在對不是中間代碼202的代碼的引用中使用短語“中間代碼”,例如因為尚未完成寄存器分配206。在實踐中,某些配置可采用多于一種中間代碼,包括中間代碼202和作為源代碼和本機代碼之間的中介但不是此處定義的中間代碼202的某種其他代碼。在某些實施例中,例如,對象字段布局208未完全在中間代碼202中被指定,但寄存器分配206被完全指定。在某些實施例中,虛方法槽指派210未在中間代碼202中被完全指定。在某些實施例中,中間代碼202中的偽指令212標識了可執(zhí)行代碼136的未在該代碼202中指定的各方面。這些未指定的各方面使用綁定器214來被確定和指定。如此處所教示的,綁定器214將中間代碼202偽指令212變換成本機指令134。在本文的附圖和文字中,“PI”指的是“偽指令”,即偽代碼指令。類似地,“Ni”指的是“本機指令”,即本機代碼指令?!癕DIL”代表“機器相關中間語言”,且是中間語言代碼202的某些方面的示例。給定實施例可包括以下各種偽指令212中的一種或多種無用信息收集器探測偽指令216可被插入到緊湊循環(huán)(tightloop)中來檢查待決的無用信息收集。該檢查可通過綁定器214將無用信息收集器探測偽指令216變換成本機指令134來實現(xiàn)。即,無用信息收集器探測偽指令216可用作以下綁定器指定的機器指令的占位符該綁定器指定的機器指令在執(zhí)行時將檢查待決的無用信息收集。如何執(zhí)行檢查以及檢查使用什么無用信息收集信息可取決于執(zhí)行引擎140;可使用熟悉的無用信息收集機制。對象分配偽指令218可用作以下綁定器指定的機器指令134的占位符該綁定器指定的機器指令在執(zhí)行時將分配存儲器來保持中間語言代碼202中指定的類型的對象。如何執(zhí)行分配可取決于執(zhí)行引擎140;可使用熟悉的存儲器分配機制。異常拋出偽指令220可用作以下綁定器指定的機器指令134的占位符該綁定器指定的機器指令在執(zhí)行時將拋出新異常、重新拋出當前異常、和/或以其他方式執(zhí)行異常操作。如何執(zhí)行異常可取決于執(zhí)行引擎140;可使用熟悉的異常處理機制。虛調用方法偽指令222可用作以下綁定器指定的機器指令134的占位符該綁定器指定的機器指令在執(zhí)行時將作出對指定方法的虛調用。如何執(zhí)行虛調用可取決于執(zhí)行引擎140;可使用虛表和/或其他熟悉的虛調用機制。虛方法在某些情形中可被非虛地調用,因此在作出對方法的虛調用(在這一情況下方法是虛的)和作出對虛方法的調用(在這一情況下調用本身可以是虛的或可以不是虛的)之間存在區(qū)別。虛和非虛調用之間的區(qū)別是對于虛調用,調用的地址由對象的虛表或另一查找機制中該方法的地址的運行時查找來確定,而對于非虛調用,該方法的地址是靜態(tài)地確定的。靜態(tài)調用方法偽指令224可用作以下綁定器指定的機器指令134的占位符該綁定器指定的機器指令在執(zhí)行時將作出對指定方法的非虛調用。如何執(zhí)行該調用可取決于執(zhí)行引擎140和其他因素;可使用熟悉的調用機制。尾調用(tail-call)方法偽指令226可用作以下綁定器指定的機器指令134的占位符該綁定器指定的機器指令在執(zhí)行時將作出對指定方法的尾調用,即,調用的后面緊跟著對調用者的返回。如何執(zhí)行尾調用可取決于執(zhí)行引擎140;可使用熟悉的機制。執(zhí)行引擎服務調用偽指令228可用作以下綁定器指定的機器指令134的占位符該綁定器指定的機器指令在執(zhí)行時將作出對指定的運行時助手,例如執(zhí)行引擎140服務例程作出調用??捎梅胀ǔ⑷Q于執(zhí)行引擎140。在某些情況下,引擎服務可通過代碼202獲得,但是在其他情況下,引擎服務通過其他機制來訪問。在一給定實施例中,執(zhí)行引擎服務可包括以下類別中的一個或多個,或者不包括任何以下類別;這些示例中的某一些是特定于實現(xiàn)的,和/或與MDILHELPER_CALL(助手調用)偽指令228相關,并且不一定涉及每一實施例用于機器本機不支持的運算——例如32位機器上的64位乘法——的算術助手。浮點和整型數(shù)據(jù)類型之間的轉換,任選地具有錯誤檢驗。用于拋出各種運行時異常,例如用于運行時范圍檢查的助手。用于安全檢查的助手。用于訪問“遠程”對象的助手。在對象可以在同一機器上的另一進程中的意義上,和/或在對象可以完全在另一機器上的意義上,對象可以是遠程的。用于運行時的各種類型檢查的助手調用。與調用非托管代碼相關的助手調用。與對象分配相關的助手調用。在MDIL中,這些是由中間代碼202中的ALL0C_OBJECT(分配對象)或ALL0C_ARRAY(分配數(shù)組)來表示的。一個例外是C0RINF0_HELP_NEW_MDARR_N0_LB0UNDS(用于無下界的新多維數(shù)組的助手的協(xié)作信息),其分配所有下界被設為0的多維數(shù)組。與無用信息收集器交互的助手調用。例如,GC_PR0BE(GC探測)偽指令216可被轉換成助手調用C0RINF0_HELP_P0LL_GC(用于輪詢GC的助手的協(xié)作信息),但是取決于執(zhí)行環(huán)境,可以有實現(xiàn)GC_PR0BE的更多的高效方式。服務CORINFO_HELP_ASSIGN_REF_ECX(用于指派引用ECX的助手的協(xié)作信息)是該類別中的另一調用;其幫助實現(xiàn)寫屏障,且因此可以由中間代碼202中的ST0RE_REF(存儲引用)偽指令更緊湊地表示。運行時類型直接調用方法偽指令230可用作對綁定器214的請求,請求綁定器不執(zhí)行虛調用,而是從編譯器132或其他中間代碼202生成器204提供的運行時類型中確定虛或接口調用的目標方法。由此,可要求綁定器214插入機器指令來代替?zhèn)沃噶?30,以便作出對中間語言代碼202中通過符號標識的運行時類型的方法的直接調用。例如,MDILCONSTRAINT(MDIL約束)偽指令230指定虛調用在其上被執(zhí)行的對象的運行時類型。CONSTRAINT作為對綁定器214的請求來操作,請求綁定器完全不執(zhí)行虛調用,而是從編譯器提供的運行時類型中找出虛或接口調用的目標方法。托管對象字段訪問偽指令232可用作以下綁定器指定的機器指令134的占位符該綁定器指定的機器指令在執(zhí)行時將訪問托管的對象126的字段128,例如其分配由執(zhí)行引擎140管理的對象。訪問可采用例如加載、添加、存儲或另一操作的形式。由綁定器置于本機代碼134內(nèi)的實際字段偏移量可例如由于托管匯編件和執(zhí)行引擎140的版本化(versioning)而改變。在某些實施例中,字段訪問偽指令232可使用各種尋址模式。一般而言,這些偽指令模式直接映射到本機尋址模式。在某些情況下,使用額外指令以及可能還有臨時寄存器。MDIL還包括數(shù)組訪問尋址模式,其抽象數(shù)組頭部的布局,例如數(shù)組的長度存儲在何處,以及第一個數(shù)組元素在何處與該數(shù)組的起始地址相關。堆指針指定偽指令234可用于向綁定器214傳達哪些寄存器或棧位置在方法中的什么位置處包含哪一類的指針。綁定器214可使用此類信息來確定從方法內(nèi)的位置到包含指向無用信息收集堆的指針的一組指針位置的運行時映射。在MDIL中,堆指針指定偽指令234的某些示例包括REF_UNTR、REF_BIRTH和REF_DEATH,因為它們各自幫助確定從方法主體執(zhí)行點到指向無用信息收集堆的位置的映射。一般而言,這些位置在方法的執(zhí)行的特定部分期間僅包含gc指針??梢詫o用信息收集認為是在一特定執(zhí)行點中斷方法的執(zhí)行。進行無用信息收集的執(zhí)行系統(tǒng)可能很需要在執(zhí)行被中斷的該特定點處確定哪些寄存器和棧位置包含指向無用信息收集堆的指針。概念上,這可通過掃描中間代碼直到執(zhí)行被中斷的點并維護如下包含指向無用信息收集堆的指針的位置列表來確定該列表以空開始。對于每一REF_UNTR_XXX偽指令,將該位置添加到該列表。對于每一REF_BIRTH_XXX偽指令,將該位置添加到該列表。對于每一REF_DEATH_XXX偽指令,將該位置添加從該列表刪除。在一給定實現(xiàn)中,中間代碼不必被保留或被掃描;取而代之的是,構建與每一方法相關聯(lián)且實現(xiàn)從方法內(nèi)的執(zhí)行點到包含指向無用信息收集堆的指針的一組位置(寄存器或棧位置)的相同映射的附加數(shù)據(jù)結構。實例化查找偽指令236可用作以下綁定器指定的機器指令134的占位符該綁定器指定的機器指令在執(zhí)行時將查找例如類屬類型或方法的實例化或實例。標識類屬項的具體實例的實例化參數(shù)可作為偽指令的參數(shù)來傳遞、在附加到“this”指針的字典中提供、或通過另一機制來提供。更一般地,某些實施例包括對類屬代碼的支持,由此實際本機代碼序列可依賴于作為參數(shù)提供的某一類型。中間代碼202可被共享,或者取決于類型參數(shù)的種類,可以有若干風格的中間代碼。例如,可以有用于整型類型的中間代碼方法主體、用于浮點類型的中間代碼方法主體、用于引用類型的中間代碼方法主體、用于用戶定義的值類型(結構體類型)的中間代碼方法主體、等等。在共享的類屬代碼中,實際機器代碼在類屬類型或類屬方法的相似實例之間共享。在某些情況下,這意味著執(zhí)行對類型、字段、方法等的運行時查找??芍袛鄥^(qū)域偽指令238可用于向綁定器214傳遞哪些代碼部分能夠訪問無用信息收集器信息,特別地,除調用返回位置之外的哪些代碼部分具有這樣的訪問。無用信息收集的細節(jié)可取決于執(zhí)行引擎140;可使用熟悉的機制。在MDIL中,START_FULLY_INTERRUPTIBLE(開始完全可中斷)和END_FULLY_INTERRUPTIBLE(結束完全可中斷)偽指令238界定了其中無用信息收集信息在每一指令邊界而非僅在調用位置(callsites)是精確的區(qū)域。這對于多線程化程序中的情形可能是重要的,其中一個線程分配存儲器,而另一線程執(zhí)行不作出任何調用的長期運行循環(huán)。在這一情形中,可能期望能夠停止第二個線程,并且能夠準確地報告所有無用信息收集指針。無用信息收集指針偽指令240可用于向綁定器214指示包含無用信息收集器指針的自變量被壓入棧上何處、從棧上何處彈出、或者在何處在沒有被彈出的情況下變得對無用信息收集無效。在某些實施例中,無用信息收集指針偽指令240可用于指示不是無用信息收集器指針的值已被壓到棧上。在MDIL中,REF_PUSH(引用壓入)和N0NREF_PUSH(非引用壓入)是無用信息收集指針偽指令240的示例。具體地,N0NREF_PUSH指示不是無用信息收集器指針的值已被壓到棧上。結果,無用信息收集器知道某些值不是無用信息收集器指針,而是可能碰巧看上去很像的某一其他值。該NONREF_PUSH指示可在無用信息收集器決定壓縮無用信息收集器堆時尤其有幫助,在此期間,它可調整程序保持的無用信息收集器指針中的一部分或全部;調整不是指針的常規(guī)整數(shù)將是不正確的。該NONREF_PUSH指示還可幫助無用信息收集器知道返回地址被存儲在棧上的何處。無用信息收集寫屏障偽指令242可用于向綁定器214傳達無用信息收集寫屏障的狀態(tài)。寫屏障和無用信息收集的其他方面的細節(jié),如寫屏障實現(xiàn)中使用的卡表(cardtable)數(shù)據(jù)結構的大小,可取決于執(zhí)行引擎140;可使用熟悉的機制。在MDIL中,ST0RE_REF(存儲引用)偽指令242可用于支持世代無用信息收集器。該指令242生成被稱為寫屏障的東西,即,對執(zhí)行引擎的暗示,其暗示指向較年輕對象的指針可能已經(jīng)被存儲在較老的對象中。ST0RE_REF指令可在可中斷區(qū)域的內(nèi)部或外部出現(xiàn)。在對目標執(zhí)行引擎適當?shù)臅r候,ST0RE_REF將由綁定器變換成實現(xiàn)無用信息收集器寫屏障的機器指令序列。MDIL還包括地址模式修改器。在嚴格觀點下,這些地址模式修改器本身不是指令,而是被用作指令的一部分。然而,此處為方便起見,“地址模式修改器偽指令”是包括地址模式修改器的任何偽指令212。因此,某些偽指令212位于至少兩個類別中,例如,給定指令212可以既是托管對象字段訪問偽指令232,又是地址模式修改器偽指令244。地址模式修改器偽指令244可用作包括地址模式修改的綁定器指定的機器指令134的各部分的占位符。在MDIL中,這些偽指令244在執(zhí)行引擎中隱藏數(shù)組的布局,例如包含長度的數(shù)組頭部的布局。但是它們的角色不必限于隱藏數(shù)組布局。在MDIL中,這些偽指令244還具有支持在版本化期間改變大小的數(shù)組元素的規(guī)定。靜態(tài)基址偽指令246可用作包括或提供用于訪問靜態(tài)變量存儲區(qū)域的基址的綁定器指定的機器指令134的占位符。在MDIL中,GET_STATIC_BASE(獲得靜態(tài)基址)偽指令246可用于獲得不包含無用信息收集指針的靜態(tài)量(例如,int、double、bool)的基址。GET_STATIC_BASE_GC(獲得靜態(tài)基址GC)偽指令246可用于獲得包含無用信息收集指針以及用戶定義的結構體類型的靜態(tài)量的基址。在MDIL中,這些偽指令隱藏(將指定推遲到綁定時)到類的靜態(tài)字段的精確訪問路徑,并且還隱藏是否應運行類初始化器。某些偽指令包括對字段、類型和/或其他項的符號引用248。例如,可使用令牌來標識字段或類型而不同時指定諸如字段的偏移量或類型的大小等細節(jié);綁定器214在將具有偽指令的代碼變換成沒有偽指令的完全本機代碼時添加執(zhí)行所需的細節(jié)。在某些實施例中,諸如人類用戶I/O設備(屏幕、鍵盤、鼠標、圖形輸入板、話筒、揚聲器、運動傳感器等)等的外圍設備106將存在于與一個或多個處理器110和存儲器的可操作通信中。然而,一實施例還可被深嵌入在系統(tǒng)中,使得沒有人類用戶104直接與該實施例交互。軟件進程可以是用戶104。在某些實施例中,該系統(tǒng)包括通過網(wǎng)絡連接的多個計算機。聯(lián)網(wǎng)接口設備可使用諸如例如存在于計算機系統(tǒng)中的分組交換網(wǎng)絡接口卡、無線收發(fā)機、或電話網(wǎng)絡接口等組件來提供對網(wǎng)絡108的接入。然而,一實施例也可通過直接存儲器存取、可移動非易失性介質、或其他信息存儲-檢索和/或傳輸方法來通信,或者計算機系統(tǒng)中的一實施例可以在不與其他計算機系統(tǒng)通信的情況下操作。參考圖1和2,某些實施例提供了具有邏輯處理器110和存儲器介質112的計算機系統(tǒng)102,該存儲器介質由電路、固件和/或軟件配置來如此處所描述的將包含偽指令的中間代碼變換成本機代碼。例如,某些實施例提供了與存儲器112、與存儲器中(例如,RAM和/或盤上的文件中)的中間語言代碼202和可執(zhí)行代碼136進行可操作通信的處理器110的系統(tǒng)。中間語言代碼和可執(zhí)行代碼符合結構對應性,表現(xiàn)在中間語言代碼中的每一寄存器分配206在可執(zhí)行代碼中具有相同的寄存器分配206。另外,在某些實施例中,中間語言代碼和可執(zhí)行代碼關于對象字段布局和/或虛方法槽指派是一致的。如果中間語言代碼中用于訪問對象126的偽指令212包括對應于可執(zhí)行代碼中使用數(shù)值字段偏移量的機器指令134的符號字段引用,則中間語言代碼202和可執(zhí)行代碼136關于對象字段布局是一致的。綁定器214將符號字段引用變換成可由作為綁定器的目標的執(zhí)行引擎140識別的數(shù)值偏移量??梢哉f“對象字段布局迄今尚未被綁定”來指示中間語言代碼使用符號字段引用而非直接偏移量。例如,如果對象字段布局迄今尚未被綁定,則字段的次序在中間語言中未被指定。中間語言是字段次序無關的,因為兩個功能上相同的可執(zhí)行代碼可以從相同的中間語言代碼創(chuàng)建,這兩個可執(zhí)行代碼區(qū)別僅在于某一對象的兩個字段的RAM內(nèi)的相對次序。如果中間語言代碼中用于調用虛方法130的偽指令212包括對應于可執(zhí)行代碼中使用數(shù)值虛方法表槽的機器指令134的符號槽引用,則中間語言代碼202和可執(zhí)行代碼136關于虛方法槽指派是一致的。綁定器214將符號槽引用變換成可由作為綁定器的目標的執(zhí)行引擎140識別的數(shù)值虛方法表槽(例如,索引)。可以說“虛方法槽指派迄今尚未被綁定”來指示虛方法槽號在中間語言中未被指定。在某些實施例中,中間代碼可對虛方法使用符號引用,可讓虛槽指派是未指定的,并且可以讓虛方法的次序是未指定的。由此,可生成兩個可執(zhí)行的功能上等效的程序,它們之間的區(qū)別僅在于虛方法的虛表中的相對次序,即虛槽指派。某些實施例包括實現(xiàn)中間語言代碼202和可執(zhí)行代碼136之間的結構對應性的綁定器214。在某些實施例中,綁定器214比JIT編譯器更快且更容易實現(xiàn)/維護/移植,因為寄存器分配206已經(jīng)在到達該綁定器的中間語言代碼202中完成。在某些實施例中,中間語言代碼202和可執(zhí)行代碼136符合結構對應性,表現(xiàn)在中間語言代碼中通過符號引用類型146的偽指令212對應于可執(zhí)行代碼136中指定描述該類型的數(shù)據(jù)結構的地址的機器指令134。此處所稱的與中間代碼202和本機指令134/可執(zhí)行代碼136相關的“結構對應性”不限于程序數(shù)據(jù)結構的管理,尤其不限于對象126或結構144,而是在某些實施例中可以擴展來包含無用信息收集、異常處理、方法調用、以及軟件的其他方面,如此處所討論的。然而,某些偽指令直接針對管理諸如C結構體、Pascal記錄、以及這些和其他編程語言中相似的多字段/多成員數(shù)據(jù)結構之類的結構144。在某些實施例中,例如,中間語言代碼202和可執(zhí)行代碼136符合結構對應性,表現(xiàn)在中間語言代碼中用于復制其大小在中間語言代碼中未被指定的結構144(例如,結構體或記錄)的偽指令212對應于可執(zhí)行代碼中與特定結構大小相一致的機器指令134。例如,偽指令212可以聲明具有一類型的變量,該類型被指定為對該類型的符號引用248,該類型的實際大小在綁定器中而非在中間代碼生成器中確定。在某些實施例中,中間語言代碼202和可執(zhí)行代碼136符合結構對應性,表現(xiàn)在中間語言代碼中用于零初始化其大小在中間語言代碼中未被指定的結構144(例如,局部變量)的偽指令212對應于可執(zhí)行代碼中與特定結構大小相一致的機器指令。在某些實施例中,中間語言代碼202和可執(zhí)行代碼136符合結構對應性,表現(xiàn)在中間語言代碼中用于在例程中聲明其類型在中間語言代碼中通過符號指定的局部變量的偽指令212對應于可執(zhí)行代碼中符合在該例程中通過符號聲明的至少一個局部變量的至少一個特定局部變量大小的機器指令。例如,偽指令212可以零初始化某一類型的一部分存儲器,該類型在中間代碼202中通過符號指定。該存儲器可以是嵌入在某一其他類型內(nèi)的字段、數(shù)組的元素等等。還要注意,機器指令134可以通過結構對應性與中間代碼202相一致而不必以某種方式顯式地包含結構大小。例如,如果大小為8字節(jié)的結構在中間代碼202中零初始化,則所生成的本機代碼134序列可由以下三個指令構成第一個指令將零值加載到機器寄存器中,第二個和第三個指令將該機器寄存器存儲到該結構中的第一和第二個四字節(jié)存儲器部分中。在某些情況下,方法主體中僅全部偽指令212的累積大小(以及它們的對齊要求)才被表現(xiàn)為所生成的機器代碼134中的顯式常量。當訪問符號局部變量時,可執(zhí)行代碼中存在的是局部變量偏移量,其可取決于不僅僅是變量本身的大小和對齊要求,而且還有在前的局部變量的大小和對齊要求?,F(xiàn)在從特別針對結構144的偽指令轉開,在某些實施例中,中間語言代碼202和可執(zhí)行代碼136符合結構對應性,表現(xiàn)在中間語言代碼中用于類型的類型布局250描述的偽指令212至少部分地定義了虛槽索引到對該類型的方法主體的運行時映射,其中可執(zhí)行代碼136中的至少一個方法主體指針將虛方法130實現(xiàn)為以下各項之一新的虛方法、基類型中的虛方法的覆蓋。在某些實施例中,綁定器214構建與類型布局描述相一致的虛方法表(槽指派210)。虛方法表可被視為指向方法的指針的數(shù)組。每一類型具有其自己的虛方法表,但是默認地,指向方法的指針從基類型復制,除了在以下情況下。首先,當類型布局描述指定新的虛方法時,將新槽添加到針對該類型的虛方法表,指向該新方法的主體。其次,當類型布局描述指定了基類中的虛方法的覆蓋(override)時,綁定器查找該基類型中的方法的虛槽號。然后使派生類型的虛方法表中的該槽指向覆蓋方法(來自派生類型)而非來自基類型的方法。在某些實施例中,該系統(tǒng)建立虛槽索引到針對其布局被描述的類型的方法主體的映射,即,新的虛方法創(chuàng)建新的槽,并將其映射到新方法主體,而覆蓋將現(xiàn)有的虛槽映射到新方法。這可在不需要曾經(jīng)在中間代碼202中顯式地提到虛槽號的情況下完成。相反,代碼202被認為是實際上說出了“該方法獲得新槽”或者“該方法使用與該其他現(xiàn)有方法相同的槽”。綁定器214取得虛方法的該聲明性描述,以及什么虛方法覆蓋什么其他虛方法來構造供在運行時使用的高效映射。在某些實施例中,綁定器214生成既用于方法調用又用于虛方法調用的本機指令。對于方法調用,綁定器可能通過在模塊加載時填充的間接單元來提供地址以調用。對于虛方法調用,綁定器將合成包含該虛槽號的機器代碼序列,這涉及來自在其上調用該虛方法的對象的一個或多個間接手段。在某些實施例中,中間語言代碼202和可執(zhí)行代碼136符合結構對應性,表現(xiàn)在中間語言代碼中的無用信息收集器探測偽指令212、216在位置上對應于可執(zhí)行代碼136中在執(zhí)行時將檢查待決無用信息收集的機器指令134。在某些實施例中,中間語言代碼202和可執(zhí)行代碼136符合結構對應性,表現(xiàn)在中間語言代碼中的對象分配偽指令212、218在位置上對應于可執(zhí)行代碼136中在執(zhí)行時將分配存儲器來保持中間語言代碼中指定的類型的對象126的機器指令134。在某些實施例中,中間語言代碼202和可執(zhí)行代碼136符合結構對應性,表現(xiàn)在中間語言代碼中的異常拋出偽指令212、220在位置上對應于可執(zhí)行代碼中在執(zhí)行時將拋出在中間語言代碼中指定的寄存器138中標識的異常對象的機器指令134。在某些實施例中,中間語言代碼202和可執(zhí)行代碼136符合結構對應性,表現(xiàn)在中間語言代碼中的虛調用方法偽指令212、222在位置上對應于可執(zhí)行代碼中在執(zhí)行時將作出對在中間語言代碼中通過符號標識的方法的虛調用的機器指令134。在某些實施例中,中間語言代碼202和可執(zhí)行代碼136符合結構對應性,表現(xiàn)在中間語言代碼中的靜態(tài)調用方法偽指令212、224在位置上對應于可執(zhí)行代碼中在執(zhí)行時將作出對在中間語言代碼中通過符號標識的方法的靜態(tài)調用的機器指令134。在某些實施例中,中間語言代碼202和可執(zhí)行代碼136符合結構對應性,表現(xiàn)在中間語言代碼中的尾調用方法偽指令212、226在位置上對應于可執(zhí)行代碼中在執(zhí)行時將作出對在中間語言代碼中通過符號標識的方法的尾調用的機器指令134。在某些實施例中,中間語言代碼202和可執(zhí)行代碼136符合結構對應性,表現(xiàn)在中間語言代碼中的運行時類型直接調用方法偽指令212、230在位置上對應于可執(zhí)行代碼中在執(zhí)行時將作出對在中間語言代碼中通過符號標識的運行時類型的方法的直接調用的機器指令134。在某些實施例中,中間語言代碼202和可執(zhí)行代碼136符合結構對應性,表現(xiàn)在中間語言代碼中的托管對象字段訪問偽指令212、232在位置上對應于可執(zhí)行代碼中在執(zhí)行時將使用字段偏移量來訪問無用信息收集堆上的對象126的字段128的機器指令134,該字段偏移量在中間語言代碼中未被指定。在某些實施例中,中間語言代碼202和可執(zhí)行代碼136符合結構對應性,表現(xiàn)在中間語言代碼包含指示以下的至少一項的無用信息收集指針偽指令212、240無用信息收集器指針被壓到棧上、無用信息收集器指針從棧中彈出、無用信息收集器指針變?yōu)闊o效、不是無用信息收集器指針的值被壓到棧上。在某些實施例中,中間語言代碼202和可執(zhí)行代碼136符合結構對應性,表現(xiàn)在中間語言代碼包含指示無用信息收集器寫屏障的狀態(tài)的無用信息收集寫屏障偽指令214、242。在某些實施例中,類型可以嵌入其他類型。在某些實施例中,棧幀的一些部分可使用符號布局,例如,局部變量可以是其大小和布局由綁定器來計算的類型。代碼的大小通常是要考慮的問題,尤其是對于中間代碼和本機代碼,并且改變代碼大小的操作可使得嵌入在代碼內(nèi)的跳轉和其他地址無效。在某些實施例中,綁定器214將占據(jù)X字節(jié)空間的偽指令212變換成具有不同字節(jié)數(shù)的本機指令。本機代碼可以大于或小于對應的中間代碼。在某些實施例中,綁定器214確定并插入基于改變代碼大小的跳轉/調用地址,而非如熟悉的鏈接器所完成的基于給定地址和固定偏移量的地址。即,此類綁定器能夠正確地處理鏈接器不能正確處理的地址生成/更新情形。綁定器214可確定指令何時能使用較小的編碼(取決于字段偏移量的大小和虛槽號),并相應地調整分支距離。某些實施例在“云”計算環(huán)境和/或“云”存儲環(huán)境中操作。例如,源代碼120可以在聯(lián)網(wǎng)云中的多個設備/系統(tǒng)102上,對應的中間代碼202可以被存儲在云內(nèi)的又一些其他設備上,且對應的可執(zhí)行代碼136可以配置另外一些其他云設備/系統(tǒng)102上的存儲器。例如,編譯源代碼120來產(chǎn)生中間語言代碼202可在一個機器上發(fā)生,而綁定該中間語言代碼202來產(chǎn)生可執(zhí)行代碼136可在中間語言代碼202被部署到不同機器之后發(fā)生。過程圖3到7示出了某些過程實施例。圖5到7共同形成一流程圖500。圖中所示的過程在某些實施例中可以例如由中間代碼生成器204和綁定器214在需要極少或不需要用戶輸入的腳本的控制下自動執(zhí)行。各過程可以部分地自動執(zhí)行,且部分地手動執(zhí)行,除非另外指明。在給定實施例中,可以重復一過程的零或多個所示步驟,可能對不同參數(shù)或數(shù)據(jù)進行操作。一實施例中的各步驟也可按與圖5到7中列出的從上到下次序不同的次序來完成。各步驟可以串行地、以部分重疊的方式、或完全并行地執(zhí)行。遍歷流程圖500來指示在一過程期間執(zhí)行的步驟的次序可以在過程的一種執(zhí)行與過程的另一種執(zhí)行之間變化。流程圖遍歷次序也可在一個過程實施例與另一過程實施例之間變化。各步驟可被省略、組合、重命名、重組合、或采用其他方式,而不脫離所示流程,只要所執(zhí)行的過程是可操作的且符合至少一個權利要求。此處提供了各示例來幫助說明該技術的各方面,但是本文中給出的示例并未描述所有可能的實施例。各實施例不限于此處提供的具體實現(xiàn)、排列、顯示、特征、方法或情形。給定實施例可以例如包括另外的或不同的特征、機制和/或數(shù)據(jù)結構,并且還可另外脫離此處提供的示例。圖3示出了過程和其他實施例,特別關注基類124的處理中的版本回復力。源代碼120(本實例中包括至少一個基類124)被輸入到編譯器132中,編譯器生成用于至少一個模塊122的中間語言代碼202,在該中間代碼202中包括偽指令212和本機代碼指令134。中間代碼202進而被饋送到綁定器214,綁定器214例如通過基于類型布局250信息來計算字段128的數(shù)值偏移量,并通過使用這些數(shù)值偏移量來替換曾經(jīng)在偽指令中使用的符號字段引用,將偽指令212解析成本機代碼指令134。圖4示出了過程和其他實施例,特別關注處理圖2中所枚舉的無用信息收集和/或其他偽代碼類別時的版本回復力。源代碼120被輸入到編譯器132中,編譯器生成MSIL,其是一種熟悉的中間語言代碼;MSIL代表“微軟中間語言”。與MSIL代碼指令相關聯(lián)的是熟悉的元數(shù)據(jù)404。包括其元數(shù)據(jù)的MSIL被饋送到MDIL生成器,MDIL生成器是生成器204的一個示例。MDIL生成器生成MDIL代碼408及其相關聯(lián)的元數(shù)據(jù)410。MDIL代表“機器相關中間語言”,且是中間語言代碼202的一個示例。在MDIL本機指令和底層的MSIL指令之間可以存在某些重疊,并且在MDIL元數(shù)據(jù)和MSIL元數(shù)據(jù)之間可以存在某些重疊。然而,MSIL不包括此處討論的屬于MDIL的偽指令212。MDIL中間代碼202被饋送到綁定器214,綁定器214通過置換、映射和/或此處討論的其他方式,將偽指令212解析成本機代碼指令134,包括諸如虛方法槽指派表和無用信息收集卡表等本機代碼數(shù)據(jù)結構412?,F(xiàn)在轉向圖5到7,將介紹各種步驟。這些步驟的各方面也在本文的別處討論。在基類源代碼獲得步驟502期間,一實施例獲得包括至少一個基類124的聲明的源代碼120。步驟502例如可以使用文件系統(tǒng)、源代碼編輯器和/或其他熟悉的機制來完成。在中間代碼生成步驟504期間,一實施例生成中間代碼202。在某些配置或某些實施例中,僅生成中間代碼指令,但是在其他配置或實施例中,步驟504生成元數(shù)據(jù)(例如,MDIL元數(shù)據(jù)410)作為中間代碼202的一部分。步驟504可以使用語法分析、樹遍歷、表查找和/或適用于如此處所教示地生成具有偽指令212的中間代碼202的其他熟悉的機制來完成。在對象字段布局改變回復力保持步驟506期間,一實施例保持對象字段布局208在中間代碼202中未綁定。例如,對象字段128偏移量可以是符號的而非硬編碼的(此處稱為“數(shù)值的”),其開發(fā)依賴于綁定器214來在中間代碼202被綁定到特定目標引擎140時確定并插入數(shù)值字段偏移量。在虛方法槽指派改變回復力保持步驟508期間,一實施例保持虛方法槽指派210在中間代碼202中未綁定。例如,虛方法130槽指派可以未被指定,其開發(fā)依賴于綁定器214來在中間代碼202被綁定到特定目標引擎140時確定并使用數(shù)值虛方法槽指派。在符號引用使用步驟510期間,一實施例例如通過放置符號引用和/或通過將符號引用變換成數(shù)值引用,來在中間代碼202中使用符號引用248。在通過符號標識步驟512期間,一實施例通過符號標識中間代碼202中的字段128,而非例如將字段標識為數(shù)值偏移量。步驟512是步驟510的一個示例,其中符號引用指的是字段。在字段次序獨立性保持步驟514期間,一實施例保持字段次序在中間代碼202中未綁定。當對象字段128偏移量通過符號來表示而非被表示為數(shù)值字段偏移量時,步驟514的一個實例可以是例如步驟512和506的示例。在偽指令表達步驟516期間,使用一個或多個偽指令212來表達一個多個項,如字段、類型、虛方法、調用、或關于無用信息收集的指針狀態(tài)等。圖2枚舉了某些種類的偽指令,本文也討論了其他示例。表達步驟516可以在中間語言代碼生成步驟504期間進行。以下討論的步驟518到543是表達步驟516的某些示例,其聚焦于某些種類的偽指令212。在字段訪問表達步驟518期間,一實施例例如使用諸如托管對象字段訪問偽指令212,232等一個或多個偽指令212來表達字段128訪問520(讀和/或寫)。在方法調用表達步驟522期間,一實施例使用一個或多個偽指令212,如靜態(tài)調用方法偽指令212、224,尾調用方法偽指令212、226,執(zhí)行引擎服務調用偽指令212、228,或運行時類型直接調用方法偽指令212、230,來表達非虛方法調用524。在虛調用表達步驟526期間,一實施例例如使用諸如虛調用方法偽指令212、222等一個或多個偽指令212來表達虛調用528。在方法前序處理表達步驟526期間,一實施例使用一個或多個偽指令212來表達方法前序處理532。在方法結尾處理表達步驟534期間,一實施例使用一個或多個偽指令212來表達方法結尾處理536。在綁定步驟538期間,一實施例將偽指令212綁定到本機指令134,在偽指令212的基礎上選擇本機指令134,基于偽指令212產(chǎn)生本機代碼數(shù)據(jù)結構412,和/或如此處所教示地在產(chǎn)生本機指令134時以其他方式處理偽指令212。重新綁定步驟也被稱為步驟538;在重新綁定期間,綁定器214可再次綁定該綁定器(或另一綁定器)先前綁定538的某些中間代碼。在可執(zhí)行代碼產(chǎn)生步驟540(其也可被稱為代碼準備步驟540)期間,一實施例至少部分地基于底層的偽指令212來產(chǎn)生、準備、更新、生成、和/或以其他方式提供本機指令134以供在可執(zhí)行代碼136中使用。步驟540可以例如由綁定器214來執(zhí)行。在修訂步驟542期間,一實施例或者自動地或者在人類用戶104的指示和詳細控制下,修訂源代碼120。在代碼執(zhí)行步驟544期間,一實施例執(zhí)行本機指令134,如部分地在綁定器214的努力下產(chǎn)生的可執(zhí)行代碼136中的本機指令。在長度變換步驟602期間,一實施例將偽指令212或偽指令212的集合變換成其表示占據(jù)了與偽指令212的表示不同的字節(jié)數(shù)的本機指令134。如同此處對“變換”和相似術語的其他討論一樣,底層偽指令212可經(jīng)歷了變換之后仍存在,和/或偽指令212可能不再存在而是被原地替換。在局部變量大小確定和指定步驟期間,其對應于且此處為了方便起見被單獨且聯(lián)合地稱為步驟604,一實施例確定其大小未在底層偽指令212中被指定的局部變量的本機代碼大小。步驟604可以作為例如綁定步驟538的一部分來執(zhí)行。在棧幀偏移量大小確定和指定步驟期間,其對應于且此處為了方便起見被單獨且聯(lián)合地稱為步驟606,一實施例確定未在底層偽指令212中被指定的本機代碼棧幀偏移量。步驟606可以作為例如綁定步驟538的一部分來執(zhí)行。在棧幀對齊確定和指定步驟期間,其對應于且此處為了方便起見被單獨且聯(lián)合地稱為步驟608,一實施例確定未在底層偽指令212中被指定的本機代碼棧幀對齊。步驟608可以作為例如綁定步驟538的一部分來執(zhí)行??梢岳斫?,步驟608并不對齊棧幀本身。相反,棧幀中的各個變量具有在步驟608期間確定的對齊要求。綁定器也根據(jù)這些對齊要求來指派棧幀偏移量。在類型符號引用變換步驟610(也可被稱為類型解析)期間,一實施例將對位于偽指令212中的類型的符號引用248變換成對位于本機指令134中的具體類型的使用。不像符號類型引用,具體類型具有例如數(shù)值大小,并且如果類型具有字段/成員,則具體類型也具有具體字段/成員次序。步驟610可以作為例如綁定步驟538的一部分來執(zhí)行。在字段符號引用變換步驟612(也可被稱為字段解析)期間,一實施例將對位于偽指令212中的字段的符號引用248變換成對位于本機指令134中的具體字段的使用。不像符號字段引用,具體字段具有例如數(shù)值大小和偏移量。步驟612可以作為例如綁定步驟538的一部分來執(zhí)行。在成員符號引用變換步驟614(也可被稱為成員解析)期間,一實施例將對位于偽指令212中的成員的符號引用248變換成對位于本機指令134中的具體成員的使用。不像符號成員引用,具體成員具有例如數(shù)值大小和偏移量。步驟614可以作為例如綁定步驟538的一部分來執(zhí)行。在槽符號引用變換步驟616(也可被稱為槽解析或槽指派)期間,一實施例將對位于偽指令212中的虛方法槽的符號引用248變換成對位于本機指令134中的具體槽的使用。不像符號槽引用,具體槽例如在諸如虛方法表等運行時數(shù)據(jù)結構中具有數(shù)值。步驟616可以作為例如綁定步驟538的一部分來執(zhí)行。在對應性實現(xiàn)步驟618期間,一實施例實現(xiàn)偽指令212和本機指令134之間的結構對應性620。步驟618可以例如通過執(zhí)行以下步驟的一個或多個來完成重新綁定538、變換602、610、612、614、616。在復制偽指令使用步驟622期間,一實施例使用以下偽指令212該偽指令將向綁定器214指示需要某些本機指令134,即在被執(zhí)行時將復制結構624的本機指令134。結構624的大小未在偽指令212中指定,但卻是/將在本機指令134中指定。偽指令212可通過例如將其放置在中間語言代碼202中和/或通過將偽指令212變換成本機指令134來被使用622。在零偽指令使用步驟626期間,一實施例使用以下偽指令212該偽指令將向綁定器214指示需要某些本機指令134,即在被執(zhí)行時將使結構624置零的本機指令134。結構624的大小未在偽指令212中指定,但卻是/將在本機指令134中指定。偽指令212可通過例如將其放置在中間語言代碼202中和/或通過將偽指令212變換成本機指令134來被使用626。在局部變量聲明偽指令使用步驟628期間,一實施例使用以下偽指令212該偽指令將向綁定器214指示需要某些本機指令134,即在被執(zhí)行時將聲明具有某一類型的局部變量630的本機指令134。類型可通過使用510符號類型引用來指定。在某些實施例中,局部變量630及其類型的各方面未在偽指令212中指定,但卻是/將在本機指令134中指定。這些方面可包括例如局部變量和/或局部變量的類型的大小、對齊要求、以及棧幀偏移量。偽指令212可通過例如將其放置在中間語言代碼202中和/或通過將偽指令212變換成本機指令134來被使用628。在虛方法槽映射步驟632期間,例如,作為實現(xiàn)618對應性630的一部分,一實施例將一個或多個虛方法槽映射到一個或多個方法主體。步驟632可以是(重新)綁定步驟538的一部分。在存儲器配置步驟636期間,存儲器介質112由中間語言代碼202或其包含偽指令212的一部分、由用于生成這一代碼202的生成器204、由用于綁定這一代碼202的綁定器214、和/或關于此處討論的改變回復力代碼的其他方式來配置。在無用信息收集器探測偽指令使用步驟702期間,一實施例通過將指令216放在中間代碼202中和/或通過將偽指令216變換成例如在執(zhí)行時將檢查待決無用信息收集的機器指令134(以及可能的相關聯(lián)的數(shù)據(jù)/元數(shù)據(jù))來使用無用信息收集器探測偽指令216。在對象分配偽指令使用步驟704期間,一實施例通過將指令218放在中間代碼202中和/或通過將偽指令218變換成例如在執(zhí)行時將為對象126分配存儲器空間的機器指令134(以及可能的相關聯(lián)的數(shù)據(jù)/元數(shù)據(jù))來使用對象分配偽指令218。在異常拋出偽指令使用步驟706期間,一實施例通過將指令220放在中間代碼202中和/或通過將偽指令220變換成例如在執(zhí)行時將拋出異常的機器指令134(以及可能的相關聯(lián)的數(shù)據(jù)/元數(shù)據(jù))來使用異常拋出偽指令220。在虛調用方法偽指令使用步驟708期間,一實施例通過將指令222放在中間代碼202中和/或通過將偽指令222變換成例如在執(zhí)行時將對指令222所標識的方法作出虛調用的機器指令134(以及可能的相關聯(lián)的數(shù)據(jù)/元數(shù)據(jù))來使用虛調用方法偽指令222。在靜態(tài)調用方法偽指令使用步驟710期間,一實施例通過將指令224放在中間代碼202中和/或通過將偽指令224變換成例如在執(zhí)行時將對指令224所標識的方法作出靜態(tài)調用的機器指令134(以及可能的相關聯(lián)的數(shù)據(jù)/元數(shù)據(jù))來使用靜態(tài)調用方法偽指令224。在尾調用方法偽指令使用步驟712期間,一實施例通過將指令226放在中間代碼202中和/或通過將偽指令226變換成例如在執(zhí)行時將對指令226所標識的方法作出尾調用的機器指令134(以及可能的相關聯(lián)的數(shù)據(jù)/元數(shù)據(jù))來使用尾調用方法偽指令226。在執(zhí)行引擎服務調用偽指令使用步驟714期間,一實施例通過將指令228放在中間代碼202中和/或通過將偽指令228變換成例如在執(zhí)行時將對指令228所標識的執(zhí)行引擎140服務作出調用的機器指令134(以及可能的相關聯(lián)的數(shù)據(jù)/元數(shù)據(jù))來使用執(zhí)行引擎服務調用偽指令224。在運行時類型直接調用過方法偽指令使用步驟716期間,一實施例通過將指令230放在中間代碼202中和/或通過將偽指令230變換成例如在執(zhí)行時將對指令230通過符號標識的方法作出調用的機器指令134(以及可能的相關聯(lián)的數(shù)據(jù)/元數(shù)據(jù))來使用運行時類型直接調用方法偽指令230。在托管對象字段訪問偽指令使用步驟718期間,一實施例通過將指令232放在中間代碼202中和/或通過將偽指令232變換成例如在執(zhí)行時將訪問指令232所標識的對象126的字段128的機器指令134(以及可能的相關聯(lián)的數(shù)據(jù)/元數(shù)據(jù))來使用托管對象字段訪問偽指令232。在堆指針指定偽指令使用步驟720期間,一實施例通過將指令234放在中間代碼202中和/或通過將偽指令234變換成例如在執(zhí)行時將使用指令234所標識的指針來管理用于堆的無用信息收集的機器指令134(以及可能的相關聯(lián)的數(shù)據(jù)/元數(shù)據(jù))來使用堆指針指定偽指令234。在實例化查找偽指令使用步驟722期間,一實施例通過將指令236放在中間代碼202中和/或通過將偽指令236變換成例如在執(zhí)行時將使用指令236所標識的類屬代碼實例化的機器指令134(以及可能的相關聯(lián)的數(shù)據(jù)/元數(shù)據(jù))來使用實例化查找偽指令236。在可中斷區(qū)域偽指令使用步驟724期間,一實施例通過將指令238放在中間代碼202中和/或通過將偽指令238變換成例如在執(zhí)行時將管理用于緊湊循環(huán)和/或至少部分地由指令238來界定或以其他方式來標識的其他代碼區(qū)域的無用信息收集的機器指令134(以及可能的相關聯(lián)的數(shù)據(jù)/元數(shù)據(jù))來使用可中斷區(qū)域偽指令238。在無用信息收集指針偽指令使用步驟726期間,一實施例通過將指令240放在中間代碼202中和/或通過將偽指令240變換成例如在執(zhí)行時將使用指令240所標識的指針來管理無用信息收集的機器指令134(以及可能的相關聯(lián)的數(shù)據(jù)/元數(shù)據(jù))來使用無用信息收集指針偽指令240。在無用信息收集寫屏障偽指令使用步驟728期間,一實施例通過將指令242放在中間代碼202中和/或通過將指令242變換成例如在執(zhí)行時將管理無用信息收集寫屏障的機器指令134(以及可能的相關聯(lián)的數(shù)據(jù)/元數(shù)據(jù))來使用無用信息收集寫屏障偽指令242。在地址模式修改器偽指令使用步驟730期間,一實施例通過將指令244放在中間代碼202中和/或通過將偽指令244變換成例如在執(zhí)行時將由地址模式修改來控制的機器指令134(以及可能的相關聯(lián)的數(shù)據(jù)/元數(shù)據(jù))來使用地址模式修改器偽指令244。偽指令244中的地址模式修改器修改作為從包含地址模式修改器的偽指令244的轉換獲得的本機指令134的一部分的本機地址模式。在靜態(tài)基址偽指令使用步驟732期間,一實施例通過將指令246放在中間代碼202中和/或通過將偽指令246變換成例如在執(zhí)行時將提供靜態(tài)變量存儲區(qū)域的基址的機器指令134(以及可能的相關聯(lián)的數(shù)據(jù)/元數(shù)據(jù))來使用靜態(tài)基址偽指令246。在某些實施例中,所生成的機器指令還可檢查類是否已經(jīng)被初始化,并且如果尚未完成則觸發(fā)初始化。在不同機器使用步驟734期間,一實施例可使用與用于生成504代碼202的計算機或設備不同的計算機或其他設備來綁定538代碼202,或者該實施例可使用與將用于綁定538代碼202的計算機或設備不同的計算機或其他設備來生成504代碼202。換言之,步驟734可在綁定或在生成時進行,只要已經(jīng)或將用于綁定和用于生成的機器能在進行步驟734時被標識,并且只要這些機器不是同一個機器。如果將用于綁定代碼的機器在生成代碼時是未知的,則在生成代碼時不進行步驟734。出于步驟734的目的,如果兩個機器具有單獨可控的電源,即,如果人類用戶有可能關閉一個機器而不用因此也關閉另一個機器,和/或如果人類用戶有可能打開一個機器而不用因此也打開另一機器,則這兩個機器構成不同機器。上述步驟及其相互關系將在下文結合各實施例來更詳細討論。某些實施例提供了方便對涉及軟件產(chǎn)品的基類124的改變的管理的過程。該過程包括在存儲器內(nèi)獲得502基類源代碼120,以及在存儲器內(nèi)從該基類源代碼生成中間語言代碼202,在該中間語言代碼中,寄存器分配206是執(zhí)行就緒的,但是以下的至少一項尚未綁定對象字段布局208、虛方法槽指派210。例如,在一個實施例中,生成步驟生成504其中對象字段布局208尚未綁定的中間語言代碼202,并且至少部分地通過生成使用510符號引用248而非直接偏移量來標識字段128的中間語言代碼來這樣做。作為另一示例,在一個實施例中,生成步驟生成504其中對象字段布局208尚未綁定的中間語言代碼202,并且至少部分地通過生成字段次序無關的中間語言代碼來這樣做。在某些實施例中,生成步驟生成504既包括本機指令134又包括偽指令212的中間語言代碼202。具體地,一實施例可生成其中使用偽指令來表達516以下的至少一項的代碼202字段訪問、方法調用、虛方法調用、整個方法前序處理、方法前序處理的至少一部分、整個方法結尾處理、方法結尾處理的至少一部分。在某些實施例中,該過程聚焦于生成504代碼202,且不必包括綁定538。在其他實施例中,該過程的確包括綁定538中間語言代碼202且因此產(chǎn)生540可執(zhí)行代碼136,即,可由至少一個設備上的處理器110執(zhí)行的代碼。綁定538可在不同上下文中進行。例如,在某些實施例中,該過程包括首先綁定538中間語言代碼202且因此產(chǎn)生540與執(zhí)行引擎140的第一版本一起使用的第一可執(zhí)行代碼136,其次綁定相同的中間語言代碼202且因此產(chǎn)生540與執(zhí)行引擎140的第二版本一起使用的第二可執(zhí)行代碼136。換言之,在某些情況下,相同的中間代碼可用于為引擎140的不同版本產(chǎn)生不同可執(zhí)行代碼,由此示出了中間代碼202對于執(zhí)行引擎改變的回復力。某些實施例提供了管理涉及軟件產(chǎn)品的基類124的改變的過程。該過程包括獲得502用于模塊A的初始源代碼A,包括在該初始源代碼A中聲明的初始基類A,并且獲得502用于模塊B的源代碼B,包括對初始基類A的依賴關系。該過程還包括通過編譯初始源代碼A來生成504初始中間語言代碼A,并通過編譯源代碼B來生成504初始中間語言代碼B。這些初始中間語言代碼用于創(chuàng)建可執(zhí)行代碼。即,該過程包括通過綁定538初始中間語言代碼A來準備540初始可執(zhí)行代碼A,并通過綁定538初始中間語言代碼B來準備540初始可執(zhí)行代碼B。以上步驟可被視為預備性的,或上下文的。在其執(zhí)行的上下文中,一實施例獲得502用于模塊A中的修訂的基類A的修訂的542源代碼A,修訂的基類A在以下方面的至少一個中不同于初始基類A添加了字段、移除了私有字段、重新安排了字段次序、添加了虛方法、重新安排了虛方法次序。該過程實施例通過編譯修訂的源代碼A在手邊生成504修訂的中間語言代碼A。接著,該實施例通過綁定538修訂的中間語言代碼A來準備540修訂的可執(zhí)行代碼A,并通過在引用修訂的中間語言代碼A時重新綁定538初始中間語言代碼B來準備540修訂的可執(zhí)行代碼B。以此方式,該過程避免了源代碼B的重新編譯。然后可以按照在修訂的基類A的執(zhí)行期間沒有任何字段偏移量沖突且沒有任何虛方法槽指派沖突的方式,用修訂的可執(zhí)行代碼B來執(zhí)行修訂的可執(zhí)行代碼A。即,該過程示出了在面對對基類124的改變時中間語言代碼202的回復力。作為回復力的進一步說明,考慮涉及至少兩個模塊的情形,例如,包含基類“Base”的模塊“Α”和或者包含從“Base”派生的類“Derived”或者也許僅包含使用來自“Base”的字段或方法的代碼的模塊“B”。兩個模塊的初始版本被編譯成中間語言,然后被綁定來獲得A和B的可執(zhí)行模塊。然后,模塊A按照上述方式(添加字段、移除私有字段、重新安排字段次序、添加虛方法、重新安排虛方法次序)之一來改變,并且僅重新編譯模塊A。然后,重新綁定538兩個模塊來獲得新的可執(zhí)行代碼。在這些情形中,可通過確保類型“Base”的布局在模塊A和B兩者的可執(zhí)行代碼中是一致的來促進正確性。例如,如果在模塊A和B中都訪問“Base”中的字段,則兩個模塊使用相同的偏移量;如果偏移量不同則不正確程序行為的風險會變高。類似地,如果在兩個模塊中都訪問了虛方法,則確保它們使用相同的虛槽號降低了模塊A中的改變所導致的不正確程序行為的風險。如果模塊B中的派生類型添加更多字段,則確保其偏移量不會與A中的任何字段偏移量沖突降低了不正確程序行為的風險;如果對不同字段使用相同的偏移量則會發(fā)生毀壞。類似地,如果模塊B中的派生類型添加更多虛方法,則確保其虛槽不與A使用的任何虛槽沖突降低了風險;如果對不同方法使用相同的槽號則會發(fā)生毀壞。某些實施例通過確保即使添加了新方法和字段或者重新安排了現(xiàn)有方法和字段,用于類型、方法和字段的符號標簽跨各版本也保持相同,來幫助降低風險。這些符號標記此處有時被稱為“令牌”或符號引用248。在某些實施例中,綁定538中間語言代碼202涉及將訪問存儲器112的中間語言偽指令212變換成具有與中間語言偽指令不同的長度(以字節(jié)為單位)的對應的本機語言指令134。結果,綁定器214可以比熟悉的鏈接器更復雜。綁定器214可被配置成調整本機代碼134中的跳轉,使得它們?nèi)匀惶D到其預期的目標,其位置取決于具體偽指令212和其各自的本機代碼134之間的變化的長度差別。相反,熟悉的修補可以簡單地向每一跳轉添加固定的量。在某些實施例中,在以上討論的初始中間語言代碼B中未指定局部變量的大小,并且重新綁定538初始中間語言代碼B涉及確定604該大小并在修訂的可執(zhí)行代碼B中指定該大小。在某些實施例中,在初始中間語言代碼B中未指定局部變量的棧幀偏移量,并且重新綁定538初始中間語言代碼B涉及確定606該棧幀偏移量并在修訂的可執(zhí)行代碼B中指定該棧幀偏移量。在某些實施例中,在初始中間語言代碼B中未指定局部變量的棧幀偏移量對齊要求,并且重新綁定538初始中間語言代碼B涉及確定608該棧幀偏移量對齊要求,并且根據(jù)該棧幀偏移量對齊要求來確定局部變量的棧幀偏移量。例如,關于局部變量的對齊要求,局部變量的棧幀偏移量可能需要除以2的某一冪(通常是1、2、4、8或16),取決于該變量的類型。這一對齊要求可以在版本化期間改變。例如,如果結構體僅包含32位整數(shù),則其偏移量必須被對齊到4的倍數(shù),但是如果稍后添加了8字節(jié)的雙精度字段,則該變量偏移量必須是8的倍數(shù),取決于處理器架構和操作系統(tǒng)約定。某些實施例例如通過使用510符號引用和/或偽指令212的其他方面來提供關于這一對齊要求改變的改變回復力。在某些實施例中,初始中間語言代碼B包括對在以上討論的修訂的基類A中定義的類型的符號引用248,并且重新綁定538初始中間語言代碼B涉及將該符號引用變換成利用描述該類型的數(shù)據(jù)結構的地址的修訂的可執(zhí)行代碼B中的引用。換言之,可執(zhí)行代碼136最終包含描述該類型的數(shù)據(jù)結構(類型描述符)的地址,或者它包含含有該類型描述符的地址的間接單元的地址。前一種引用類型的方式一般在模塊內(nèi)使用,后一種方式用于引用駐留在另一模塊中的類型描述符。出于步驟510的目的,“利用”(即,使用)類型描述符地址,而不管其是直接使用的還是經(jīng)由間接單元使用的。在某些實施例中,上述初始中間語言代碼B包括對字段128的符號引用248,并且重新綁定538初始中間語言代碼B涉及將該符號引用變換成修訂的可執(zhí)行代碼B中的數(shù)值偏移量。在某些情況下,字段不是原語類型(其中大小是已知的),而是其大小可在版本化期間改變的復合類型。某些實施例因此使用622、626偽指令,如本文別處討論的MDILINIT_STRUCT(初始化結構體)、C0PY_STRUCT(復制結構體)、PUSH_STRUCT(壓入結構體)偽指令212。在某些實施例中,上述初始中間語言代碼B包括對模塊A中定義的成員的符號引用248,并且重新綁定538初始中間語言代碼B包括將該符號引用變換成修訂的可執(zhí)行代碼B中的以下各項中的至少一項數(shù)值偏移量、指向方法主體的直接指針、指向方法主體的間接指針、虛槽號。例如,在MDIL中,memberref(成員引用)令牌可以指字段或方法。在字段的情況下,他們通過綁定538被變換成數(shù)值偏移量。在方法的情況下,通過綁定538,它們或者成為指向該方法的主體的(直接或間接)指針(這是對于普通方法調用),或者它們成為插入到可執(zhí)行代碼序列中的虛槽號(在虛調用的情況下)。某些實施例提供了涉及對于軟件產(chǎn)品的改變回復中間語言代碼202的過程。該過程包括在存儲器內(nèi)獲得502源代碼(對于基類和/或其他軟件項),以及在存儲器內(nèi)從該源代碼生成504其中寄存器分配206是執(zhí)行就緒的中間語言代碼202。所生成的中間語言代碼202在該代碼202內(nèi)的特定位置包含圖2中按照名稱枚舉的偽指令212中的至少一個,即偽指令216到242中的至少一個。配置的介質某些實施例包括配置的計算機可讀存儲介質112。介質112可包括盤(磁、光或其他)、RAM、EEPROM或其他ROM、和/或其他可配置存儲器,包括在特定的非瞬態(tài)計算機可讀介質(與線路和其他傳播信號介質形成對比)。配置的存儲介質可以特別地是諸如CD、DVD或閃存等可移動存儲介質114。可以是可移動或不可移動并且可以是易失性或非易失性的通用存儲器可被配置成使用數(shù)據(jù)118和指令116形式的從可移動介質114和/或諸如網(wǎng)絡連接等另一源讀取的諸如偽指令212和/或綁定器214等項目來形成配置的介質的實施方式。配置的介質112能夠使計算機系統(tǒng)執(zhí)行用于如此處公開的生成和/或變換回復中間語言代碼202的過程步驟。圖1到7因而幫助示出配置的存儲介質實施方式和進程實施方式,以及系統(tǒng)和進程實施方式。具體而言,圖3到7所示或此處另外教示的過程步驟中的任一個可用于幫助配置存儲介質來形成配置的介質實施例。其他示例以下提供其他細節(jié)和設計考慮。如同此處的其他示例一樣,在一給定實施例中,所描述的特征可個別和/或組合地使用,或完全不使用。本領域的技術人員將理解,實現(xiàn)細節(jié)可涉及諸如具體API和具體樣本程序等具體代碼,因此不需要出現(xiàn)在每一實施例中。本領域的技術人員還將理解,討論細節(jié)時所使用的程序標識符和某些其他術語,包括例如要求和結果的陳述,是特定于實現(xiàn)的,且因此不需要屬于每一實施例。具體地,在討論MDIL的各示例中對術語“偽指令”的使用可以更寬泛,或者另外與在上文中對該術語的使用不一致,例如,通過將MDIL指令稱為偽指令,即使它們可能缺乏上述偽指令212的某些特性。同樣,上述綁定器214不必具有以下討論的MDIL綁定器的每一個特征或能力。盡管如此,雖然不要求它們一定存在于此,但是提供了關于MDIL的這些細節(jié),因為它們可通過提供上下文來幫助一些讀者。MDIL還示出了以上結合中間語言代碼202、偽指令212和綁定器214所討論的技術的許多可能的實現(xiàn)中的某一些。MDIL指令集解釋了MDIL代碼中的指令格式和約定。本節(jié)討論了MDIL指令的二進制編碼和語義。介紹什么是MDIL?MDIL是比MSIL更低級的中間語言。它對機器獨立性的目標不抱希望——事實上,縮寫MDIL代表了機器相關中間語言。MDIL不與MSIL競爭——相反,經(jīng)歷MDIL是編譯流水線從如C#、VisualBasic、托管C++等語言中的源代碼經(jīng)由MSIL到本機代碼(微軟公司的標記)中的另一步驟。MDIL不試圖抽象目標處理器的特性,但是它仍提供了針對托管代碼和正在為其編譯MDIL代碼的執(zhí)行引擎的版本化的隔離層。MDIL不是直接可執(zhí)行的。相反,綁定器讀取MDIL代碼并從中產(chǎn)生可執(zhí)行機器代碼。MDIL代碼因此讓人想起經(jīng)歷鏈接器來產(chǎn)生最終可執(zhí)行機器代碼的未托管代碼的編譯所得的目標文件。然而,MDIL中的偽指令可以比傳統(tǒng)的目標文件中的修補更進一步——并非僅僅修補指令的各部分(像地址字段),MDIL偽指令可以生成長度可能不同于偽指令的新的本機指令。由此,MDIL綁定器比鏈接器更復雜,因為綁定器必須調整所得的本機代碼中的跳轉,如此它們?nèi)蕴D到其預期目標。隨著這一增加的復雜性還帶來了增加的能力——MDIL代碼對于添加新字段或虛方法的基類型能夠是穩(wěn)健的,因此它可被認為是對“脆弱基類問題”的解決方案。MDIL代碼示例此處是一個采用C#的簡單的介紹性代碼示例并且,此處是在MDIL中該示例可能編譯成什么,其中添加了一些注釋權利要求1.一種用數(shù)據(jù)和指令配置的計算機可讀非瞬態(tài)存儲介質,所述指令在被至少一個處理器執(zhí)行時使所述至少一個處理器執(zhí)行一種涉及用于軟件產(chǎn)品的改變回復中間語言代碼的過程,所述過程包括以下步驟在存儲器內(nèi)獲得(502)源代碼;以及在所述存儲器內(nèi)從所述源代碼生成(504)中間語言代碼,在所述中間語言代碼中,寄存器分配是執(zhí)行就緒的,所生成的中間語言代碼包含以下的至少一個無用信息收集器探測偽指令(216),所述無用信息收集器探測偽指令在所生成的中間語言代碼中具有特定位置,并請求在該位置處插入機器指令來檢查待決的無用信息收集;對象分配偽指令(218),所述對象分配偽指令在所生成的中間語言代碼中具有特定位置,并請求在該位置處插入機器指令來分配存儲器以保持在所生成的中間語言代碼中指定的類型的對象;異常拋出偽指令(220),所述異常拋出偽指令在所生成的中間語言代碼中具有特定位置,并請求在該位置處插入機器指令來拋出在所生成的中間語言代碼中指定的寄存器中標識的異常對象。2.如權利要求1所述的配置的存儲介質,其特征在于,所述生成步驟生成包含以下的至少一個的中間語言代碼虛調用方法偽指令(222),所述虛調用方法偽指令在所生成的中間語言代碼中具有特定位置,并請求在該位置處插入機器指令來對在所生成的中間語言代碼中通過符號標識的方法做出虛調用;靜態(tài)調用方法偽指令(224),所述靜態(tài)調用方法偽指令在所生成的中間語言代碼中具有特定位置,并請求在該位置處插入機器指令來對在所生成的中間語言代碼中通過符號標識的方法做出靜態(tài)調用;尾調用方法偽指令(226),所述尾調用方法偽指令在所生成的中間語言代碼中具有特定位置,并請求在該位置處插入機器指令來對在所生成的中間語言代碼中通過符號標識的方法做出尾調用;運行時類型直接調用(230)方法偽指令,所述運行時類型直接調用方法偽指令在所生成的中間語言代碼中具有特定位置,并請求在該位置處插入機器指令來對在所生成的中間語言代碼中通過符號標識的運行時類型的方法做出直接調用。3.如權利要求1所述的配置的存儲介質,其特征在于,所述生成步驟生成包含執(zhí)行引擎服務調用偽指令(228)的中間語言代碼,所述執(zhí)行引擎服務調用偽指令在所生成的中間語言代碼中具有特定位置,并請求在該位置處插入機器指令來對在所生成的中間語言代碼中通過符號標識的執(zhí)行引擎服務的方法做出調用。4.如權利要求1所述的過程,其特征在于,所述生成步驟生成包含托管對象字段訪問偽指令(232)的中間語言代碼,所述托管對象字段訪問偽指令在所生成的中間語言代碼中具有特定位置,并請求在該位置處插入包括字段偏移量的機器指令來訪問無用信息收集堆上的對象的字段,所述字段偏移量在所生成的中間語言代碼中未被指定。5.一種涉及用于軟件產(chǎn)品的改變回復中間語言代碼的過程,所述過程利用具有在操作上與至少一個存儲器通信的至少一個邏輯處理器的設備,所述過程包括以下步驟在存儲器內(nèi)獲得(502)源代碼;以及在所述存儲器內(nèi)從所述源代碼生成(504)中間語言代碼,在所述中間語言代碼中,寄存器分配是執(zhí)行就緒的,所生成的中間語言代碼包含以下的至少一個堆指針指定偽指令(234),所述堆指針指定偽指令在所生成的中間語言代碼中具有特定位置,并至少部分地確定從方法內(nèi)的一位置到包含在執(zhí)行期間指向無用信息收集堆的指針的一組指針位置的運行時映射;實例化查找偽指令(236),所述實例化查找偽指令在所生成的中間語言代碼中具有特定位置,并請求在該位置處插入機器指令來訪問在所生成的中間語言代碼中通過符號標識的共享類屬代碼項目的副本。6.如權利要求5所述的過程,其特征在于,所述生成步驟生成包含用于類型的符號類型令牌(248)的中間語言代碼,所述類型令牌在所生成的中間語言代碼中具有特定位置,并請求在該位置處插入包括以下的至少一個的機器指令描述所述類型的數(shù)據(jù)結構的地址;包含描述所述類型的數(shù)據(jù)結構的地址的間接單元的地址。7.如權利要求5所述的過程,其特征在于,所述生成步驟生成包含靜態(tài)基址偽指令(246)的中間語言代碼,所述靜態(tài)基址偽指令在所生成的中間語言代碼中具有特定位置,并請求在該位置處插入包括基址的機器指令來訪問靜態(tài)變量存儲區(qū)域,所述基址在所生成的中間語言代碼中未被指定。8.如權利要求5所述的過程,其特征在于,所述生成步驟生成包含可中斷區(qū)域偽指令(238)的中間語言代碼,所述可中斷區(qū)域偽指令(238)在所生成的中間語言代碼中具有特定位置,并描繪了其中為不一定是調用位置的指令指定無用信息收集器指針狀態(tài)的區(qū)域。9.如權利要求5所述的過程,其特征在于,所述生成步驟生成包含無用信息收集指針偽指令(240)的中間語言代碼,所述無用信息收集指針偽指令在所生成的中間語言代碼中具有特定位置,并指示以下的至少一個無用信息收集器指針被壓到棧上;無用信息收集器指針從棧彈出;無用信息收集器指針變?yōu)闊o效;不是無用信息收集器指針的值被壓到棧上。10.如權利要求5所述的過程,其特征在于,所述生成步驟生成包含無用信息收集寫屏障偽指令(242)的中間語言代碼,所述無用信息收集寫屏障偽指令在所生成的中間語言代碼中具有特定位置,并指示無用信息收集器寫屏障的狀態(tài)。11.如權利要求5所述的過程,其特征在于,所述過程生成以下種類的偽指令(212)中的至少兩個堆指針指定偽指令、實例化查找偽指令、無用信息收集指針偽指令、運行時類型直接調用方法偽指令、尾調用方法偽指令、靜態(tài)調用方法偽指令、虛調用方法偽指令;以及所述過程還包括通過在所生成的偽指令指示的位置處插入機器指令以便執(zhí)行所生成的偽指令所請求的操作來進行綁定(538)。12.如權利要求11所述的過程,其特征在于,所述中間語言代碼生成(504)步驟在與發(fā)生所述綁定(538)步驟的機器不同的機器上發(fā)生。13.一種系統(tǒng),包括與存儲器(112)進行可操作通信的處理器(110);駐留在所述存儲器中的中間語言代碼(202);同樣駐留在所述存儲器中的可執(zhí)行代碼(136),所述中間語言代碼和所述可執(zhí)行代碼符合結構對應性(620),表現(xiàn)在所述中間語言代碼中的每一寄存器分配在所述可執(zhí)行代碼中具有相同的寄存器分配;所述中間語言代碼和所述可執(zhí)行代碼還在以下方面的至少兩個中符合結構對應性所述中間語言代碼中的無用信息收集器探測偽指令(216)在位置上對應于所述可執(zhí)行代碼中在執(zhí)行時將檢查待決無用信息收集的機器指令;所述中間語言代碼中的對象分配偽指令(218)在位置上對應于所述可執(zhí)行代碼中在執(zhí)行時將分配存儲器以保持所述中間語言代碼中指定的類型的對象的機器指令;所述中間語言代碼中的異常拋出偽指令(220)在位置上對應于所述可執(zhí)行代碼中在執(zhí)行時將拋出在所述中間語言代碼中指定的寄存器中標識的異常對象的機器指令;所述中間語言代碼中的虛調用方法偽指令(222)在位置上對應于所述可執(zhí)行代碼中在執(zhí)行時將對在所述中間語言代碼中通過符號標識的方法做出虛調用的機器指令;所述中間語言代碼中的靜態(tài)調用方法偽指令(224)在位置上對應于所述可執(zhí)行代碼中在執(zhí)行時將對在所述中間語言代碼中通過符號標識的方法做出靜態(tài)調用的機器指令;所述中間語言代碼中的尾調用方法偽指令(226)在位置上對應于所述可執(zhí)行代碼中在執(zhí)行時將對在所述中間語言代碼中通過符號標識的方法做出尾調用的機器指令;所述中間語言代碼中的運行時類型直接調用方法偽指令(230)在位置上對應于所述可執(zhí)行代碼中在執(zhí)行時將對在所述中間語言代碼中通過符號標識的運行時類型的方法做出直接調用的機器指令;所述中間語言代碼中的地址模式修改器偽指令(244)在位置上對應于所述可執(zhí)行代碼中在執(zhí)行時將使用修改的地址模式來計算使用在所述中間語言代碼中未被指定的至少一個值的地址的機器指令。14.如權利要求13所述的系統(tǒng),其特征在于,所述中間語言代碼(202)和所述可執(zhí)行代碼(136)在所列出的方面的至少三個中符合結構對應性(620)。15.如權利要求13所述的系統(tǒng),其特征在于,所述中間語言代碼包含指示以下中的至少一個的無用信息收集指針偽指令(240)無用信息收集器指針被壓到棧上;無用信息收集器指針從棧彈出;無用信息收集器指針變?yōu)闊o效;不是無用信息收集器指針的值被壓到棧上。全文摘要在改變回復中間語言代碼中,寄存器已被分配但是符號引用和偽指令仍使用未綁定項目。在所生成的中間語言代碼中具有特定位置的偽指令請求在該位置處插入機器指令來執(zhí)行指定操作。指定操作可以包括例如執(zhí)行或方便無用信息收集、存儲器分配、異常處理、各種方法調用和執(zhí)行引擎服務調用、托管對象字段訪問、堆管理、類屬代碼、靜態(tài)變量存儲訪問、地址模式修改、和/或對類型的符號引用的操作。綁定器可以將中間語言代碼變換成可執(zhí)行代碼。在綁定期間需要極少或不需要寄存器分配,但是諸如偏移量、大小、槽等未綁定項目被確定并指定來產(chǎn)生可執(zhí)行代碼。文檔編號G06F9/45GK102221994SQ20111010623公開日2011年10月19日申請日期2011年4月18日優(yōu)先權日2010年4月19日發(fā)明者P·F·V·索利趣申請人:微軟公司