新四季網

可恢復的方法

2023-10-06 12:36:14

專利名稱:可恢復的方法
可恢復的方法
背景技術:
多核處理器是一種包括兩個或更多單獨的處理器(核)的處理系統。眾核(many-core)處理器是一種如下的處理器在所述處理器中,核的數目大得足以使得傳統的多處理器編程技術不再為高效的。為眾核處理器開發軟體的程式設計師必須調整他們編寫他們的程序的方式。也就是說,為了為這些類型的計算環境編寫高效的程序,程式設計師必須編寫異步代碼、一種可以與其他代碼並發執行而不對其產生幹擾的代碼。在沒有語言支持的情況下編寫無阻塞異步代碼是困難的,因為程式設計師必須以連續傳遞樣式(continuation passing style, CPS)、例如通過使用基於回調的代碼來編寫代碼。在傳統同步編程中為隱式的事物在CPS編程中變為顯式的。例如,在傳統編碼中,當函數被調用時,其返回某值。在CPS中,函數採取顯式連續變元(argument)、一種接收在原始函數內執行的計算的結果的函數。類似地,當子例程在CPS 函數內被調用時,主調函數必須提供將用子例程返回值來調用的過程(procedure)。諸如例如C#之類的一些語言確實提供了某種形式的藉助於迭代器構造改寫的編譯器支持的連續傳遞。這種類型的語言支持對於遞歸而言以及對於異步編程所需的其他類型的編碼技術而言不是特別優化的。概述儘管針對迭代器的內建語言支持可以幫助解決與被惰性地評估的集合相關聯的一些問題,並且儘管在某些語言中在某種程度上不存在針對異步編程的內建語言支持,但是在此所公開的主體針對一種統一方案,其抽象出這些領域的各個方面的特性並且提供通用的外部機制,所述外部機制可以解決與異步編程、通過迭代器惰性地生成集合、編寫對稱協同例程等等相關聯的大量問題。提供了 API (程序模塊),所述API處於程式語言的外部但是提供可插入到語言編譯器中的功能。所提供的API調節與使用通用基於模式的方案進行的異步編程、迭代器或編寫對稱協同例程相關聯的功能。在API中提供了若干類型的可恢復方法,所述可恢復方法可以應用於以傳統程序代碼編寫的方法主體。以傳統編程代碼編寫的方法主體中的在句法上可區分的控制點通過編譯器使用外部API來調用該代碼的變換。經變換的代碼實現夾在經變換的代碼的控制點之間的代碼的暫停和恢復。也就是說,裡面具有控制點的代碼的本體(例如方法)中所包括的原始碼被變換為使得該方法內的代碼可以在分立的部分中執行,每個部分都在經變換的代碼中的控制點處開始和結束。無論控制點位於代碼中的何處,該代碼都可以要麼直接地、要麼作為暫停的遞歸調用的一部分而暫停。該代碼可以從其暫停的點處恢復。不同類型的可恢復方法可以通過該方法在暫停後如何以及何時恢復、以及通過在代碼暫停、返回和終止以後來回流動的變元和返回值的類型來區分。暫停控制點可以任選地向調用者返回值,並且可以使用yield(控制權轉移)表達式從恢復模塊接收值。遞歸調用控制點可以遞歸地應用兼容的可恢復方法,其中所述可恢復的方法進行由該方法使用yield or yield-for_each表達式所確定的暫停。返回控制點在具有或不具有結果值的情況下用信號通知可恢復方法的終止。
提供本發明內容以便以簡化形式介紹將在以下詳細描述中進一步描述的一些概念。本發明內容並不旨在標識所要求保護主題的關鍵特徵或必要特徵,也不旨在用於限制所要求保護主題的範圍。


