專利名稱:異步工作流的制作方法
技術領域:
本發(fā)明 涉及一種基于計算機的方法和系統(tǒng),尤其涉及用于異步工作流的基于計算機的方法和系統(tǒng)。
背景技術:
計算機程序通常使用異步機制來執(zhí)行可能花費相對于CPU處理速度而言較長時間來完成的任務。該任務的示例是對盤進行讀寫、與遠程計算機通信或者查詢數(shù)據(jù)庫。異步操作允許用戶界面在應用程序執(zhí)行執(zhí)行其他工作或等待事件發(fā)生的同時保持響應性。異步工作流是使得程序能夠在不阻塞線程的情況下執(zhí)行異步操作的構造。F#編程語言提供允許程序包括異步工作流的機制。例如,程序可指定諸如web請求等第一操作以及諸如處理接收到的結果等第二操作。這可通過開始執(zhí)行第一操作并且繼續(xù)執(zhí)行第二操作來實現(xiàn)。該繼續(xù)具有對應的回調函數(shù),以使得當?shù)谝徊僮魍瓿蓵r,調用該回調函數(shù)并且第二操作執(zhí)行。以此方式,對其執(zhí)行第一操作的線程可以在該操作正在等待時被釋放,并且重用于另一操作。這允許調用比所存在的線程更多的操作。這還同步第一和第二操作,以使得第二操作被掛起直到第一操作完成。
發(fā)明內(nèi)容
提供本發(fā)明內(nèi)容以便以簡化形式介紹將在以下的具體實施方式
中進一步描述的一些概念。本發(fā)明內(nèi)容并不旨在標識出所要求保護的主題的關鍵特征或必要特征,也不旨在用于限定所要求保護的主題的范圍。簡而言之,一種系統(tǒng)、方法和組件用于實現(xiàn)已經(jīng)在計算機程序語言中指定的異步工作流。目標計算機程序語言可被轉換成狀態(tài)機的表示??蓤?zhí)行程序代碼可基于狀態(tài)機的表示來生成,該可執(zhí)行程序代碼實現(xiàn)狀態(tài)機。可執(zhí)行程序代碼可包括對應于包括用于調用異步操作的指令的第一代碼片段的第一狀態(tài),以及對應于將在異步操作完成后執(zhí)行的第二代碼片段的第二狀態(tài)。在一個實施方式中,在調用異步操作后,釋放線程。在執(zhí)行異步操作后,可將狀態(tài)機設為第二狀態(tài),以使得第二代碼片段將在狀態(tài)機繼續(xù)時執(zhí)行。在一個實施方式中,計算機程序語言的轉換包括創(chuàng)建包括異步工作流的函數(shù)。在調用異步操作后,該函數(shù)返回。在完成異步操作后,調用該函數(shù),從而模擬其中該函數(shù)在異步操作期間持久存儲的運行時環(huán)境。在一個實施方式中,為局部變量或參數(shù)創(chuàng)建變量閉包,以使得當函數(shù)繼續(xù)時,被封閉的變量持久存儲在其先前的狀態(tài)中。這些機制可用于以避免遞歸調用以及對于每一個異步操作的運行時棧的增長的方式實現(xiàn)多個異步操作。為了實現(xiàn)前述及相關目的,在這里結合以下描述及附圖來描述該系統(tǒng)的某些說明性方面。然而,這些方面僅指示了可采用本發(fā)明的原理的各種方法中的少數(shù)幾種,且本發(fā)明旨在包括所有這樣的方面及其等效方面。通過結合附圖考慮本發(fā)明的以下詳細描述,本發(fā)明的其它優(yōu)點以及新穎的特征將變得顯而易見。
參考以下附圖來 描述本發(fā)明的非限制性且非窮盡性實施方式。在各附圖中,除非另外指明,否則在全部附圖中相同的附圖標記指代相同的部分。為了幫助理解本發(fā)明,將參考以下與附圖相關聯(lián)地閱讀的具體實施方式
,附圖中圖1是其中可實現(xiàn)此處所描述的實施方式的計算機系統(tǒng)的框圖;圖2是可對其采用此處所描述的機制中的至少某一些的示例異步工作流;圖3示出了例示可以在一個實施方式中執(zhí)行的圖2的代碼片段的轉換的偽代碼;圖4A-C示出了可以在計算機程序的運行時期間由于采用此處所描述的機制中的至少某一些而生成的示例運行時數(shù)據(jù)結構;圖5示出了可由執(zhí)行諸如圖2所示的計算機程序而產(chǎn)生的示例多線程計算機環(huán)境;圖6是示出轉換程序代碼以便采用狀態(tài)機來實現(xiàn)異步工作流的過程的示例實施方式的流程圖;圖7是示出執(zhí)行計算機程序中的異步工作流的過程的示例實施方式的流程圖;圖8列出了示出具有兩個異步操作的狀態(tài)機的偽代碼;以及圖9示出了計算設備的一個實施方式,示出可用于執(zhí)行此處所描述的功能的計算設備的所選組件。
具體實施例方式下文中將參考附圖來更全面地描述本發(fā)明的各示例實施方式,附圖構成實施方式的一部分且在其中作為示例示出了可在其中實踐本發(fā)明的各特定示例實施方式。然而,本發(fā)明可被實現(xiàn)為許多不同的形式并且不應被解釋為被限于此處描述的各實施方式;相反, 提供這些實施方式以使得本公開變得透徹和完整,并且將本發(fā)明的范圍完全傳達給本領域技術人員。特別地,本發(fā)明可被實現(xiàn)為方法或設備。因此,本發(fā)明可采用完全硬件實施方式、 完全軟件實施方式或者結合軟件和硬件方面實施方式的形式。因此,以下詳細描述并非是局限性的。貫穿說明書和權利要求書,下列術語采用此處顯式相關聯(lián)的含義,除非該上下文在其他地方另有清楚指示。如此處所使用的,短語“在一個實施方式中”盡管它可以但不一定指前一實施方式。此外,如此處所使用的,短語“在另一個實施方式中”盡管它可以但不一定指前不同的實施方式。因此,可以容易地組合本發(fā)明的各實施方式而不背離本發(fā)明的范圍或精神。類似地,如此處所使用的,短語“在一個實現(xiàn)中”盡管它可以但不一定指相同的實現(xiàn),并且可以組合各種實現(xiàn)的技術。另外,如此處所使用的,術語“或”是包括性“或”運算符,并且等價于術語“和/ 或”,除非上下文清楚地另外指明。術語“基于”并非窮盡性的并且允許基于未描述的其他因素,除非上下文清楚地另外指明。另外,在本說明書全文中,“a”、“an”和“the”的含義包括復數(shù)引用。“在……中”的含義包括“在……中”和“在……上”。此處所描述的組件可以從其上具有數(shù)據(jù)結構的各種計算機可讀介質來執(zhí)行。組件可通過本地或遠程過程諸如按照具有一或多個數(shù)據(jù)分組(例如,來自一個通過信號與本地系統(tǒng)、分布式系統(tǒng)中的另一組件交互或跨網(wǎng)絡諸如因特網(wǎng)的其它系統(tǒng)交互的組件的數(shù)據(jù)) 的信號來通信。例如,軟件組件可被存儲在非瞬態(tài)計算機可讀存儲介質上,包括但不限于根據(jù)本發(fā)明的各實施方式的以下計算機可讀存儲介質專用集成電路(ASIC)、緊致盤(CD)、 數(shù)字多功能盤(DVD)、隨 機存取存儲器(RAM)、只讀存儲器(ROM)、軟盤、硬盤、電可擦除可編程只讀存儲器(EEPROM)、閃存或記憶棒。如此處所用的術語“計算機可讀介質”既包括非瞬態(tài)存儲介質又包括通信介質。通信介質通常以諸如載波或其它傳輸機制等“已調制數(shù)據(jù)信號”來體現(xiàn)計算機可讀指令、數(shù)據(jù)結構、程序模塊或其他數(shù)據(jù),并包括任何信息傳遞介質。作為示例而非限制,通信介質包括有線介質,如有線網(wǎng)絡或直接線連接,以及諸如聲學、無線電、紅外線及其他無線介質之類的無線介質。如此處所使用的,術語“應用程序”指計算機程序或其一部分并且可包括相關聯(lián)的數(shù)據(jù)。應用程序可以是獨立程序或者應用程序可被設計成向另一應用程序提供一個或多個特征。“附加件”和“插件”是與“主機”應用程序交互并向其提供特征的應用程序的示例。應用程序由應用程序組件的任何組合構成,應用程序組件可包括程序指令、數(shù)據(jù)、 文本、對象代碼、圖像或其他媒體、安全證書、腳本、或者可被安裝在計算設備上以使該設備能夠執(zhí)行所需功能的其他軟件組件。應用程序組件能夠以文件、庫、頁面、二進制塊或數(shù)據(jù)流的形式存在。如此處所使用的,除非上下文另外指明,否則術語“功能”指執(zhí)行特定任務的較大程序中的一部分代碼,并且能夠相對獨立于該程序的其他部分執(zhí)行。功能可以但不一定返回值。在各種計算機語言中,可使用不同的術語,諸如子例程、方法、過程或子程序。如此處所使用的,術語“功能”可以包括所有這些。如此處所使用的,術語“線程”指的是執(zhí)行線程。線程可以是軟件線程或硬件線程。 在硬件多線程處理器中,兩個或更多線程可以同時存在于該處理器上。某些處理器提供多組寄存器或其他組件,以使得多個硬件線程可具有其自己的寄存器組。硬件多線程處理器可具有多于它支持的硬件線程的數(shù)量的多個軟件線程。操作系統(tǒng)可管理軟件線程,向每一個軟件線程提供作為硬件線程執(zhí)行的輪次。如此處所使用的,多線程系統(tǒng)是支持可以是軟件或硬件線程的多個線程的系統(tǒng)。 多線程系統(tǒng)可具有或不具有對多線程的硬件支持。圖1是其中可實現(xiàn)此處所描述的實施方式的計算機系統(tǒng)100的框圖。圖1只是合適的系統(tǒng)配置的一個示例,并且不旨在對本發(fā)明的使用范圍或功能提出任何限制。因此,可采用各種系統(tǒng)配置而不背離本發(fā)明的范圍或精神。如圖所示,系統(tǒng)100包括程序源代碼102,該程序源代碼可以是目標計算機程序的高級語言表示。高級語言的示例包括F-Sharp (F#)、Visual Basic或各種其他高級語言。 作為語言和庫擴展的組合的LINQ是程序源代碼102的另一示例。在被編譯成本機代碼之前被編譯成中間語言的語言有時被稱為“托管語言”。程序可包括一個或多個函數(shù)。程序可以駐留在一個或多個文件或其他存儲表示中。程序可包括一個或多個庫,該一個或多個庫能夠以各種方式集成或分布。因此,程序源代碼102可表示程序庫或其一部分。如圖所示,系統(tǒng)100包括編譯器前端104。在一個實現(xiàn)中,編譯器前端包括詞法分析器、句法分析器(解析器)和語義分析器,但可采用各種其他組件或配置。在一個實施方式中,編譯器前端104處理目標程序源代碼102,以便將其轉換成中間語言模塊106。在一個實現(xiàn)中,中間語言模塊106可表示整個程序源代碼102并且包括多個功能,但該模塊可以只包括程序源代碼102的一部分或功能的一部分。在一個實現(xiàn)中,中間語言模塊106被存儲為一個或多個文件。在一個實現(xiàn)中,中間語言模塊 106包括對應于目標程序源代碼102 的二進制指令序列或二進制流。盡管未示出,但在一個實施方式中,該系統(tǒng)可包括運行時管理器,該運行時管理器是管理計算機程序的執(zhí)行的系統(tǒng)組件。在各種配置中,運行時管理器可執(zhí)行多個動作中的一個或多個,包括加載通過執(zhí)行計算機程序來調用的程序函數(shù)、轉換程序函數(shù)、定位并加載程序所采用的庫或其他資源、或者調用或管理各種程序資源。運行時管理器可被描述為實現(xiàn)向正在執(zhí)行的計算機程序提供各種資源和服務的系統(tǒng)框架。在一種配置中,運行時管理器包括即時(JIT)編譯器或其一部分。一般而言,JIT 編譯器采用其中程序函數(shù)的中間語言表示響應于其第一次調用而加載并被轉換成本機語言表示的機制。例如,當運行時程序第一次調用函數(shù)時,響應于檢測到該調用,該函數(shù)的中間語言表示可被快速編譯成本機代碼并且然后運行。本機語言表示可被存儲在存儲器中, 以使得后續(xù)調用不需要該轉換。運行時管理器的一個示例是華盛頓州雷蒙德市的微軟公司的公共語言運行時(CLR)組件。CLR組件采用被稱為公共中間語言(CIL)的中間語言表示。在一種配置中,運行時管理器的JIT編譯器可響應于檢測到對程序或函數(shù)的調用而在執(zhí)行之前立即將IL轉換成本機代碼。在一個實施方式中,系統(tǒng)可采用多個處理器,以使得 JIT編譯器可包括與另一函數(shù)的執(zhí)行同時加載或轉換函數(shù)的進程。該系統(tǒng)可以在執(zhí)行對函數(shù)的調用之前檢測到該調用,以使得加載或轉換的至少一部分在執(zhí)行調用之前執(zhí)行。術語 “檢測”包括在執(zhí)行調用之前在運行時期間檢測調用。在一種配置中,運行時管理器可以在運行時之前將IL轉換成本機代碼。如圖1所示,代碼操縱組件(CIC) 108可以從IL模塊106接收函數(shù)并且執(zhí)行各種變換,諸如在特定位置插入指令。修改可包括添加、刪除、移動或修改程序指令。插入或修改程序指令的過程被稱為“操縱”。系統(tǒng)100可包括鏈接器110,該鏈接器執(zhí)行組合并鏈接程序函數(shù)、修改或插入變量或函數(shù)引用等各種操作。在一個實施方式中,鏈接器110可檢索一個或多個幫助函數(shù)112 并將這些函數(shù)與中間語言程序組合以產(chǎn)生鏈接程序。系統(tǒng)100可包括代碼生成器114,該代碼生成器將中間代碼表示轉換成本機代碼 116。本機代碼116可以是機器語言、虛擬機語言或可由物理或虛擬處理器執(zhí)行的另一表示。編譯器前端104、代碼操縱組件108和代碼生成器114各自執(zhí)行代碼轉換功能。術語 “代碼轉換器”可以指這些組件或方便將程序表示轉換成諸如本機代碼116等另一程序表示的其他組件中的任一個或多個。處理器120可接收本機代碼116并執(zhí)行程序指令以產(chǎn)生執(zhí)行結果122。在一種配置中,處理器120可包括一個或多個中央處理單元、一個或多個處理器核、ASIC、或其他硬件處理組件和相關程序邏輯。在一種配置中,處理器120可包括模擬硬件處理單元的軟件組件。處理器120執(zhí)行本機代碼116中的指令。如此處所使用的,術語“運行時”指執(zhí)行本機代碼116期間的時間點或間隔,包括在可暫停執(zhí)行的時刻。執(zhí)行結果122是執(zhí)行本機代碼116的結果的邏輯表示。結果可包括對計算機存儲或計算機存儲器的修改、與其他處理器或計算設備的通信、音頻或視頻輸出、對各種系統(tǒng)或外部組件的控制中的一個或多個。在一個實施方 式中,狀態(tài)機的表示由代碼轉換器生成并與本機代碼116包括在一起。處理器120可生成、操縱或采用狀態(tài)機124,該狀態(tài)機是狀態(tài)機的運行時表示。狀態(tài)機 124可以有助于執(zhí)行結果122。系統(tǒng)100可以是開發(fā)系統(tǒng)的子系統(tǒng)。開發(fā)系統(tǒng)可包括由程序開發(fā)者或用戶用作為程序開發(fā)、測試或文檔編制過程的一部分的一個或多個計算設備。系統(tǒng)100的組件可以分布在一個或多個計算設備上,這些計算設備中的每一個通過采用諸如IP、TCP/IP、UDP、 HTTP、SSL、TLS, FTP、SMTP、WAP、藍牙、WLAN等各種有線或無線通信協(xié)議中的一種或多種來彼此通信。在一種配置中,本機代碼116可以用開發(fā)系統(tǒng)來開發(fā)并被分發(fā)給其中執(zhí)行這些本機代碼的一個或多個其他計算設備。計算設備可以是專用或通用計算設備。示例計算設備包括大型計算機、服務器、刀片服務器、個人計算機、便攜式計算機、通信設備、消費電子產(chǎn)品等。計算設備可包括通用或專用操作系統(tǒng)。華盛頓市雷蒙德市的微軟公司的Windows 系列操作系統(tǒng)是可以在開發(fā)系統(tǒng)的計算設備上執(zhí)行的操作系統(tǒng)的示例。圖1只是合適的系統(tǒng)的一個示例,并且不旨在對本發(fā)明的使用范圍或功能提出任何限制。因此,可采用各種系統(tǒng)配置而不背離本發(fā)明的范圍或精神。例如,CIC 108或鏈接器110可以與編譯器前端104組合。某些系統(tǒng)可以在沒有中間語言的情況下直接轉換成本機代碼??梢圆捎酶鞣N其他配置。圖2是可對其采用此處所描述的機制中的至少某一些的示例異步工作流200。圖 2示出了異步工作流200的兩個表示。源代碼片段202可以是程序源代碼102的一部分。 在該示例中,使用F#編程語言來進行說明,但也可使用其他語言。F#是包括功能性編程和命令性編程的各方面的編程語言。在示例源代碼片段202中,異步構造生成包括對將要執(zhí)行的任務的指定的對象。 對該對象的后續(xù)調用(未示出)將執(zhí)行這些任務并在完成時返回一值。在?#中,語言構造 "let ! var = expression”是執(zhí)行所指定的異步操作表達式,等待結果,并且在操作完成時將結果綁定到var的指令。在某些實現(xiàn)中,該工作流的其余部分被掛起并變?yōu)榈却龍?zhí)行系統(tǒng)事件的回調。示例源代碼片段202被分成五個代碼塊210-218。在被編譯和執(zhí)行時,該程序部分執(zhí)行以下操作。·順序地執(zhí)行代碼塊210的賦值語句以及代碼塊212處的while循環(huán)的開頭?!ふ{用異步操作;該操作從流中進行讀取并將輸入置于變量buffer中。 程序釋放其線程并且異步地等待對請求的響應?!ぴ摮绦蛟谕瓿僧惒絼幼骱螳@取響應?!?while循環(huán)的其余部分同步執(zhí)行?!ぱh(huán)重復直到完成并且然后返回buffer。在一個實施方式中,在程序轉換階段期間,編譯器生成表示該程序的后續(xù)執(zhí)行期間的可能的控制流的有向圖。生成有向圖可包括執(zhí)行以下動作的邏輯解析和分析程序源代碼、執(zhí)行控制流分析、以及生成具有表示程序指令塊的節(jié)點的有向圖。有向圖的節(jié)點可通過標識諸如代碼片段202中的對AsyncReadO的調用等異步指令,并且在這些指令中的每一個后的點處拆分節(jié)點來細分。有向圖204示出了對應于程序片段202的有向圖的示例。在有向圖204中,節(jié)點 A 220對應于代碼塊210 ;節(jié)點B 222對應于代碼塊212 ;節(jié)點C’ 224對應于代碼塊214 ;節(jié)點C” 226對應于代碼塊216 ;節(jié)點D 228對應于代碼塊218。如果在代碼片段202中不存在異步指令,則節(jié)點C’ 224和節(jié)點C”226可被組合成一個節(jié)點。然而,如此處所討論的,程序指令在異步指令點處被拆分成兩個單獨節(jié)點。有向圖204還包 括變遷230-238。變遷238是異步變遷,表示作為異步指令的結果的節(jié)點C,224和節(jié)點C” 226之間的變遷。在一個實施方式中,有向圖204中的每一個節(jié)點220-228可包括將在節(jié)點中同步地執(zhí)行的一個或多個指令。在一個實施方式中,諸如示例代碼片段202等程序的異步部分被變換成狀態(tài)機。 狀態(tài)機的每一個節(jié)點可包括一個或多個同步指令。變遷指示狀態(tài)改變,并且對應與引起該狀態(tài)改變的動作。例如,有向圖204可被變換成其中每一個節(jié)點對應一狀態(tài)的狀態(tài)機。變遷230、232、234和236表示同步變遷,其中節(jié)點的完成是一個觸發(fā)狀態(tài)改變的動作。變遷 238表示異步變遷,其中完成節(jié)點C’ 224以及由節(jié)點C’ 224的指令調用的異步動作的完成一同觸發(fā)到節(jié)點C” 226的狀態(tài)改變。圖3示出了例示可由編譯器前端或一個實施方式中的另一轉換器組件來執(zhí)行的代碼片段202的轉換的示例偽代碼302。偽代碼302實現(xiàn)對應于有向圖204的狀態(tài)機。如圖所示,偽代碼302包括以開始標簽開始的RimO函數(shù)。盡管代碼片段202不包括RunO函數(shù),但轉換過程可創(chuàng)建這一函數(shù)以涵蓋或包裝狀態(tài)機。switch(切換)語句包括五個case (范例),每一個case分別對應于節(jié)點A 220、節(jié)點B 222、節(jié)點C’ 224、節(jié)點 C” 226或節(jié)點D 228。switch語句的每一個case執(zhí)行對應節(jié)點的程序指令。這些程序指令分別對應代碼塊210-218的程序指令。將每一狀態(tài)認為是節(jié)點標識,switch語句將控制轉移到對應于該節(jié)點的代碼塊的指令。在case A、B和C”中的每一個處,執(zhí)行代碼塊并且將狀態(tài)設為狀態(tài)機的下一狀態(tài)。然后將控制轉移到開始標簽的位置,其中重新執(zhí)行switch 語句。case D未跳回到開始,因為它結束該函數(shù)。case C’對應節(jié)點C’ 224和代碼塊214。該case執(zhí)行代碼塊。它隨后調用異步操作,傳遞回調,該回調將在由異步操作在其完成時執(zhí)行時將狀態(tài)設為C”并且執(zhí)行RimO。 在調用異步操作后,控制流退出switch語句并且退出RimO函數(shù)。實現(xiàn)異步工作流的系統(tǒng)或庫代碼可執(zhí)行異步操作。當異步操作完成時,該異步操作可執(zhí)行回調,如上所述,回調可將狀態(tài)設為C”并且重新調用RimO。對RunO的調用將重新進入狀態(tài)機,再次執(zhí)行switch 語句,并且在C” case處繼續(xù)。圖4A-C示出了可以在計算機程序的運行時期間由于采用此處所描述的機制中的至少某一些而生成的示例運行時數(shù)據(jù)結構400A-C。在圖400A-C的討論中,具有相同的基礎附圖標記和不同的字母后綴的組件指代計算機程序的運行時期間的不同時刻處的相同組件。圖4A表示在節(jié)點C’ 224中的就在調用異步函數(shù)調用之前的執(zhí)行偽代碼302的點處的數(shù)據(jù)結構400A。如圖所示,運行時棧410A包括對應于偽代碼302的Run ()函數(shù)的幀414A。 在幀414A下面的是對應于可包括代碼片段202 (圖2)的程序代碼的函數(shù)fimc_f00 ()的幀 416A。具有對應棧幀的函數(shù)實例被稱為是“活動的”。如圖所示,fimC_f00()的一個實例以及RimO的一個實例是活動的。盡管RunO不是代碼片段202中的指定函數(shù),但如此處所討論的,轉換器可生成實現(xiàn)這一函數(shù)的程序代碼。變量閉包是捕捉諸如程序變量等元素以便稍后即使在原始元素可能已經(jīng)改變或者定義這些元素的函數(shù)不再存在的情況下也使用的機制。例如,程序變量可被保存在堆存儲器中的位置中。圖4A還示出包括對應于RimO函數(shù)中的被封閉的每一個局部變量或參數(shù)的條目的變量閉包結構412A。在該示例中,條目418A、420A、422A、424A和426A分別對應局部變量偏移量、計數(shù)和緩沖區(qū),以及參數(shù)流和長度。這些封閉變量中的每一個都可以在代碼片段202的原始程序代碼中看見,但在偽代碼302中未示出這一程度的細節(jié)。在執(zhí)行 RunO函數(shù)時對這些封閉變量中的每一個的引用訪問變量閉包結構412A中的對應條目。圖4B的運行時棧410B和變量閉包結構412B分別對應運行時棧410A和變量閉包結構412A。圖4B的運行時數(shù)據(jù)結構400B中的每一個示出了在已經(jīng)調用異步函數(shù)并且 RunO函數(shù)已經(jīng)退出后,但在已經(jīng)調用RunO函數(shù)作為回調之前的稍后時間點處的圖4B的對應結構。運行時棧410B不包括對應于RimO函數(shù)的條目。函數(shù)fimC_f00()在棧的頂端。 在所示實施方式中,包括以上討論的對應于封閉變量的條目418B-426B中的每一個的變量閉包結構412B保持不變。圖4C的變量閉包結構412C對應變量閉包結構412B,并且示出已經(jīng)調用Run ()函數(shù)作為回調函數(shù)之后的稍后時間點處的變量閉包結構,并且狀態(tài)機處于case C”狀態(tài),同時在節(jié)點C”226中。運行時棧430可在稍后時刻與運行時棧410相同,或者它可以是不同線程的運行時棧。在某些配置中,可對相同線程調用RimO函數(shù)作為其父函數(shù)。在某些配置中,可以對不同的線程調用RunO函數(shù)。如圖所示,對應于RunO函數(shù)的幀414C已進棧到運行時棧430上。在所示實施方式中,幀414C和幀414A各自對應于相同程序代碼的單個實例。幀414C因此被稱為等價于幀414A。為清楚起見,遞歸函數(shù)可具有兩個實例,每一個都具有運行時棧上的對應幀,但它們將不被認為是等價的。同樣,它們可具有局部變量的不同實例。RunO的實例現(xiàn)在是活動的。如圖所示,變量閉包結構412B保持不變,包括以上討論的對應于封閉變量的條目418B-426B中的每一個。保存每一個封閉變量的值。盡管函數(shù) RunO退出并且從運行時棧410中退棧并且隨后進棧回到該棧,但對變量閉包結構412的使用使得能夠以與在RimO函數(shù)的先前實例期間相同的方式保存和訪問每一個封閉變量??梢哉f,該機制模擬其中RimO函數(shù)不存在于節(jié)點C’ 224的異步調用和來自節(jié)點 C" 226的程序代碼的后續(xù)執(zhí)行之間的情形。該情形的一個結果是盡管節(jié)點C,224(以及對應的塊214)的異步調用可以在執(zhí)行偽代碼302期間執(zhí)行多次,但最多一個對應于RimO函數(shù)的運行時棧幀在該棧上。這可避免用于實現(xiàn)異步結構的遞歸調用以及用RimO函數(shù)的多個實例擴展的運行時棧。圖5示出了可由執(zhí)行諸如圖2所 示的計算機程序而產(chǎn)生的示例多線程計算機環(huán)境 500。如圖所示的計算機環(huán)境500包括線程1502以及線程2504。這些可以是硬件線程、軟件線程或其組合。線程可以是線程池中的由進程或應用程序共享的成員。典型的計算機環(huán)境包括許多線程,但此處只示出了兩個線程。計算機環(huán)境500包括在線程1502和線程2504中的一個上執(zhí)行的任何的多個實例。為了簡明起見,任務的每一個實例被稱為任務。每一個任務被標記為對應圖2的代碼塊和節(jié)點。因此,任務A 506、任務B 508、任務C’ 510和任務C” 514分別對應節(jié)點A 220、 節(jié)點B 222、節(jié)點C’ 224和節(jié)點C” 226。時間線536示出以時間次序示出的每一個線程,且時間在向下方向上增加。因此, 特定線程中的從上到下的任務排序示出了這些任務的時間排序。在具有異步任務的多線程環(huán)境中,許多不同的配置是可能的。應當理解,圖5只示出了眾多可能的配置中的一種,以示出此處所描述的機制。如圖所示,任務A 506、任務B 508和任務510同時在線程1502上執(zhí)行。如此處所討論的,節(jié)點C’ 224包括異步函數(shù)調用。在多線程系統(tǒng)中,異步調用允許在其中執(zhí)行該異步調用的線程變?yōu)閷ζ渌蝿湛捎谩<^512表示除了圖2所示的示例異步結構的任務A-D 之外的一個或多個任務。可能存在來自相同進程的另一部分、相同程序的另一進程或另一程序的任務。這些任務在本討論中被稱為外部任務。當完成任務C’ 510的異步操作時,可調度任務C” 514在線程上執(zhí)行。在所示示例中,已完成與箭頭512相關聯(lián)的任務并且任務C” 514在線程1502上執(zhí)行。因為在任務 C”514中不存在異步操作,所以任務B 516(表示任務B508的另一實例)也在線程1502上執(zhí)行。類似地,任務C’ 518的另一實例在同一線程上執(zhí)行。任務C’ 518的異步操作再次釋放線程1502,以便允許由箭頭520表示的一個或多個外部任務在該線程上執(zhí)行。當任務C’ 518的操作完成時,在該示例中操作系統(tǒng)調度任務 C”528的另一實例在線程2504上執(zhí)行。任務B 530和任務C,532跟隨任務C”528并且在線程2504上執(zhí)行。任務C’532的異步操作釋放線程2504,以便允許由箭頭534表示的一個或多個外部任務在該線程上執(zhí)行。當任務C’532的操作完成時,在該示例中操作系統(tǒng)調度任務C”522 的另一實例在線程1502上執(zhí)行。任務B 524跟隨任務C”522并且在線程1502上執(zhí)行。在該迭代中,程序從節(jié)點B行進至節(jié)點D,并由此任務D 526在線程1502上執(zhí)行,以完成異步結構的執(zhí)行。圖5提供了線程調度可以如何與異步程序結構一起工作的圖示。如圖所示,異步調用可釋放線程以供外部任務使用。當后繼任務繼續(xù)時,該任務可以在相同線程上執(zhí)行或者該任務可以“跳”至不同線程,如任務C” 528跳至線程2504。多個工作流可以在一組比工作流的數(shù)量少的線程上執(zhí)行,以減少或甚至消除由于被阻塞的工作流持有線程而產(chǎn)生的阻塞。在某些配置中,可能 期望一個或多個任務的集合保持在指定線程上。例如,可能期望涉及用戶界面的任務保持在UI線程上。語言構造或庫可提供使得任務能夠保持在指定線程或線程池上的機制。如通過任務506、508和510、由箭頭512表示的一個或多個外部任務以及任務514、516和518的調度示出的,這些機制使得能夠調用異步函數(shù)并且允許其他任務在相同線程上繼續(xù),由此避免或最小化可能發(fā)生的任何阻塞。圖6是示出轉換程序代碼以便采用狀態(tài)機來實現(xiàn)異步工作流的過程600的示例實施方式的流程圖。在一個實施方式中,過程600中的某些動作由圖1的計算機系統(tǒng)100的組件來執(zhí)行。具體而言,編譯器前端104、代碼操縱組件108或代碼生成器114可執(zhí)行過程 600的至少各部分。在一個實施方式中,正被轉換的程序代碼可以是程序源代碼102或中間語言模塊106。在一個實施方式中,過程600可以分兩個或更多階段執(zhí)行。例如,一部分可由編譯器前端104執(zhí)行,而一部分由代碼操縱組件108執(zhí)行。過程600可以是執(zhí)行各種程序轉換動作的父過程的一部分。它可被集成到編譯器中或者作為外部組件來調用。過程600的所示各部分可以在框602處開始,在那里可解析諸如由代碼片段202 示出的具有異步構造的代碼片段。異步構造可以是包括異步操作的程序片段。該過程可行進至框604,在那里基于解析來查找或確定調用一個或多個異步操作的一個或多個指令。如此處所討論的,在FiHg言中,“l(fā)et ! ”操作符以被賦值者表達式指示異步操作,但其他操作符或構造也可指示異步操作。該過程可行進至框606,在那里可基于異步構造和異步操作的指令來生成有向圖。 在一個實現(xiàn)中,有向圖可基于構造的控制流在不考慮異步操作的情況下生成;該圖然后可通過分解包括至少一個異步操作的節(jié)點來修改。在一個實現(xiàn)中,一個或多個異步操作可以在生成初始有向圖時考慮。圖2的有向圖204是可通過框606的動作生成的有向圖的示例。該過程可行進至框608,在那里可基于有向圖來生成狀態(tài)機。該狀態(tài)機指的是可以隨后在運行時期間用來實現(xiàn)狀態(tài)機的指令或數(shù)據(jù)。由此,編譯時狀態(tài)機和運行時狀態(tài)機被認為是同一狀態(tài)機的表示。盡管圖6包括針對對應動作的不同塊606和608,但在某些實現(xiàn)中,這些塊的動作可以組合以便基于異步構造以及一個或多個異步操作來生成狀態(tài)機。該過程可行進至塊610,在那里可生成保存程序狀態(tài)的元素以供隨后在執(zhí)行狀態(tài)機時在運行時期間使用的指令。該指令可包括用于實現(xiàn)變量閉包以使得局部變量和參數(shù)能夠在運行時期間封閉的指令,如此處所討論的。在一個實現(xiàn)中,這可包括為異步構造中的程序代碼所使用的至少某些程序變量生成變量閉包的指令。在一個實現(xiàn)中,狀態(tài)機的當前狀態(tài),如由偽代碼302中的變量狀態(tài)表示的,可被保存在與變量閉包不同的結構中。該過程可行進至完成框612,并且退出或返回到調用程序。圖7是示出執(zhí)行計算機程序中的異步工作流的過程700的示例實施方式的流程圖;在一個實施方式中,過程700中的某些動作由處理器120 (圖1)執(zhí)行,該處理器用表示包括從過程600中產(chǎn)生的轉換的程序源代碼102的可執(zhí)行指令來配置。包括中間狀態(tài)的過程700的結果可被認為是執(zhí)行結果122的至少一部分。過程700的所示部分可以在框702處開始,在那里可初始化狀態(tài)機和變量閉包。在對應于偽代碼302(圖3)的示例狀態(tài)機中,初始化狀態(tài)機可包括初始化分配給變量狀態(tài)的值、初始化程序計數(shù)器或調用RimO函數(shù)中的一個或多個。這可包括生成包括每一狀態(tài)和程序代碼中的位置之間的對應關系的表,或者將這一表加載到存儲器中。在一個實施方式中,初始化可包括創(chuàng)建存儲在異步工作流中訪問的局部變量或參數(shù)的變量閉包。該過程可行進至循環(huán)704,該循環(huán)為狀態(tài)機進入的每一狀態(tài)迭代,并且在已經(jīng)達到最終狀態(tài)或者該過程出于諸如異常等另一原因而結束時退出。圖2的節(jié)點D 228示出了最終狀態(tài)。在所示實施方式中,循環(huán)704包括塊706-720并且由塊722終止。該過程可行進至塊706,在那里可 執(zhí)行當前狀態(tài)的程序代碼。在圖2和3的示例中,這可包括偽代碼302中的switch語句中的對應于節(jié)點224-228中的一個以及代碼塊 210-218中的一個的一個case中的程序代碼。在第一次迭代中,該程序代碼可以是節(jié)點A220和代碼塊210。在第一次后的各次迭代中,程序代碼對應于在前一迭代中設置的狀態(tài)。該過程可行進至判定框710,在那里確定正在為當前狀態(tài)執(zhí)行的程序代碼是否包括異步操作。如果包括,則該過程可行進至塊712,在那里調用異步操作。包裝狀態(tài)機的函數(shù)可作為回調函數(shù)來傳遞,以便在異步操作完成時調用。由轉換器生成以包裝狀態(tài)機的函數(shù)在此處被稱為包裝函數(shù)。在偽代碼302的示例中,RimO函數(shù)是這一函數(shù)。該過程可從框712行進至框714,在那里當前函數(shù)退出。在偽代碼302的示例中, RunO函數(shù)可退出。圖4B示出了所得棧410B,其中RimO函數(shù)已經(jīng)從該棧中退棧。變量閉包結構412B繼續(xù)存儲封閉變量。此時,其上正在執(zhí)行異步工作流的程序代碼的線程可被釋放,并且變得對其他任務可用,如此處所討論的。在某一時間段后,發(fā)生事件716,該事件是完成在框712處調用的異步操作。響應于此,系統(tǒng)代碼可通過重新進入包裝函數(shù)來重新進入異步工作流。在一個實施方式中,這可以是調用框712中傳遞的回調函數(shù)的形式。由此,該過程行進至框718,在那里重新進入包裝函數(shù)。圖4C示出了所得棧430,其中RimO函數(shù)已經(jīng)進棧到該棧上。變量閉包結構412C繼續(xù)存儲封閉變量。運行時棧和變量閉包由此就像它們在調用異步操作之前那樣出現(xiàn)。該過程模擬其中包裝函數(shù)不退出的流程,并且簡單地跳回到開頭,但線程被釋放,同時等待異步操作完成。在一個實現(xiàn)中,框718的動作包括基于狀態(tài)機來將當前狀態(tài)設為下一狀態(tài)。在一個實現(xiàn)中,對異步操作的調用包括傳遞具有設置下一當前狀態(tài)的指令的拉姆達(lambda) 函數(shù)。該過程可行進至結束循環(huán)框722,并且執(zhí)行循環(huán)704的另一次迭代。在判定框710, 如果確定當前節(jié)點不包括對異步操作的調用,則該過程可行進至框720,在那里將當前狀態(tài)設為狀態(tài)機的下一狀態(tài)。在一個實現(xiàn)中,該塊可以與結束循環(huán)塊722集成,以使得在該循環(huán)將要退出的情況下不設置當前狀態(tài)。如有向圖204和偽代碼302所示,對于來自任何狀態(tài)的下一狀態(tài)可以存在零個、一個或多個選項。該過程可行進至結束循環(huán)框722并且基于當前狀態(tài)是否結束該循環(huán)來選擇性地重復循環(huán)704的另一次迭代。在退出循環(huán)704時,該過程可以退出或返回到調用程序,諸如跟隨異步工作流的程序代碼。雖然上文中討論的示例示出了異步工作流中的單個異步操作,但此處所描述的機制可以應用于在異步工作流中具有一個、兩個或更多異步操作的計算機程序。圖8列出了示出具有兩個異步操作的狀態(tài)機的偽代碼802。它與偽代碼302的不同之處在于它包括額外狀態(tài)C”’。狀態(tài)C”’跟隨狀態(tài)C’中的異步操作并且其本身包括異步操作。如此處所討論的,在對狀態(tài)C’或C”的異步操作的每一個調用之后,RimO函數(shù)退出。在異步操作完成后重新進入該函數(shù)。因此不存在RimO函數(shù)的遞歸,并且在執(zhí)行對應于每一狀態(tài)的程序代碼期間,可以存在對應于RunO函數(shù)的單個運行時棧幀,以及對變量閉包的單個分配。在每一異步操作后,RunO函數(shù)退出并且運行時??梢允侨鐖D4B所示的那樣。在RimO已經(jīng)作為跟隨狀態(tài)C”的異步操作的回調函數(shù)來調用并且該函數(shù)進入狀態(tài) C”,后,運行時棧可以是如圖4C所示的那樣,具有等價于幀414A的幀414C。
圖9示出了計算設備的900 —個實施方式,示出可用于執(zhí)行此處所描述的功能 (包括過程600或700)的計算設備的所選組件。計算設備900可包括比所示多得多的組件,或者可包括比所示全部更少的組件。計算設備900可以是獨立計算設備或集成系統(tǒng)的一部分,諸如具有一個或多個刀片的機殼中的刀片。如圖所示,計算設備900包括一個或多個處理器902,這些處理器執(zhí)行各種動作以便執(zhí)行各種計算機程序的指令。在一種配置中,處理器902可包括一個或多個中央處理單元、一個或多個處理器核、一個或多個ASIC、高速緩存存儲器、或其他硬件處理組件和相關程序邏輯。處理器902可包括圖1的處理器120。如圖所示,計算設備900包括操作系統(tǒng)904。 操作系統(tǒng)904可以是通用或專用操作系統(tǒng)。華盛頓市雷蒙德市的微軟公司的Windows 系列操作系統(tǒng)是可以在計算設備900上執(zhí)行的操作系統(tǒng)的示例。盡管未示出,但計算設備900 可包括提供一個或多個庫、虛擬機或執(zhí)行環(huán)境的軟件框架。微軟公司的Microsoft . NET框架是軟件框架的示例。存儲器906可包括各種類型的非瞬態(tài)計算機存儲介質中的一種或多種,包括易失性或非易失性存儲器、RAM、ROM、固態(tài)存儲器、盤驅動器、光存儲、或可用于存儲數(shù)字信息的任何其他介質。存儲器906可存儲此處所描述的一個或多個組件或其他組件。在一個實施方式中,存儲器906存儲程序源代碼102、編譯器前端104、本機代碼116、狀態(tài)機124或變量閉包結構412中的一個或多個。存儲器906可存儲系統(tǒng)100的任何軟件組件。這些組件中的任一個或多個可由操作系統(tǒng)904或其他組件移至RAM中、非易失性存儲器中或RAM和非易失性存儲器之間的不同位置。計算設備900可包括視頻顯示適配器912或語音組件(未示出),該適配器方便向用戶顯示本地化文本串,該語音組件將文本轉換成音頻語音并且向用戶呈現(xiàn)口頭串。盡管未在圖9中示出,但計算設備900可包括基本輸入/輸出系統(tǒng)(BIOS)及相關聯(lián)的組件。計算設備900還可包括用于與網(wǎng)絡通信的網(wǎng)絡接口單元910。計算設備900的各實施方式可包括顯示器監(jiān)視器914、鍵盤、定點設備、音頻組件、話筒、語音識別組件或其他輸入/輸出機制中的一個或多個。可以理解,圖6-7的流程圖中的每一個塊以及該流程圖中的塊組合可由軟件指令來實現(xiàn)。這些程序指令可被提供給處理器以產(chǎn)生機器,以使得在該處理器上執(zhí)行的指令創(chuàng)建用于實現(xiàn)在 一個或多個流程圖框中指定的動作的手段。軟件指令可由處理器執(zhí)行以提供用于實現(xiàn)在一個或多個流程圖塊中指定的動作的步驟。另外,流程圖中的一個或多個塊或塊組合還可以與其他塊或塊組合同時執(zhí)行,或者甚至以與所示不同的順序執(zhí)行,而不背離本發(fā)明的范圍或精神。以上說明、示例和數(shù)據(jù)提供了對本發(fā)明的組成部分的制造和使用的全面描述。因為可以在不背離本發(fā)明的精神和范圍的情況下做出本發(fā)明的許多實施方式,所以本發(fā)明落在所附權利要求的范圍內(nèi)。
權利要求
1.一種將目標計算機程序(102)轉換成包括執(zhí)行異步操作的程序指令的目標程序可執(zhí)行代碼(116)的基于計算機的方法,包括a)確定(604)包括用于調用所述異步操作的指令的代碼片段;b)基于所述代碼片段以及用于調用所述異步操作的所述指令來生成(606)狀態(tài)機的表示,所述狀態(tài)機具有對應于所述代碼片段的包含用于調用所述異步操作的所述指令的第一部分(224)的第一狀態(tài),以及對應于所述代碼片段的將在所述異步操作完成后執(zhí)行的第二部分(226)的第二狀態(tài);c)生成(608、610)用于在所述目標計算機程序的運行時實現(xiàn)所述狀態(tài)機的可執(zhí)行程序代碼。
2.如權利要求1所述的基于計算機的方法,其特征在于,用于實現(xiàn)所述狀態(tài)機的所述可執(zhí)行程序代碼包括用于傳遞具有異步調用的拉姆達函數(shù)的一個或多個指令,所述拉姆達函數(shù)將所述狀態(tài)機的狀態(tài)設為所述第二狀態(tài)。
3.如權利要求1所述的基于計算機的方法,其特征在于,用于實現(xiàn)所述狀態(tài)機的所述可執(zhí)行程序代碼包括對包括對應于所述代碼片段的第一部分的第一可執(zhí)行代碼片段以及對應于所述代碼片段的第二部分的第二可執(zhí)行代碼片段的函數(shù)的指定、用于在調用所述異步操作后并在所述異步操作完成前從所述函數(shù)返回的邏輯、以及所述函數(shù)將在所述異步操作完成后被調用的指定。
4.如權利要求1所述的基于計算機的方法,其特征在于,用于實現(xiàn)所述狀態(tài)機的所述可執(zhí)行程序代碼包括用于執(zhí)行以下操作的程序指令創(chuàng)建與包括所述第一可執(zhí)行代碼片段和所述第二可執(zhí)行代碼片段的函數(shù)的范圍內(nèi)的一個或多個變量相關聯(lián)的變量閉包。
5.如權利要求1所述的基于計算機的方法,其特征在于,還包括生成實現(xiàn)包含所述第一可執(zhí)行代碼片段和所述第二可執(zhí)行代碼片段的函數(shù)的函數(shù)代碼,所述用于實現(xiàn)所述狀態(tài)機的可執(zhí)行程序代碼使得對應于所述第一可執(zhí)行代碼片段的第一棧幀等價于對應于所述第二可執(zhí)行代碼片段的第二棧幀。
6.如權利要求1所述的基于計算機的方法,其特征在于,所述目標可執(zhí)行程序代碼包括可由一個或多個處理器執(zhí)行以執(zhí)行以下動作的計算機程序指令a)從當前函數(shù)中調用異步操作;b)將所述狀態(tài)機設為處于所述第二狀態(tài);c)在調用所述異步操作后從所述當前函數(shù)中退出;以及d)響應于完成所述異步操作,調用所述當前函數(shù)。
7.如權利要求1所述的基于計算機的方法,其特征在于,所述目標可執(zhí)行程序代碼包括可由一個或多個處理器執(zhí)行以執(zhí)行以下動作的計算機程序指令在每一次執(zhí)行所述代碼片段的第一部分以及每一次執(zhí)行所述代碼片段的第二部分期間維護對應于所述狀態(tài)機的單個棧幀。
8.如權利要求1所述的基于計算機的方法,其特征在于,所述目標可執(zhí)行程序代碼包括可由一個或多個處理器執(zhí)行以執(zhí)行以下動作的計算機程序指令a)在所述狀態(tài)機的對應狀態(tài)中調用多個異步操作;以及b)在每一次調用期間維護對應于所述狀態(tài)機的單個棧幀。
9.如權利要求1所述的基于計算機的方法,其特征在于,所述目標可執(zhí)行程序代碼包括可由一個或多個處理器執(zhí)行以執(zhí)行以下動作的計算機程序指令a)生成對于當前函數(shù)是局部的至少一個變量的變量閉包;b)從所述當前函數(shù)中調用異步操作;c)在完成所述異步操作后接收對所述當前函數(shù)的調用;d)在調用所述當前函數(shù)后,采用所述變量閉包來從所述當前函數(shù)訪問所述至少一個變量。
10.一種用于將目標計算機程序(102)轉換成包括執(zhí)行異步操作的程序指令的目標程序可執(zhí)行代碼(116)的基于計算機的系統(tǒng),包括a)標識所述目標計算機程序中的異步構造的解析器(104、108);b)轉換器組件(104、108、114),其被配置成執(zhí)行包括基于所述異步構造來生成狀態(tài)機的表示的動作,所述狀態(tài)機具有對應于異步操作的第一狀態(tài)以及對應于所述目標計算機程序中的將在所述異步操作完成后執(zhí)行的部分的第二狀態(tài);以及c)被配置成生成實現(xiàn)所述狀態(tài)機的可執(zhí)行程序代碼(116)的代碼生成組件(114),所述可執(zhí)行程序代碼包括在被處理器執(zhí)行時執(zhí)行以下動作的指令i.在所述第一狀態(tài)中,從線程(502)調用(712)所述異步操作,所述第一狀態(tài)具有對應的運行時棧配置; .在調用所述異步操作后,釋放(714)所述線程(502);iii.在所述異步操作完成(716)后,在所述第二狀態(tài)中執(zhí)行(706)程序代碼,所述第二狀態(tài)具有等價于對應于所述第一狀態(tài)的運行時棧幀(414A)的對應的運行時棧幀(414C); 以及iv.生成(702)使得能夠在所述第一狀態(tài)或所述第二狀態(tài)中執(zhí)行所述程序代碼期間訪問局部變量的變量閉包結構(412)。
11.如權利要求10所述的基于計算機的系統(tǒng),其特征在于,所述轉換器組件包括用于基于有向圖來生成所述狀態(tài)機的表示的裝置,所述有向圖表示所述可執(zhí)行程序代碼的后續(xù)執(zhí)行期間的控制流。
12.如權利要求10所述的基于計算機的系統(tǒng),其特征在于,所述轉換器組件包括用于生成包裝所述狀態(tài)機的函數(shù)的裝置以及用于生成在所述第一狀態(tài)和所述第二狀態(tài)中維護所述函數(shù)的單個實例的可執(zhí)行程序代碼的裝置。
13.如權利要求10所述的基于計算機的系統(tǒng),其特征在于,所述解析器被配置成以F# 編程語言解析所述目標計算機程序。
14.如權利要求10所述的基于計算機的系統(tǒng),其特征在于,所述程序指令被配置成執(zhí)行轉換器定義的函數(shù)內(nèi)的異步操作,所述系統(tǒng)還包括用于執(zhí)行以下動作的裝置使所述程序指令能夠執(zhí)行所述異步操作以便在不退出所述轉換器定義的函數(shù)并且不使用遞歸的情況下執(zhí)行多次。
15.如權利要求10所述的基于計算機的系統(tǒng),其特征在于,所述程序指令動作還包括使得能夠從所述狀態(tài)機中并且在不遞歸地調用所述異步操作的情況下多次執(zhí)行所述異步操作。
全文摘要
描述了一種用于在計算機程序中實現(xiàn)異步構造的系統(tǒng)和方法。從計算機程序中生成狀態(tài)機,并且轉換該程序以生成在運行時期間執(zhí)行該狀態(tài)機的代碼。該異步構造可以變成函數(shù),該函數(shù)調用異步函數(shù),傳遞該函數(shù)作為回調并隨后退出。當異步操作完成時,調用該函數(shù)作為回調,返回到等價于異步調用之前的配置的配置。可使用變量閉包來在調用異步操作之前的狀態(tài)以及調用異步操作之后的狀態(tài)期間維護變量的狀態(tài)。
文檔編號G06F9/52GK102222023SQ201110102138
公開日2011年10月19日 申請日期2011年4月14日 優(yōu)先權日2010年4月15日
發(fā)明者D·洛莫夫, D·賽姆, L·霍本, T·Y·T·額 申請人:微軟公司