專利名稱:編譯時可解釋代碼檢錯的制作方法
編譯時可解釋代碼檢錯 背景背景和相關技術計算系統已經徹底改變了我們工作和游戲的方式。計算系統有各種各樣 的形式,包括膝上型計算機、臺式計算機、個人數字助理、電話甚至常規上不 與計算系統相關聯的設備,諸如例如冰箱和汽車。計算系統甚至可包括經由網 絡互連的多個組成計算系統。因此,某些計算系統小到足以放在手掌里,而其 他計算系統則可擴展到全球的許多地方。無論其物理形式是怎樣的,計算系統通常都由硬件和軟件組成。硬件最 基本地包括至少一個處理器和存儲器。軟件包括可包含在存儲器或存儲中、且 可由處理器訪問和執行以引導計算系統的總體功能的指令。因此,軟件在啟用 和引導計算系統的功能方面是至關重要的。軟件一開始通常使用"源代碼"來起草,源代碼使用更加人類可讀的編程 語言表示軟件的所需功能。在軟件執行之前,軟件被轉換成計算系統的處理器 可讀的形式。存在兩種可引起這樣的轉換的基本進程,即編譯和解釋。在編譯或解釋時,編譯器(編譯的情況中)或解釋器(解釋的情況中)訪 問根據編程語言起草的源代碼。如果源代碼遵循編程語言且不包括明顯的功能 錯誤,則編譯器或解釋器生成可由計算系統執行的可執行代碼。如果源代碼包 括錯誤,則編譯和解釋功能通常生成允許作者對源代碼進行改正的出錯消息。 編譯通常在可執行代碼要運行之前很久就進行。編譯器可僅生成可執行文件, 后者可在稍后在某一適當時間執行。而另一方面,解釋在運行時進行,剛好在 可執行代碼生成之前。有時,可解釋代碼被嵌入在可編譯代碼內。在這種情況中,可編譯代碼被 編譯成可執行文件,但可解釋代碼在運行時之前不被解釋。因此,如果在可解 釋代碼中存在錯誤,則整個代碼的功能可能存在風險。簡要概述本發明實施例的各方面涉及便于在可解釋代碼的運行時之前在可解釋代 碼中檢錯。在訪問可解釋代碼之后,可解釋命令的相應的構造規則用于制定遵 循構造規則的可解釋命令的可編譯可鏈接表示。可生成在編譯時創建并填充鏈 接至可編譯可鏈接表示的對象的源代碼。如果發生編譯錯誤,則如有需要這些 錯誤可在運行時之前被修補。如果不存在編譯錯誤,則可執行對象從而調用可 解釋命令。因此,代替等待直到運行時來確定可解釋命令的調用是否會發生錯 誤,可編譯相應的可編譯代碼以在運行時之前發現任何錯誤。提供本概述以便以簡化形式介紹將在以下詳細描述中進一步描述的一些 概念。該概述不旨在標識所要求保護的主題的關鍵特征或本質特征,也不旨在 用于幫助確定所要求保護的主題的范圍。附圖簡述為了描述可獲取本發明的上述和其他優點和特征的方式,將通過引用附圖 中示出的本發明的特定實施例來呈現以上簡要描述的本發明的更具體描述。可 以理解這些附圖僅描述本發明的典型實施例,從而不被認為是對其范圍的限 制,本發明將通過使用附圖用附加特征和細節來描述和說明,在附圖中-
圖1示出了可在其中釆用本發明的原理的合適的計算環境; 圖2示出了根據本發明原理的一方面的其中編譯代碼生成器基于可解釋 代碼的構造規則制定可解釋代碼的可編譯可鏈接表示的環境,且該可編譯可鏈 接標識用于在編譯時而不必在運行時標識調用可解釋命令的可編譯標識時的 任何錯誤;以及圖3示出了根據本發明的一方面的用于便于在可解釋代碼的運行時之前 在可解釋代碼中進行檢錯的方法的流程圖。詳細描述本發明涉及便于在可解釋代碼的運行時之前在可解釋代碼的調用中檢錯。 首先,將參考圖l描述本發明的原理可在其中操作的示例計算系統。然后,將 參考后續附圖進一步詳細描述本發明的原理。本發明的實施例可以包括含有各 種計算機硬件的專用或通用計算機,這將在以下做出進一步討論。圖1示出可用于實現本發明的特征的示例計算系統100的示意圖。所述計 算系統只是這樣的一個合適的計算系統的示例,而并不旨在對本發明使用范圍 或功能提出任何限制。也不應該把本發明解釋為對圖1中示出的任一組件或其 組合有任何依賴性或要求。計算系統現在越來越多地采用各種形式。計算系統可例如是手持式設備、 裝置、膝上型計算機、臺式計算機、大型機、或分布式計算系統。在本描述以 及權利要求書中,術語"計算系統"被廣義地定義為包括包含至少一個處理器 以及其上能含有可由處理器執行的計算機可執行指令的存儲器的任何設備或 系統(或其組合)。存儲器可采取任何形式,且可取決于計算系統的本質和形 式。計算系統可在網絡環境上分布,且可包括多個組成計算系統。參考圖l,在其最基本配置中,計算系統100—般包括至少一個處理單元102和存儲器104。存儲器104可以是易失性、非易失性、或兩者的某種組合,且表示一個或多個物理計算機可讀介質。易失性存儲器的示例包括隨機存取存儲器(RAM)。非易失性存儲器的示例包括只讀存儲器(ROM)、閃存等。 術語"存儲器"也可在此處用來指示非易失性海量存儲。這樣的存儲可以是可 移動或不可移動的,且可包括(但不限于)PCMCIA卡、磁盤和光盤、磁帶等。如此處所使用的,術語"模塊"或"組件"可指的是在計算系統上執行的 軟件對象或例程。此處描述的不同的組件、模塊、引擎和服務可被實現為在計 算系統上作為協議的一部分執行的對象或進程(例如,作為分開的線程)。盡 管此處描述的系統和方法可用軟件實現,但用硬件以及軟件和硬件的組合的實 現也是可能的且已被想到。在以下描述中,參考由一個或多個計算系統執行的動作描述本發明的實施 例。如果這樣的動作用軟件實現,則相關聯計算系統中執行該動作的一個或多 個處理器響應于執行了計算可執行指令而引導計算系統的操作。這樣的操作的示例涉及對數據的操縱。計算機可執行指令(和所操縱的數據)可被存儲在計 算系統100的存儲器104中。計算系統IOO也可包含允許計算系統IOO例如在網絡IIO上與其他計算系 統通信的通信信道108。通信信道108是通信介質的示例。通信介質一般具體 化成諸如載波或其它傳輸機制等經調制數據信號中的計算機可讀指令、數據結 構、程序模塊或其它數據,并且包括任何信息傳遞介質。作為示例而非限制, 通信介質包括有線介質,諸如有線網絡或直接接線連接,以及無線介質,諸如 聲學、無線電、紅外線和其它無線介質。如此處所用的術語計算機可讀介質既 包括存儲介質又包括通信介質。本發明的范圍內的實施例也包括用于攜帶計算機可執行指令或數據結構 或其上儲存有計算機可執行指令或數據結構的計算機可讀介質。這樣的計算機 可讀介質可以是可由通用或專用計算機訪問的任何可用介質。作為示例而非限 制,這樣的計算機可讀介質可包括RAM、 ROM、 EEPROM、 CD-ROM或其他 光盤存儲、磁盤存儲或其他磁存儲設備、或可用于攜帶或存儲計算機可執行指 令或數據結構形式的所需程序代碼裝置且可由通用或專用計算機訪問的任何 其他介質。當通過網絡或另一通信連接(或者硬連線、無線、或硬連線和無線 的組合)向計算機傳輸或提供信息時,計算機將該連接適當地視為計算機可讀 介質。因此,任何這樣的連接被適當地稱為計算機可讀介質。以上的組合也應 包括在計算機可讀介質的范圍之內。計算機可執行指令例如包括,使通用計算機、專用計算機、或專用處理設 備執行某一功能或某組功能的指令和數據。盡管用結構特征和/或方法動作專用 的語言描述了本主題,但可以理解,所附權利要求書中定義的主題不必限于上 述特定特征或動作。相反,上述特定特征和動作作為實現權利要求的示例形式 公開。圖2示出了其中本發明的原理可操作的環境200。環境200可以但不必在 圖1的計算系統100內實現。如果是這樣,則環境200可包括在系統存儲器中 實例化的對象和數據結構和/或可以是位于存儲中的功能性計算機可執行指令。可鏈接庫生成器210可以是硬件、軟件或硬件和軟件的組合。可鏈接庫生 成器210是訪問可解釋代碼201A,并使用可解釋代碼201A的相關聯的構造規則202A執行可解釋代碼的可編譯可鏈接表示211A(見可編譯可鏈接庫211A) 的組件。在本描述和權利要求書中,"可鏈接庫"是對象在編譯時可鏈接至的 一個或多個類定義表示的任何組。可鏈接庫生成器210可自動制定可編譯可鏈 接庫211A而無需人類干預,或可允許用戶干預來允許人參與執行過程。可鏈 接庫生成器201可包括一個或多個模塊和/或可包括與可鏈接庫生成無關的模 塊部分。圖3示出了根據本發明原理的一方面用于便于在可解釋代碼的運行時之 前在可解釋代碼中進行檢錯的方法300的流程圖。由于方法300可在環境200 中執行,因此將頻繁參考圖2的環境200來描述圖3的方法300。首先,可鏈接庫生成器210訪問可解釋命令(動作301)。參考圖2,可 解釋命令可在可解釋代碼201中表示。可解釋代碼可在網絡上、從本地存儲、 從系統存儲器或從其任何組合訪問。可解釋代碼可能在近期或在更遙遠的過去 構造,且可由人創作或由計算系統自動生成。現在將給出可解釋命令的兩個示例,將在說明書全文中使用這兩個示例以 便闡明本發明的更廣義的原理。在第一示例中,后文中稱之為"第一示例", 可解釋命令采取以下形式Set-location -path "c:\windows"該可解釋命令可使用命令行工具來許可。命令在導航目錄結構時設置當前 位置。該命令將當前目錄設置設置在c:\windows目錄。然而,可解釋命令代替 被輸入到命令行工具,而可作為參數通過程序輸入到可編譯代碼。例如, Set-location (設置位置)命令可如下通過程序嵌入到ShellExecute (命令解釋程序執行)命令中ShellExecute("Set-location -path 'c:Vwindows,")后文中被稱為"第二示例"的第二示例考慮表示為命令行輸入的以下可解釋代碼Get-item -path "c:\windows"命令得到在路徑屬性中指定的位置處的所有文件的清單,在該情況中,為 "c:\windows"。然而,再一次,可解釋命令代替被輸入到命令行工具,而可 如下作為參數通過程序輸入到可編譯代碼She膽xecute("Get-item -path 'c:\windows,,,常規上,無論可解釋代碼是否被輸入到命令行工具以便立即執行,或無論 可解釋命令是否通過程序嵌入到其他源代碼(例如,ShellExecute("..."))內, 可解釋代碼本身的結構在運行時之前不被評估,而恰好在執行可解釋代碼之前 才評估。這是可解釋代碼的本質。相應地,如果可解釋代碼中存在任何錯誤, 則即使可解釋代碼被嵌入到其他可編譯源代碼中,它們在運行時之前也將不會 被發現。根據本發明的原理,制定可解釋代碼本身的可編譯可鏈接表示。然后可將 源代碼制定成在編譯時創建并填充基于可編譯可鏈接表示的對象。所編譯和鏈 接的對象在執行時調用相應的可解釋注釋。如果源代碼的編譯失敗,則調用可 解釋命令的源代碼中更有可能存在錯誤。因此如有需要,可在運行時之前修補 這些錯誤。回來參考圖2和3,除訪問可解釋命令201A (動作301)以外,編譯代碼 生成器210也訪問對應于可解釋命令的構造規則(動作302)。例如,構造規 則202A可對應于可解釋命令201A。其他構造規則202B可對應于其他可解釋 命令201B。例如,對第一示例"Set-location —path 'c:\windows,",可訪問"Set-location" 命令類別的構造規則。這些構造規則可指定命令的標題(例如,"Set-location") 以及列出命令的任何屬性的適當標題(在該情況中為"path (路徑)"),可 能有屬性是強制還是任選的,什么是可接受的值類型和/或值(例如,文本串將 是屬性"路徑"的可接受值類型),以及任何其他構造規則。構造規則可用人類可讀形式表示,在這種情況中構造規則可由人來評估。或者,構造規則可用 計算機可讀形式表示,諸如用遵循計算系統理解的模式的可擴展標記語言(XML)文檔表示。類似地,對第二示例"Get-item-path'c:\windows,",可訪問"Get-item" 命令類別的構造規則。這些構造規則可指定命令的標題(例如,"Set-location") 以及列出命令的任何屬性的適當標題(在該情況中為"path (路徑)"),可 能有屬性是強制還是任選的,什么是可接受的值類型和/或值(例如,文本串將 是屬性"路徑"的可接受值類型)等。再一次,構造規則可由人解釋和/或可由 計算機解釋。回來參考圖2和3,可鏈接庫生成器然后使用構造規則來制定遵循構造規 則的可解釋命令的可編譯可鏈接表示(動作303)。例如,在圖2中,可鏈接 庫生成器210生成可編譯可鏈接庫211A。這可按各種方式執行。例如,在人 工方法中,人類作者可評估構造規則,并使用可鏈接庫生成器210作為創作工 具來制定可解釋代碼的可編譯可鏈接表示。在自動化方法中,可鏈接庫生成器 210本身可執行評估和創作而無需人類干預。一旦完成之后,根據與可解釋命令相關聯的結構化規則構造可編譯可鏈接 表示。參考圖3,然后可編譯可解釋代碼的可編譯可鏈接表示(動作304), 即使是在執行可解釋代碼之前的某個時間。在運行時之前的任何時刻,可制定(動作305)在編譯(動作306)時制 定并填充基于可解釋代碼的可編譯可鏈接表示并鏈接至該表示的對象的代碼 (例如,源代碼)。例如,如果可編譯可鏈接表示是類定義,則源代碼可引導 作為由類定義所定義的類的實例的對象的制定和填充。參考圖2,編譯代碼生 成器220生成可編譯代碼221,后者然后使用編譯器230編譯來生成編譯報告 231。源代碼可由計算機自動生成,或可響應于用戶輸入生成。如果編譯結果未檢測到編譯錯誤,則可解釋代碼更有可能是結構合理的, 且在執行時將較不可能導致運行時錯誤。因此,在之后的任何時刻,可執行對 象從而調用可解釋命令。如果編譯結果檢測到編譯錯誤(動作307),則創建 調用可解釋命令的對象的源代碼可被更改以糾正錯誤(動作308)。相應地, 代替等待直到運行時來檢測和糾正可編譯代碼中或未嵌入可編譯代碼中的錯誤,可在運行時之前檢測任何錯誤。圖3的方法300可對由省略號201B、 202B 和211B表示的多個命令、多個構造規則、多個可解釋代碼的可編譯可鏈接表 示執行。作為其中可解釋命令的可編譯可鏈接表示是類定義的特定示例,類定義的 參數可通過取可解釋命令的參數并在類定義中設置同一名稱的屬性來生成。可 將調用方法添加到類定義,它取已被設置的類屬性并使用屬性值作為類相應參 數的自變量來運行命令。類可被實例化以形成對象,將參數屬性設為對應于在 可解釋命令中提供的值的值。然后,可調用該調用方法。現在參考其中將可解釋命令"Set-location -path 'c:\windows'"提供給可 編譯代碼生成器210的第一示例。可編譯代碼生成器可生成如下用0#骨架代 碼表示的類Public class SetLoeationCommandPublic string Path{get{ .. } set {if(!IsValidPath(value》{ throw ArgumentExceptionElse {...}Public object Invoke(){ ...}生成在執行時調用可解釋命令"Set-location -path 'c:Windows,"的對象的源代碼可如下出現在第一示例中SetLocationCommand command = new SetLocationCommand(》 command.path = "c:\windows"; object result = command.Invoke();調用方法在被調用時根據所生成的可編譯可鏈接表示執行可解釋代碼,如 有結果并返回結果。如果源代碼試圖設置不存在的參數,則將存在編譯時錯誤。例如,以下第 二行在編譯器運行時將導致失敗,因為"FullName (全名)"不是類 "SetLocationCommand (設置位置命令)"的已定義的屬性。SetLocationCommand command = new SetLocationCommand(); command.FullName = "c:\windows"; object result = command.Invoke();在第二示例中,將可解釋命令"Get-item -path 'c:\windows,"轉化成如 由偽代碼表示的以下類Class GetltemCommandString Path {...} IEnumerate Invoke {...}可生成在編譯和執行時實例化類的對象實例的源代碼。例如,源代碼可如下出現GetltemCommand = newGetItemCommand(》 GetltemCommand.Path = "c:\windows";GetltemCommand.Invoke;在編譯時,可知道相應的對象將在運行時更可能成功地執行與命令 "Get-item-path'c:\windows'"相關聯的可解釋命令,因為源代碼被編譯并被 鏈接至定義相關聯可解釋命令的結構的類。現在假設,起草者改為起草以下源 代碼GetltemCommand = newGetltemCommandO; GetltemCommand,ath = "c:\windows"; GetltemC ommand .Invoke;此處用戶僅少打了 "path"的"p"。當編譯該源代碼時,編譯器將識別"GetltemCommand (獲得項目命令)"類不具有"ath"屬性,從而使編譯失敗。相應地,在編譯時之后,源代碼中的錯誤可在運行時之前糾正。本發明可具體化為其他具體形式而不背離其精神或本質特征。所述實施例在所有方面都應被認為僅是說明性而非限制性的。從而,本發明的范圍由所附 權利要求書而非前述描述指示。落入權利要求書的等效方式的含義和范圍內的 所有改變應被權利要求書的范圍涵蓋。
權利要求
1.一種用于便于在可解釋代碼的運行時之前對所述可解釋代碼進行檢錯的計算機實現的方法,所述方法包括以下動作訪問可解釋命令的動作;訪問對應于所述可解釋命令的構造規則的動作;以及使用所述構造規則來制定遵循所述構造規則的所述可解釋命令的可編譯可鏈接表示的動作。
2. 如權利要求1所述的計算機實現的方法,其特征在于,所述可解釋命令 的所述可編譯可鏈接表示包括遵循所述構造規則的對象的類定義。
3. 如權利要求1所述的計算機實現的方法,其特征在于,還包括以下動作: 制定在編譯時創建并填充鏈接至所述命令的可編譯可鏈接表示的對象的源代碼的動作。
4. 如權利要求3所述的計算機實現的方法,其特征在于,還包括以下動作編譯所述源代碼從而創建并填充鏈接至所述命令的可編譯可鏈接表示的 對象的動作。
5. 如權利要求4所述的計算機實現的方法,其特征在于,還包括以下動作:作為所述編譯動作的結果檢測編譯錯誤報告的動作。
6. 如權利要求5所述的計算機實現的方法,其特征在于,還包括以下動作:作為所述編譯錯誤報告的結果更改所述可解釋命令的動作。
7. 如權利要求1所述的計算機實現的方法,其特征在于,所述構造規則定義包括所述命令的規則類別的結構化規則。
8. 如權利要求7所述的計算機實現的方法,其特征在于,所述構造規則是 第一構造規則,所述規則類別是第一規則類別,且所述命令是第一命令,所述 方法還包括以下動作訪問處于不同于所述第一規則類別的第二規則類別中的第二可解釋命令 的動作;訪問對應于所述第二可解釋命令的第二構造規則的動作;以及使用所述第二構造規則來制定遵循所述第二構造規則的所述第二可解釋 命令的第二可編譯可鏈接表示的動作。
9. 如權利要求8所述的計算機實現的方法,其特征在于,所述第二可解釋 命令的所述第二可編譯可鏈接表示包括遵循所述第二構造規則的第二對象的 第二類定義。
10. 如權利要求8所述的計算機實現的方法,其特征在于,還包括以下動作制定在編譯時創建并填充鏈接至所述命令的第二可編譯可鏈接表示的對 象的源代碼的動作。
11. 一種包括其上含有計算機可執行指令的一個或多個計算機可讀介 質的計算機程序產品,所述指令被構造成在由計算系統的一個或多個處理器執行時,所述一個或多個處理器使所述計算系統執行便于在可解釋代碼的運行時 之前對所述可解釋代碼進行檢錯的方法,所述方法包括以下動作-訪問可解釋命令和對應于所述可解釋命令的構造規則;以及 使用所述構造規則制定所述可解釋命令的可編譯可鏈接表示。
12. 如權利要求11所述的計算機程序產品,其特征在于,所述一個或 多個計算機可讀介質各自是物理系統存儲器和/或物理存儲介質。
13. 如權利要求11所述的計算機程序產品,其特征在于,所述一個或多個計算機可讀介質是可移動存儲介質。
14. 如權利要求11所述的計算機程序產品,其特征在于,所述可解釋 命令的所述可編譯可鏈接表示包括遵循所述構造規則的對象的類定義。
15. 如權利要求11所述的計算機程序產品,其特征在于,所述可解釋 命令的所述可編譯可鏈接表示包括被配置成制定和填充從所述類定義得到的 對象的源代碼。
16. 如權利要求15所述的計算機程序產品,其特征在于,所述方法還包括以下動作制定在編譯時創建并填充鏈接至所述命令的可編譯可鏈接表示的對象的 源代碼的動作。
17. 如權利要求16所述的計算機程序產品,其特征在于,所述構造規則定義包括所述命令的規則類別的結構化規則。
18. —種計算系統,包括 一個或多個處理器;其上含有計算機可執行指令的一個或多個物理計算機可讀介質,所述指令 被構造成在由計算系統的一個或多個處理器執行時,所述一個或多個處理器使 所述計算系統在訪問可解釋命令和構造規則時使用所述構造規則制定所述可 解釋命令的可編譯可鏈接表示。
19. 如權利要求18所述的計算系統,其特征在于,所述可解釋命令的所 述可編譯可鏈接表示包括遵循所述構造規則的對象的類定義。
20. 如權利要求18所述的計算系統,其特征在于,所述可解釋命令的 所述可編譯可鏈接表示可用于制定在編譯時被配置成制定和填充鏈接至所述類定義的對象的源代碼-
全文摘要
便于在可解釋代碼的運行時之前對可解釋代碼檢錯。在訪問可解釋代碼之后,可解釋命令的相應的結構化規則用于自動制定遵循構造規則的可解釋命令的可編譯可鏈接表示。然后可制定在編譯時鏈接至可解釋命令的可編譯可鏈接表示的源代碼。如果存在編譯錯誤,則可在編譯時而非等待直到運行時才發現這些錯誤。另一方面,如果不存在編譯錯誤,則可執行經編譯的對象從而調用可解釋命令。
文檔編號G06F17/00GK101336413SQ200680051764
公開日2008年12月31日 申請日期2006年12月28日 優先權日2006年1月25日
發明者J·D·瓊斯, J·P·斯諾弗 申請人:微軟公司