在附圖中圖I示出了根據在此公開的主題的各方面的系統100的示例,該系統100提供了處於程式語言外部的用於可恢復方法的機制;圖2a — 2d是根據在此所公開的主題的各方面的驅動程序類的示例;圖2e是根據在此所公開的主題的各方面的原始碼的示例; 圖2f是根據在此所公開的主題的各方面的經變換代碼的示例;圖2g是根據本文所公開主題的各方面的經改寫方法的示例;圖2h — 2j是根據在此所公開的主題的各方面的實現迭代器的可恢復方法的示例;圖2k是根據此處所公開的主題的各方面的用於使用外部API來實現可恢復方法的方法201的示例的流程圖;圖3是示出了其中可以實現此處所公開的主題的各方面的計算環境的示例的框圖;以及圖4是根據此處所公開的主題的各方面的集成開發環境的示例的框圖。
具體實施例方式概覽在此公開的主題描述了語言編譯器的特性與插入到編譯器的基於模式的應用編程接口(API)插件之間的合約。API插件使該特性適應於異步編程、迭代器、對稱協同例程等等,從而向編譯器提供針對每個特定類型的可恢復方法要做些什麼的細節。該特性重新構建輸出代碼(例如中間代碼),從而移除了原始碼與輸出代碼之間的一一對應。包括一個或多個控制點的原始碼被變換為使得輸出代碼可以在分立的部分中執行,每個部分都在經變換的輸出代碼中的控制點處開始和結束。例如,最終用戶可以編寫傳統的同步代碼,直到他達到如下的點在該點處,他想要他的代碼能夠暫停以等待某事物而不必停止所有處理。在該點處,最終用戶可以在其代碼中的任何位置、包括在深度嵌套在該語言的控制結構內的點處插入控制點。編譯器對控制點的輸入的識別將觸發對通過原始碼中的控制點表達的形式(籤名)所標識出的API的編譯器變換。被調用的API確定原始碼中的語言句法的有效性,並且可以在後臺編譯器被使用的情況下展示異步編程特有版本的與編譯器的語言特性的交互。使用外部API來擴展編譯器以實現可恢復的方法圖I示出了根據在此公開的主題的各方面的系統100的示例,該系統100提供了處於語言編譯器外部的用於實現可恢復方法的機制。系統100的全部或某些部分可以駐留在諸如下面參考圖3所描述的計算機之類的一個或多個計算機上。系統100的全部或某些部分可以駐留在諸如下面參考圖4所描述的計算機之類的一臺或多臺軟體開發計算機(例如,計算機102)上。系統100或其一些部分可以包括諸如下面參考圖4所描述的和所示出的那些集成開發環境(例如,IDE 104)的一部分。替代地,系統100或其一些部分可以作為獨立系統或作為插件或附加件來提供。系統100可以包括以下中的一個或多個處理器(比如處理器142)、存儲器144、以及提供實現可恢復方法的機制的API或模塊的庫106。也可以包括本領域已知的其他組件,但此處未示出。能夠理解,庫106的一個或多個模塊可以被加載到存儲器144中以致使諸如處理器142之類的一個或多個處理器執行歸因於如下API的動作所述API提供了實現可恢復方法的機制,所述機制處於程式語言之外並且可以插入到語言編譯器中。系統100可以包括下列各項中的一個或多個編譯器114,比如後臺編譯器、並行編譯器或增量編譯器;解析器,比如後臺解析器、並行解析器或增量解析器;或者插件、預處理器、或附件;或者對IDE、解析器、編譯器或預處理器的擴展。在此所述API可被附連到、併入土諸如下列編譯器或與諸如下列編譯器相關聯 編譯器,比如後臺編譯器、並行編譯器或增量編譯器;解析器,比如後臺解析器、並行解析器或增量解析器;或者插件、預處理器、或附件;或者對IDE、解析器、編譯器或預處理器的擴展。編譯器114可以包括與專用API交互的一個或多個模塊。在處於語言編譯器外部的庫中提供了特定種類的專用可恢復方法、比如但不限於異步或迭代器方法。應用程式員可以通過如下方式致使這些方法被應用於包含傳統編程代碼的方法主體向該傳統代碼添加所述方法本體中的一個或多個在句法上可區分的控制點。包括包含這樣的控制點112的方法108的輸入原始碼可以由編譯器114使用來自庫106的API來變換以生成諸如經變換方法110之類的經擴展方法,其使得經變換方法110在被執行時能夠在夾在控制點之間的分立部分中執行,這將在下面予以更充分描述。控制點是一種如下的點在該點處,方法中的代碼的主體可以要麼直接地暫停,要麼因為該方法是暫停的遞歸方法調用的一部分而暫停。不同種類的可恢復方法的區別在於該方法在暫停後如何以及何時恢復,以及在暫停、返回和終止以後哪些變元和返回值來回流動。Yield表達式可以任選地向調用者返回值,並且從恢復器或恢復模塊接收用於暫停控制點的值。yield或yieldforeach表達式可以遞歸地應用兼容的可恢復方法,其中所述可恢復方法正如該方法所確定的針對遞歸控制點而暫停。返回語句在具有或不具有返回控制點的最終結果值的情況下用信號通知可恢復方法的終止。不同種類的可恢復方法的區別在於該方法在暫停後如何以及何時恢復,以及在暫停、返回和終止以後哪些變元和返回值來回流動。Yield返回表達式可以任選地向調用者返回值,並且從恢復器或恢復模塊接收用於暫停控制點的值。yield或yieldforeach表達式可以遞歸地應用兼容的可恢復方法,其中所述可恢復方法正如該方法所確定的針對遞歸控制點而暫停。返回語句在具有或不具有返回控制點的最終結果值的情況下用信號通知可恢復方法的終止。活動的可恢復方法可以由從諸如可恢復(Resumable)類之類的可恢復方法類中派生(derive)的某種類型的巾貞(frame)對象來表示。該對象在方法被掛起時表示該方法的棧幀。當方法被掛起時,表示所掛起方法的棧幀可以被複製到另一數據結構並且可以從機器棧中移除。因此,所掛起的方法可以在物理上不駐留在棧上。可替代地,棧的整個狀態可以被保存,從而無論該方法是活動還是掛起都將其維持在堆上。在傳統的不可恢復的控制流中,機器使用單個執行線程來執行當前正等待執行的方法的連續棧。棧上的每個方法都等待另一方法返回到該方法。棧通常不能直接被編譯器訪問。在實現可恢復方法的一些環境中,可恢復方法在遇到特定語句時暫停。此時,根據在此所公開的主體的各方面,所暫停方法的棧的幀可以被保存並且在該方法恢復時被放回到該棧上。關於什麼可恢復方法調用了何種可恢復方法的信息被存儲在單獨的數據結構中,使得當方法返回時,該返回可以定向到由負責的驅動程序類指定的正確接收者。也就是說,驅動程序類的每個實例(即每個專用對象)都表示機器棧的所保存的表示中的方法調用。從特定驅動程序類中實例化的對象表示執行中的特定可恢復方法調用。專用對象的集合表示以前由該棧維護的控制鏈。執行中的方法調用是當前正在運行或已經暫停並還未結束的任何方法調用。當可恢復方法返回結構時,其將該結果提供給調用該方法的方法並且主調方法恢復。根據在此所公開的主體的一些方面,編譯器生成致使控制轉移到所恢復方法的代碼,從而變換輸入原始碼。當可恢復方法恢復時,可以調用Invoke方法或幀對象上的其他調用方法,所述調用方法將針對所恢復方法的真實激活記錄放回到機器棧上。如果所暫停方法(第一可恢復方法)正遞歸地等待另一所掛起的可恢復方法(第二可恢復方法),則第二 方法的幀對象可以類似地恢復,使得機器棧表示可恢復方法的實際調用順序。因此,異常傳播、調試等等自然可以構建在相應的內建機制上,比如、但不限於用於異常傳播和調試的CLR機制。其他用於棧處理的機制也是可能的。不同種類的可恢復方法可以由從抽象可恢復基類中派生的驅動程序類來定義。圖2a示出了這樣的抽象基類Resumable (可恢復)200的實例。特定的可恢復方法可以由作為派生的類編譯器從這些驅動程序類中生成,從而將暫停邏輯實現為狀態機。可恢復方法的狀態機改寫可以被認為是發生在兩個階段中。第一階段可以將方法主體放置到從驅動程序派生的由編譯器生成的類中的調用方法的覆蓋(override)中,其中控制點的任何出現都被改寫成下列各項之一a)對驅動程序類中的「之前(before)」方法的調用,其中任何變元都被傳遞給控制點;b)對特定的專用命令的調用以用於進一步改寫;c)對驅動程序類中的「之後(after)」方法的調用,其中該方法將任何所得到的值傳遞給出現控制點的上下文。在第二階段中,編譯器生成的類和Invoke方法可以用狀態機邏輯來擴充,並且所述專用命令可以被改寫成用於狀態變換和掛起的代碼。下面描述語言特性和庫API可以如何使用驅動程序類來交互的實例。根據在此所述公開的主體的一些方面,驅動程序類實現了處於程式語言外部的專用部分。可以使用暫停控制點來暫停方法的執行。假定特定的方法表達式了要隨時間漸進地執行的工作的主體。為了使方法可返回,可以在方法本體中插入暫停控制點。例如如果集合的元素正在被生成,則可以將暫停控制點插入在生成下一元素的計算已經被執行的點處。在該點處,元素可以被yield返回。當集合的下一元素被請求時,該方法可以恢復並且可以在從中作出yield返回的點處返回。遞歸控制點每當被調方法暫停時都暫停作出遞歸調用的方法。例如,假定第一迭代器可以yield3個元素(一次一個),並且第二迭代器可以yield 2個元素(一次一個),這兩個迭代器可以通過創建可調用其他可恢復方法的可恢復方法被組裝成能夠順序地yield全部5個元素的迭代器。所組裝的迭代器方法可以首先調用第一迭代器並且使其一次一個地yield它的三個元素。當第一迭代器已經yield出了所有三個元素時,所組裝的方法可以調用第二迭代器,所述第二迭代器yield出其他兩個元素。當第一迭代器暫停時,所組裝的迭代器方法被暫停。類似地,當第二迭代器暫停時,所組裝的迭代器方法被暫停。返回控制點用信號通知可恢復方法的終止,並且被用於定義在工作完成時要做些什麼。儘管可能在一路上發生了若干暫停和若干恢復,但是該工作最終完成。返回可以僅僅指示該工作完成,或者也可以包括已完成的工作的結果。異步方法可以每當等待時間周期長時使用,例如在輸入輸出操作期間或者針對通過網絡的通信來使用。例如假定用戶想要從網頁下載某些信息,對所下載的信息執行某種計算,並且將計算結果發送給另一網頁。當所述操作完成時,將返回指示成功或失敗的布爾結果。為了同步地執行這些操作,通常使用調用兩個助手方法的方法。所述助手方法之一通常導航到該網頁並且提取所期望的內容。在內容被接收以後,執行該計算。第二助手方法通常被調用以將計算結果發送給另一網頁。當完成時,該方法返回布爾結果。該情況中的同步處理尤其是在進行到該網頁的連接並且所下載的內容被檢索時以及還有在計算結果被發送給第二網頁時導致等待時間段。根據連接速率、網絡通信量以及所下載信息的大 小,等待時間可以是顯著的。使用異步方法執行該系列動作將釋放作業系統線程資源,這可以導致更好的用戶體驗。例如,在任何基於GUI的應用中,僅僅單個線程服務於用戶輸入事件,使得釋放線程失敗可能導致非常差的用戶體驗。然而,在沒有語言支持的情況下實現異步方法是困難的,因為不能使用正常的控制結構。因此,程式設計師必須人工地編寫和調試嵌套回調、一種困難和易錯的任務,從而導致代碼也難以閱讀和維護。此外,代碼的複雜度隨著方法內的經「人工」(非程序性地)變換的控制點的數目增長而迅速增加。根據在此公開的主體的各方面,控制點可以以任意嵌套深度被放置在正常的控制結構內。可以在異步驅動程序類所支持的異步方法內進行遞歸調用。回調由編譯器生成,其中回調該方法但是是對開發者透明的。在從網頁下載的示例中,異步方法首先yield到從web讀取的方法,計算被執行,然後對方法進行遞歸yield,該方法將計算結果發送給第二網頁,並且最終布爾結果被返回。因此,控制流與在同步方法的情況下一樣,但是處理器從不空閒。迭代器類似地工作,只是客戶端觸發集合的下一元素的生成、而不是來自網頁的回調觸發下一步驟。不同的環境組驅動由驅動類的特性描述的不同過程。因此,上述不同類型的控制點實現了向傳統方法那樣的對可恢復方法的組裝,而無須開發者應付可恢復方法的複雜度。可恢復的方法可以通過調用其他異步或可恢復方法或者通過該方法遞歸地調用其自身來組裝。儘管一般而言,迭代器可以調用其他迭代器並且異步方法可以調用其他異步方法,但是根據在此所述的主體的各方面,驅動程序類規定何種可恢復方法可以從特定的可恢復方法中調用,使得可恢復方法不限於調用相同類型的另一可恢復方法。如上所述,表示執行控制鏈(例如棧)的專用對象可以由編譯器從專用抽象基類中生成。專用抽象基類包括特定行為和方法。例如,抽象類AsynchCD (圖2d中示出)可以被編譯器用於作出包括Asynch〈T>類的特定方法主體的所派生的類。所派生的Asynch〈T>類被實例化成幀對象。該幀對象中的代碼的一部分可以由來自庫的專用基類來貢獻,並且其一部分可以由可放入該方法特有的邏輯中的編譯器來貢獻。在經變換或擴充版本的方法中,將存在對從基類庫中繼承的專用方法的調用,上述方案的替代方案包括創建兩個對象,ー個對象通過包含核幀對象的編譯器來創建,一個對象由庫來提供,其中所述對象通過它們的方法彼此通信。根據在此所述的主體的各方面,在每個控制點處,編譯器生成代碼可以在驅動程序類上的方法暫停以前調用該方法,並且可以在驅動程序類上的方法恢復以後調用該方法,以向該方法提供執行其專用行為的機會。例如,對於yield控制點而言,存在編譯器生成的代碼將在基類上調用的之前yield方法和之後yield方法。對於返回的遞歸調用而言,存在之前yield返回方法和之後yield返回方法,並且對於返回而言,存在之前返回方法而不存在之後返回方法,因為方法在其完成時返回。之前和之後方法調用使得驅動程序類能夠指定要執行的方法。如果驅動程序類未指定之前yield或之後yield方法,則編譯器不能生成對它們的方法調用,使得使用這種控制點將在由該驅動程序類管理的可恢復方法中為非法的。因此,驅動程序類可以通過指定之前和之後方法或者通過未能指定之前和之後方法來指定這些控制點中的哪些是可用的。附加於確定特定控制點是否為可用的,驅動程序類可以確定控制點對哪些情形可用。由於該交互是基於模式的並且該模式確定編譯器生成的代碼調用哪個方法,因此通過指定該方法採取哪些變元,驅動程序類可以指定哪些方法可以被遞歸地調用。可以存在方法的多個過載(overload),使得例如異步方法可以被允許調用多種類型的異步方法,這可以實現不同模型之間的互操作。類似地,變元類型化的指定可以用於調用由當前處於庫中的任務類表示的方法。
最後,驅動程序類可以確定該方法的本體中有些什麼,也就是說,驅動程序特有的行為在yield以前是什麼樣的。例如,ー些數據可以在幀類之間轉移,或者處理可以被執行以使數據表示為恢復做好準備。關於迭代器,之前yield返回方法調用可以指定集合的下一元素值如何被yield,並且如何將該值傳輸給客戶端。之前和之後方法是開放式的,並且可以用於實現迭代器、異步方法及其變型。例如,各個異步方法可以由參數化的驅動程序類來表示,所述驅動程序類可以由最終用戶創建以用於任何命令性的程式語言。圖2a — 2d示出了實現上述方面的驅動程序類的非限制性示例。能夠理解,儘管所提供的示例使用按照名稱標識出方法的特定句法形式,但是可以使用不限於命名方法的其他句法形式。圖2a示出了可從中派生服務特有的驅動程序類的可恢復方法(類Resumable 200)的系統範圍的基類的示例。圖2b示出了抽象類AsyncResumable 210的示例,所述抽象類從類Resumable 200中派生並且是異步特有的。圖2c和2d中示出了抽象類 AsyncResumable 210 的兩個變型。從抽象類 AsyncResumable 210 派生的類 Async 220、以及也是從抽象類AsyncResumable 210派生的類Async〈T>230。類Async 220被用於創建表示不具有結果的異步操作的對象。類Async〈T>230是通用類,其用於創建表示具有類型T的結果的異步操作的對象。AsyncResumable 210 的主體包括 BeforeYield (之前 Yield)方法 212 和AfterYield (之後Yield)方法214。之前方法(例如BeforeYield方法212)和之後方法(例如AfterYield方法214)的籤名描述了可以遞歸地調用的方法的類型,並且保證返回值被正確地生成和消費。當在類定義中缺少之前返回方法的類型時,調用那種返回是非法的(例如在類Async 220的定義和類Async〈T>的定義中缺少BeforeYieldReturn方法意味著在這些異步方法中調用YieldReturn是非法的)。BeforeYield和AfterYield方法在AsyncResumable 210的類定義中的存在指不從AsyncResumable方法中,yield是可能的。由於缺少BeforeYieldReturn方法和AfterYieldReturn,因此yield返回控制點不能用在AsyncResumable方法中。可以yield其他異步方法,除了異步方法以外的方法不能被yield。類Async 220和Async〈T>230的定義包括其他返回方法。類Asynch 220的BeforeReturn方法222指示在沒有結果值的情況下僅能進行返回,因此其不採取變元。類Asynch230的BeforeReturn方法232指不該方法返回類型T的值,因此BeforeReturn方法232採取類型T的變元。因此,如果「返回7」被包括在返回Async〈int>的可恢復方法的主體中,則編譯器生成的利用變元7對BeforeReturn的調用將無問題地解析到BeforeReturn方法232。然而,如果方法嘗試向Async〈int>方法返回 字符串,貝U編譯器將發現籤名不匹配並且將返回編譯時錯誤。圖2e示出了最終用戶可以編寫的包括異步可恢復方法240的代碼的代碼段的示例。該方法可以通過返回Async〈int> (上述驅動程序類之一)的語句staticAsync〈int>M 242而被確定為異步的。處於可恢復方法240內的是正常控制流代碼,該代碼將「之前(before)」寫入控制臺(console),並且然後yieldx (int x=yieldWait (10);語句244)。該行代碼的控制點是「yield」表達式,其觸發方法240到圖2f中所示方法250的轉換。方法250被改寫以生成如圖2g方法260中所示的MFrame類的實例。編譯器生成稱為MFrame的從Async〈int>中派生的類,並且如圖2f所示擴充yield和返回的出現。能夠理解,經擴充的方法250覆蓋所調用方法(public override void Invoke {)(語句251)並且現在具有用戶編寫的代碼以及通過其中的編譯器生成的附加代碼。Console.WriteLine (「之前」)和Console. WriteLine (「之後」)語句仍然在那裡,但是在這兩個語句之間,方法240的語句int x=yield Wait (10)語句244已經被擴充到調用Wait (10)語句252並且然後調用BeforeYield語句253的代碼中。調用BeforeYield的結果是,該方法的執行暫停,這由行CALL(tmp2);語句254中的「CALL」來指示。「CALL」和「返回」在調用方法的主體中的出現用信號向編譯器通知狀態機控制代碼必須被插入在這些點處。對Before (之前)和After (之後)方法的調用是從原始原始碼的句法中生成的。編譯器可以對照AsyncCD中提供的方法使用方法綁定規則和技術來檢查調用,並且在方法未被正確使用時提出錯誤。因此,遞歸調用被充分強地類型化。當方法恢復時,方法AfterYield被調用(在行var tmp3=AfterYield (tmp2);語句255中)。調用AfterYield的結果可以被放入變量tmp3中。tmp3變量的內容通過下列用戶編寫代碼被分配給變量X x=tmp3; statement 256,「之後」被寫入到控制臺中(語句259), x通過調用BeforeReturn(X)被返回(語句258),並且返回行語句259被執行。圖2h — j示出了實現迭代器的可恢復方法的示例。圖2h中所示的驅動程序類270聲明了稱為Iterator (迭代器)的抽象類,該抽象類是從抽象類Resumable派生的並且實現 IEnumerator 接 ロ(abstract class Iterator; Resumable, IEnumeratorX IEnumerator接ロ具有稱為MoveNext的方法,該方法移動到集合中的下一元素。IEnumerator接ロ還具有Current (當前)屬性,其中存儲了集合中的當前元素(MoveNext所移動到的元素)的值。姆當MoveNext方法在Iterator上被調用時,該方法的具有其中的控制點的下一部分可以被執行。驅動程序類 270 為 YieIdReturruYieldForeach、YieldBreak(return)提供與針對Async類的類似方法不同的「Before」和「After」方法。該示例中的YieldForeach的過載的數目展示了該方法的強大。例如,一個過載的YieldForeach從可枚舉(enumerable)獲得枚舉器並且將其變換成迭代器並且遞歸地調用該迭代器。「PAUSE (暫停)」命令可以用於改寫YieldReturn控制點。圖2i示出了簡單的迭代器、即靜態迭代器F 280。迭代器F 280包括控制點、SPyield返回語句(「yield return I; 」語句282),其直接生成集合的元素並且然後暫停。迭代器F 280還包括控制點「yield foreachF O ; 」語句284,其遞歸地調用迭代器F直到F用完了集合中的元素。因此,多個值可以利用yield之間的暫停來yield。語句「yield return2; 」語句286返回其他值。「yield break;」125085 IPffCN
語句288在集合的所有元素都已經被yield時執行。迭代器F 280可以由編譯器來翻譯,這如圖2j中所示。從圖2j中可以得知,Iterator F O中的每個控制點都可以被轉換成對「之前」和「之後」方法的調用(例如圖2j中所示語句「yield return I」語句282被變換成如圖2j中所示的對BeforeYieldReturn(I)的調用語句292、如語句294中所示對PAUSE的調用、以及如語句296中所不對AfterYieldReturn的調用)。類似地,YieldForeachF O ;語句284被翻譯成圖2j中的單個語句298中所不的BeforeYieldForeach語句、CALL語句和AfterYieldForeach語句。當迭代器F 280被執行時,具有值的yield返回被返回(語句292),PAUSE語句294致使方法掛起執行,並且當該方法恢復吋,該方法將如語句296中所示調用AfterYieldReturn 方法。如圖 2h 語句 272 中所不,BeforeYieldReturn 從 Iterator 類繼承,從而將當前值設置為對象O,使得當對MoveNext的調用完成吋,當前值將被返回。三個語句298中所示的語句對語句284的YieldForeach控制點類似地操作以用於遞歸調用,並且達到三個過載、即過載274、過載276和過載278。這三個不同的過載允許不同的YieldForeach方法採取不同的變元並且通過集合的不同表示來實現yield。第一過載、即過載274遞歸地調用另ー迭代器。針對第二過載、即過載276, Enumerable (可枚舉)表示對象的集合併且具有稱為Get Enumerator的方法。當Get Enumerator被調用時,該集合的新元素被獲得。當到達該集合的結尾時,不再能獲得元素。最後ー個過載、即過載278使得能夠獲得該集合的新實例。將調用方法最終變換成狀態機類似於在此所述的迭代器和異步方法的變換。每個PAUSE和CALL都被分配狀態。在方法的開始處和每個嘗試塊的開始處添加邏輯以分叉到該代碼中與當前狀態相關聯的點。PAUSE點暫停或掛起方法的執行並且將狀態推進到緊接在PAUSE以後並且返回。後面的恢復將重新調用該調用方法,從而分叉到緊接在PAUSE命令之後的點。CALL點不掛起執行。相反,其開始對被調用的可恢復方法的執行。被調用的可恢復方法可以包括諸如PAUSE之類的控制點,使得被調用的可恢復方法本身可以暫停或掛起,從而致使整個棧被暫停(包括主調方法)。通過組合迭代器和異步方法,可以創建諸如IAsyncEnumerator之類的用戶定義的驅動程序類,其中IEnumerator MoveNext方法是異步的。這樣的組合方法可以遞歸地調用異步方法和同步迭代器二者,從而實現各種附加的控制點。對稱協同例程可以通過創建協作方法實現,其中所述協作方法彼此傳遞控制(而不是返回到彼此),同時保留毎次恢復之間的執行狀態。與異步方法的某些實施方式不同,協作方法可以不增加調用棧的深度。相反,調用棧的葉幀可以被換出。圖2k是用於使用外部API來擴展編譯器以實現可恢復方法的方法201的示例。在203,可以由編譯器接收原始碼。該編譯器可以是諸如參照圖I所述的編譯器之類的編譯器。響應於識別在句法上可區分的控制點(比如上述暫停、遞歸調用和返回控制點),在205,編譯器可以調用由控制點表達式的籤名確定的外部API。如上所述,被調用的API可以是專用方法並且可以駐留在編譯器外部的庫中。如上所述,表示控制鏈(例如棧)的專用對象可以由編譯器從庫中的專用抽象基類中生成。可替代地,替代於調用抽象基類,可以調用符合控制點表達式的籤名的任何代碼,包括但不限於非抽象基類、接ロ、具有擴展方法的靜態類等等。專用抽象基類或其他代碼可以包括專用行為以及諸如異步和迭代器方法之類的方法。例如,抽象類Asynch〈T> (圖2b中示出)可以被編譯器用於作出包括Asynch〈T>類的特定方法主體的派生的類。 派生的可恢復類可以被實例化成諸如例如幀對象之類的對象。該對象中的代碼的一部分可以由來自庫的專用基類來貢獻。該對象中的代碼的一部分可以由編譯器來貢獻,其中該編譯器放入該方法特有的邏輯。在209,所接收的原始碼可以被變換成經擴充的代碼,使得在所接收的原始碼中的每個控制點處,編譯器生成代碼可以在驅動程序類上的方法暫停以前調用該方法,並且可以在驅動程序類上的方法恢復以後調用該方法,以向該方法提供執行其專用行為的機會。例如,編譯器生成的代碼可以調用基類上的之前yield方法和之後yield方法。針對返回的遞歸調用,編譯器生成的代碼可以調用之前yield返回方法和之後yield返回方法。類似地,對於返回,編譯器生成的代碼可以調用之前返回方法、但不是之後返回方法,因為方法在其完成時返回。之前和之後方法調用使得驅動程序類能夠指定要執行的方法、以及由此哪些種類的控制點在特定可恢復方法中是合法的、以及控制點對哪些情形可用。由於該交互是基於模式的並且該模式確定編譯器生成的代碼調用哪個方法,因此通過指定該方法採取哪些變元,驅動程序類可以指定哪些方法可以被遞歸地調用。可以存在方法的多個過載,使得例如異步方法可以被允許調用多種類型的異步方法,這可以實現不同模型之間的互操作。驅動程序類可以確定與對象相關聯的特定行為。在211,可以創建可執行代碼。合適的計算環境的示例為了提供有關本文所公開的主題的各個方面的上下文,圖3以及以下討論g在提供其中可以實現各實施例的合適的計算環境510的簡要概括描述。儘管本文所公開的主題是在諸如程序模塊等由一個或多個計算機或其它計算設備執行的計算機可執行指令的通用上下文中描述的,但本領域技術人員將認識到,本文所公開的主題的各部分還能夠結合其它程序模塊和/或硬體和軟體的組合來實現。通常,程序模塊包括執行特定任務或實現特定數據類型的例程、程序、對象、物理人為產物、數據結構等。通常,程序模塊的功能可在各個實施例中按需進行組合或分布。計算環境510隻是合適的操作環境的ー個示例,並且不旨在對此處所公開的主題的使用範圍或功能提出任何限制。
參照圖3,描述了計算機512形式的用於線性棧上高效恢復協同例程的計算設備。計算機512可包括處理單元514、系統存儲器516和系統總線518。處理單元514可以是各種可用處理器中的任何ー種。也可以使用雙微處理器及其他多處理器體系結構作為處理單元514。系統存儲器516可包括易失性存儲器520和非易失性存儲器522。非易失性存儲器522可包括只讀存儲器(ROM)、可編程ROM (PROM)、電可編程ROM (EPROM)或快閃記憶體。易失性存儲器520可包括可充當外高速緩衝存儲器的隨機存取存儲器(RAM)。系統總線518將包括系統存儲器516的系統物理人為產物耦合到處理單元514。系統總線518可以是幾種類型的總線結構中的任何ー種,包括存儲器總線、存儲控制器、外圍總線、外總線或局部總線,並且可以使用各種可用總線體系結構中的任ー種。計算機512通常包括各種計算機可讀介質,諸如易失性和非易失性介質、可移動和不可移動介質。計算機存儲介質可以通過用於存儲諸如計算機可讀指令、數據結構、程序模塊或其它數據等信息的任何方法或技術來實現。計算機存儲介質包括但不限幹,RAM、R0M、EEPR0M、快閃記憶體或其它存儲器技術、⑶ROM、數字多功能盤(DVD)或其它光碟存儲、磁盒、磁 帶、磁碟存儲或其它磁存儲設備、或可以用來儲存所期望的信息並可由計算機512訪問的任何其他瞬態或非瞬態介質。將理解,圖3描述了可充當用戶與計算機資源之間的媒介的軟體。該軟體可以包括可存儲在盤存儲524上的作業系統528,該作業系統可控制並分配計算機系統512的資源。盤存儲524可以是通過諸如接ロ 526的不可移動存儲器接ロ連接到系統總線518的硬碟驅動器。系統應用程式530利用由作業系統528通過存儲在系統存儲器516或者存儲在盤存儲524上的程序模塊532和程序數據534對資源的管理。可以理解,計算機可用各種作業系統或作業系統的組合來實現。用戶可通過輸入設備536向計算機512輸入命令或信息。輸入設備536包括但不限於定點設備,諸如滑鼠、跟蹤球、指示筆、觸摸墊、鍵盤、話筒等。這些及其他輸入設備通過系統總線518經由接ロ端ロ 538連接到處理單元514。接ロ端ロ 538可表示串行端ロ、並行端ロ、通用串行總線(USB)等。輸出設備540可與輸入設備使用相同類型的端ロ。提供輸出適配器542以舉例說明存在像監視器、揚聲器、以及印表機的需要特定適配器的ー些輸出設備540。輸出適配器542包括但不限於,在輸出設備540和系統總線518之間提供連接的視頻卡和音效卡。其他設備和/或系統和/或設備,諸如遠程計算機544,可提供輸入和輸出兩種能力。計算機512可以使用到諸如遠程計算機544之類的ー個或多個遠程計算機的邏輯連接來在聯網環境中操作。遠程計算機544可以是個人計算機、伺服器、路由器、網絡PC、對等設備或其它常見的網絡節點,並且通常包括許多或所有以上相對於計算機512所描述的元件,儘管在圖4中僅示出了存儲器存儲設備546。遠程計算機544可經由通信連接550邏輯地連接。網絡接ロ 548涵蓋諸如區域網(LAN)和廣域網(WAN)這樣的通信網絡,但也可包括其他網絡。通信連接550是指用來將網絡接ロ 548連接到總線518的硬體/軟體。連接550可以在計算機512內或外並且包括諸如數據機(電話、電纜、DSL和無線)和ISDN適配器、乙太網卡等內和外技木。可以理解,所示網絡連接僅是示例,並且可以使用在計算機之間建立通信鏈路的其它手段。本領域的普通技術人員可以理解,計算機512或其它客戶機設備可作為計算機網絡的一部分來部署。在這一點上,本文所公開的主題涉及具有任意數量的存儲器或存儲單元以及在任意數量的存儲單元或卷上發生的任意數量的應用和進程的任何計算機系統。本文所公開的主題的各方面可應用於具有部署在網絡環境中的具有遠程或本地存儲的伺服器計算機和客戶計算機的環境。本文所公開的主題的各方面也可應用於具有程式語言功能、解釋和執行能力的獨立計算設備。圖4示出集成開發環境(IDE) 600和通用語言運行時環境602。IDE 600可允許用戶(例如,開發者、程式設計師、設計者、編碼者等)在計算機系統中設計、編碼、編譯、測試、運行、編輯、調試或構建程序、程序集、網站、web應用和web服務。軟體程序可包括以ー種或多種原始碼語言(例如,VisualBasic, Visual J#、C++、C#、J#、Java Script、APL, COBOL、Pascal、Eiffel、Haskell、ML、Oberon、Perl> Python> Scheme、Smalltalk 等)創建的原始碼(組件610)。IDE 600可提供本機代碼開發環境,或者可提供在虛擬機上運行的託管代碼開發,或者可提供其組合。IDE 600可提供使用.NET框架的託管代碼開發環境。可使用語言專用源編譯器620從原始碼組件610和本機代碼組件611創建中間語言組件650,並且在執行應用時使用中間語言編譯器660 (例如,即時(JIT)編譯器)從中間語 言組件650創建本機代碼組件611 (例如,機器可執行指令)。S卩,當IL應用被執行時,其在被執行的同時被編譯成適合正在其上執行它的平臺的合適機器語言,藉此使代碼能跨若干平臺便攜。替代地,在其他實施例中,程序可被編譯成適合其目標平臺的本機代碼機器語言(未示出)。用戶可根據已知軟體編程技術以及與特定源語言相關聯的特定邏輯和句法規則經由IDE 600中的用戶接ロ 640和原始碼編輯器651來創建和/或編輯原始碼組件。此後,原始碼組件610可經由源編譯器620被編譯,藉此可創建該程序的中間語言表示,諸如彙編630。彙編630可包括中間語言組件650和元數據642。應用設計可以能夠在部署前被驗證。本文所述的各種技術可結合硬體或軟體,或在適當時以其組合來實現。由此,本文所公開的方法和裝置或其特定方面或部分可採取包含在諸如軟盤、CD-ROM、硬碟驅動器或任何其它機器可讀存儲介質等有形介質中的程序代碼(即,指令)的形式,其中當程序代碼被加載到諸如計算機等機器內並由其執行時,該機器成為用於實現本文所公開的主題的各方面的裝置。在程序代碼在可編程計算機上執行的情況下,計算設備通常將包括處理器、該處理器可讀的存儲介質(包括易失性和非易失性的存儲器和/或存儲元件)、至少ー個輸入設備、以及至少ー個輸出設備。可例如通過使用數據處理API等來利用域專用編程模型各方面的創建和/或實現的一個或多個程序可用高級過程語言或面向對象的程式語言來實現以與計算機系統通信。然而,如果需要,該程序可以用彙編語言或機器語言來實現。在任何情形中,語言可以是編譯語言或解釋語言,且與硬體實現相結合。雖然已結合附圖描述了本文所公開的主題,但是應理解,可作出修改以按不同方式執行相同功能。
權利要求
1.一種系統,包括 處理器和存儲器;以及 編譯器,所述編譯器被配置為致使所述處理器 接收包括可恢復方法的原始碼,所述可恢復方法包括在句法上可區分的控制點表達式,所述控制點表達式具有籤名,其中所述編譯器調用多個程序模塊中的程序模塊,被調用的程序模塊是由所述控制點表達的籤名確定的,其中所述編譯器從被調用的程序模塊中創建至少一個專用對象;以及 加載處於所述編譯器外部的庫,所述庫包括所述多個程序模塊。
2.如權利要求I所述的系統,其特徵在於,由所述編譯器創建的多個專用對象表示執行控制鏈。
3.如權利要求I所述的系統,其特徵在於,被調用的程序模塊包括專用行為和專用方法,並且其中所述專用方法包括可恢復方法,所述可恢復方法包括異步方法或迭代器方法或對稱協同例程方法。
4.如權利要求I所述的系統,其特徵在於,所述編譯器將所接收的原始碼中的控制點表達式中的控制點改寫成對在所述可恢復方法暫停之前執行的方法的調用、以及對在所述可恢復方法恢復之後執行的方法的調用。
5.如權利要求4所述的系統,其特徵在於,用狀態機邏輯擴充派生的類,並且將專用命令改寫成用於狀態變換和掛起的派生的類。
6.一種方法,包括 在軟體開發計算機上的編譯器中接收原始碼,所述原始碼包括可恢復方法,所述可恢復方法包括在句法上可區分的控制點表達,其中所述編譯器調用基於基於模式的交互的代碼,所述代碼處於所述編譯器外部的庫中,所述編譯器從所述代碼中派生專用驅動程序類; 從派生的專用驅動程序類中實例化對象,所述對象表示包括異步方法或迭代器或對稱協同例程的可恢復方法。
7.如權利要求6所述的方法,其特徵在於,所述專用驅動程序類包括專用行為和專用方法。
8.如權利要求8所述的方法,其特徵在於,還包括 將所接收的原始碼變換成經擴充的輸出代碼,其中所述經擴充的輸出代碼包括對從符合所述基於模式的交互的模式的類中繼承的專用方法的回調,其中所述回調被所述編譯器插入到所述經擴充的原始碼中,所插入的回調包括對在所述可恢復方法暫停之前執行的方法的調用、以及對在所述可恢復方法恢復之後執行的方法的調用。
9.如權利要求6所述的方法,其特徵在於,所述在句法上可區分的控制點表達被嵌套在編寫所述原始碼的程式語言的控制結構內。
10.如權利要求6所述的方法,其特徵在於,所述可恢復方法被改寫成狀態機,其中用狀態機邏輯擴充所述可恢復方法的調用方法,並且把與所述可恢復方法相關聯的專用命令改寫成用於狀態變換和掛起的代碼。
11.一種包括當執行時使至少一個處理器執行下列操作的計算機可執行指令的計算機可讀存儲介質接收原始碼,所述原始碼包括與模式相關聯的可恢復方法,所述可恢復方法包括在句法上可區分的控制點表達,其中編譯器調用符合與所述可恢復方法相關聯的模式的代碼,所述代碼處於所述編譯器外部的庫中,所述編譯器從所述代碼中創建專用驅動程序類; 從派生的專用驅動程序類中實例化對象,所述對象表示包括異步方法或迭代器或對稱協同例程的可恢復方法。
12.如權利要求11所述的計算機可讀存儲介質,其特徵在於,進一步包括當執行時使所述至少一個處理器執行下列操作的計算機可執行指令 將專用行為和專用方法添加到來自被調用的代碼的派生的專用驅動程序類。
13.如權利要求11所述的計算機可讀存儲介質,其特徵在於,進一步包括當執行時使所述至少一個處理器執行下列操作的計算機可執行指令 將所接收的原始碼變換成經擴充的原始碼,其中所述經擴充的原始碼包括對從被調用的代碼中繼承的專用方法的回調,其中所述回調被所述編譯器插入到所述經擴充的輸出代碼中,所插入的回調包括對在所述可恢復方法暫停之前執行的方法的調用、以及對在所述可恢復方法恢復之後執行的方法的調用。
14.如權利要求10所述的計算機可讀存儲介質,其特徵在於,進一步包括當執行時使所述至少一個處理器執行下列操作的計算機可執行指令 為嵌套在編寫所接收的原始碼的程式語言的控制結構內的回調創建控制點。
15.如權利要求10所述的計算機可讀存儲介質,其特徵在於,進一步包括當執行時使所述至少一個處理器執行下列操作的計算機可執行指令 將包括所述可恢復方法的所接收的原始碼變換成經擴充的輸出代碼,使得所述經擴充的輸出代碼能夠在分立的部分中執行,每個分立的部分都在所述經擴充的輸出代碼中的控制點處開始和結束。
全文摘要
提供了API,所述API處於程式語言的外部但是提供可插入到語言編譯器中的功能。所提供的API調節與使用通用基於模式的方案進行的異步編程、迭代器或編寫對稱協同例程相關聯的功能。在API中提供了若干類型的可恢復方法,所述可恢復方法可以應用於以傳統程序代碼編寫的方法主體。以傳統編程代碼編寫的方法主體中的在句法上可區分的控制點通過編譯器使用外部API來調用該代碼的變換。經變換的代碼實現夾在經變換的代碼的控制點之間的代碼的暫停和恢復。裡面具有控制點的方法內所包括的原始碼被變換為使得該方法內的代碼可以在分立的部分中執行,每個部分都在經變換的代碼中的控制點處開始和結束。
文檔編號G06F9/45GK102859489SQ201180020904
公開日2013年1月2日 申請日期2011年4月26日 優先權日2010年4月27日
發明者H·J·M·梅傑, M·託格森, N·M·加夫特, N·古斯塔夫松 申請人:微軟公司

同类文章

一種新型多功能組合攝影箱的製作方法

一種新型多功能組合攝影箱的製作方法【專利摘要】本實用新型公開了一種新型多功能組合攝影箱,包括敞開式箱體和前攝影蓋,在箱體頂部設有移動式光源盒,在箱體底部設有LED脫影板,LED脫影板放置在底板上;移動式光源盒包括上蓋,上蓋內設有光源,上蓋部設有磨沙透光片,磨沙透光片將光源封閉在上蓋內;所述LED脫影

壓縮模式圖樣重疊檢測方法與裝置與流程

本發明涉及通信領域,特別涉及一種壓縮模式圖樣重疊檢測方法與裝置。背景技術:在寬帶碼分多址(WCDMA,WidebandCodeDivisionMultipleAccess)系統頻分復用(FDD,FrequencyDivisionDuplex)模式下,為了進行異頻硬切換、FDD到時分復用(TDD,Ti

個性化檯曆的製作方法

專利名稱::個性化檯曆的製作方法技術領域::本實用新型涉及一種檯曆,尤其涉及一種既顯示月曆、又能插入照片的個性化檯曆,屬於生活文化藝術用品領域。背景技術::公知的立式檯曆每頁皆由月曆和畫面兩部分構成,這兩部分都是事先印刷好,固定而不能更換的。畫面或為風景,或為模特、明星。功能單一局限性較大。特別是畫

一種實現縮放的視頻解碼方法

專利名稱:一種實現縮放的視頻解碼方法技術領域:本發明涉及視頻信號處理領域,特別是一種實現縮放的視頻解碼方法。背景技術: Mpeg標準是由運動圖像專家組(Moving Picture Expert Group,MPEG)開發的用於視頻和音頻壓縮的一系列演進的標準。按照Mpeg標準,視頻圖像壓縮編碼後包

基於加熱模壓的纖維增強PBT複合材料成型工藝的製作方法

本發明涉及一種基於加熱模壓的纖維增強pbt複合材料成型工藝。背景技術:熱塑性複合材料與傳統熱固性複合材料相比其具有較好的韌性和抗衝擊性能,此外其還具有可回收利用等優點。熱塑性塑料在液態時流動能力差,使得其與纖維結合浸潤困難。環狀對苯二甲酸丁二醇酯(cbt)是一種環狀預聚物,該材料力學性能差不適合做纖

一種pe滾塑儲槽的製作方法

專利名稱:一種pe滾塑儲槽的製作方法技術領域:一種PE滾塑儲槽一、 技術領域 本實用新型涉及一種PE滾塑儲槽,主要用於化工、染料、醫藥、農藥、冶金、稀土、機械、電子、電力、環保、紡織、釀造、釀造、食品、給水、排水等行業儲存液體使用。二、 背景技術 目前,化工液體耐腐蝕貯運設備,普遍使用傳統的玻璃鋼容

釘的製作方法

專利名稱:釘的製作方法技術領域:本實用新型涉及一種釘,尤其涉及一種可提供方便拔除的鐵(鋼)釘。背景技術:考慮到廢木材回收後再加工利用作業的方便性與安全性,根據環保規定,廢木材的回收是必須將釘於廢木材上的鐵(鋼)釘拔除。如圖1、圖2所示,目前用以釘入木材的鐵(鋼)釘10主要是在一釘體11的一端形成一尖

直流氧噴裝置的製作方法

專利名稱:直流氧噴裝置的製作方法技術領域:本實用新型涉及ー種醫療器械,具體地說是ー種直流氧噴裝置。背景技術:臨床上的放療過程極易造成患者的局部皮膚損傷和炎症,被稱為「放射性皮炎」。目前對於放射性皮炎的主要治療措施是塗抹藥膏,而放射性皮炎患者多伴有局部疼痛,對於止痛,多是通過ロ服或靜脈注射進行止痛治療

新型熱網閥門操作手輪的製作方法

專利名稱:新型熱網閥門操作手輪的製作方法技術領域:新型熱網閥門操作手輪技術領域:本實用新型涉及一種新型熱網閥門操作手輪,屬於機械領域。背景技術::閥門作為流體控制裝置應用廣泛,手輪傳動的閥門使用比例佔90%以上。國家標準中提及手輪所起作用為傳動功能,不作為閥門的運輸、起吊裝置,不承受軸向力。現有閥門

用來自動讀取管狀容器所載識別碼的裝置的製作方法

專利名稱:用來自動讀取管狀容器所載識別碼的裝置的製作方法背景技術:1-本發明所屬領域本發明涉及一種用來自動讀取管狀容器所載識別碼的裝置,其中的管狀容器被放在循環於配送鏈上的文檔匣或託架裝置中。本發明特別適用於,然而並非僅僅專用於,對引入自動分析系統的血液樣本試管之類的自動識別。本發明還涉及專為實現讀