專利名稱::用于事件處理的虛擬機(jī)和編程語言的制作方法
技術(shù)領(lǐng)域:
:本發(fā)明涉及計算機(jī),更具體地說,涉及用于事件處理(例如,在業(yè)務(wù)監(jiān)視和/或業(yè)務(wù)集成環(huán)境中)的虛擬機(jī)和編程語言。
背景技術(shù):
:事件驅(qū)動的應(yīng)用程序在業(yè)務(wù)監(jiān)視和業(yè)務(wù)集成中扮演著越來越重要的角色。例如,國際商業(yè)機(jī)器公司(“IBM”)提供的WebSphere業(yè)務(wù)集成平臺支持用于業(yè)務(wù)環(huán)境的多種不同類型的事件驅(qū)動的可執(zhí)行體(executables)。這些類型的可執(zhí)行體包括狀態(tài)機(jī)、用于復(fù)雜事件處理(“CEP”)和事件關(guān)聯(lián)的規(guī)則以及監(jiān)視上下文。(“WebSphere”是IBM在美國和/或其他國家/地區(qū)的注冊商標(biāo)。)在業(yè)務(wù)監(jiān)視和業(yè)務(wù)集成環(huán)境中,通常作為消息傳送事件。消息驅(qū)動的可執(zhí)行體包括過程和調(diào)解(mediation)。
發(fā)明內(nèi)容在第一方面中,本發(fā)明涉及執(zhí)行事件處理的虛擬機(jī)。在一個實施例中,此方面包括在計算機(jī)上使用所述虛擬機(jī)執(zhí)行來自程序的指令,其中所述指令包括以下指令中的至少一個事件指令,其用于接收入站事件;賦值指令,其用于分配值;分支指令,其用于有條件的轉(zhuǎn)移到另一個指令;發(fā)送指令,其用于指定要發(fā)送出站事件;終止指令,其用于指定要終止當(dāng)前執(zhí)行上下文對象;以及扇出指令,其用于指定事件關(guān)聯(lián)和啟用上下文切換中的至少一個??梢詮氖录?qū)動的模型規(guī)范和/或消息驅(qū)動的模型規(guī)范生成所述指令??梢栽谒鲇嬎銠C(jī)上使用所述虛擬機(jī)執(zhí)行來自多個程序的指令,所述多個程序可從至少兩個不同的執(zhí)行模型生成。執(zhí)行所述事件指令可以進(jìn)一步包括執(zhí)行所述事件指令以接收特定入站事件;查找與所述事件指令關(guān)聯(lián)的扇出指令;執(zhí)行所找到的扇出指令以便使用與所找到的扇出指令關(guān)聯(lián)的關(guān)聯(lián)謂詞信息判定任何當(dāng)前執(zhí)行上下文對象是否能夠進(jìn)一步處理所述特定入站事件;以及如果有能力的執(zhí)行上下文對象存在,將所述特定入站事件導(dǎo)向每個所確定的有能力的執(zhí)行上下文對象以便在其中進(jìn)行進(jìn)一步處理。用于接收入站事件的所述事件指令還可以過濾所述入站事件。使用所述虛擬機(jī)執(zhí)行所述指令可以進(jìn)一步包括在接收到特定入站事件時,在來自所述程序的多個事件指令中的每個事件指令內(nèi)存在類型規(guī)范的情況下,通過將所述特定入站事件聲明的類型與所述多個事件指令中的每個事件指令內(nèi)的類型規(guī)范相比較來確定要執(zhí)行所述多個事件指令中的哪個事件指令。執(zhí)行所述賦值指令可以進(jìn)一步包括對所述賦值指令的表達(dá)式求值;以及將所述求值的結(jié)果作為值分配給由所述賦值指令標(biāo)識的目標(biāo)。執(zhí)行所述分支指令可以進(jìn)一步包括對所述分支指令的條件表達(dá)式求值;以及其中所述有條件的轉(zhuǎn)移可以進(jìn)一步包括當(dāng)所述求值返回“true”結(jié)果時,接下來執(zhí)行由所述分支指令的屬性標(biāo)識的另一個指令,否則,接下來執(zhí)行所述指令中的下一順序指令。執(zhí)行所述發(fā)送指令可以進(jìn)一步包括將所述出站事件發(fā)送到事件總線。執(zhí)行所述發(fā)送指令可以進(jìn)一步包括對所述發(fā)送指令中指定的表達(dá)式求值并在所述發(fā)送之前在所述出站事件中反映所述求值的結(jié)果。執(zhí)行所述終止指令可以進(jìn)一步包括終止所述當(dāng)前執(zhí)行上下文對象。在第二方面中,本發(fā)明涉及用于事件處理的編程語言。在一個實施例中,此方面包括存儲以編程語言編寫的源代碼的計算機(jī)可讀介質(zhì),其中所述編程語言包括事件指令,其用于接收入站事件;賦值指令,其用于分配值;分支指令,其用于有條件的轉(zhuǎn)移到另一個指令;發(fā)送指令,其用于指定要發(fā)送出站事件;終止指令,其用于指定要終止當(dāng)前執(zhí)行上下文對象;以及扇出指令,其用于指定事件關(guān)聯(lián)和啟用上下文切換中的至少一個,并且其中所述源代碼包括所述編程語言中的多個所述指令。在另一個實施例中,此方面包括一種可存儲在計算機(jī)可讀介質(zhì)中以使計算機(jī)執(zhí)行的指令程序,其中所述指令包括多個以下指令事件指令,其用于接收入站事件;賦值指令,其用于分配值;分支指令,其用于有條件的轉(zhuǎn)移到另一個指令;發(fā)送指令,其用于指定要發(fā)送出站事件;終止指令,其用于指定要終止當(dāng)前執(zhí)行上下文對象;以及扇出指令,其用于指定事件關(guān)聯(lián)和啟用上下文切換中的至少一個。所述編程語言可以用于從事件驅(qū)動的模型規(guī)范和/或消息驅(qū)動的模型規(guī)范生成的程序。本發(fā)明的這些和其他方面的實施例可以被提供為方法、系統(tǒng)和/或計算機(jī)程序產(chǎn)品。應(yīng)指出的是,上述內(nèi)容為概要,并且因此必然包含詳細(xì)信息的簡化、概括和省略;從而,本領(lǐng)域的技術(shù)人員將意識到所述概要僅為示例性的,并非旨在以任何方式進(jìn)行限制。如所附權(quán)利要求限定的本發(fā)明的其他方面、發(fā)明特性和優(yōu)點(diǎn)將在下面給出的非限制詳細(xì)描述中變得顯而易見?,F(xiàn)在將僅通過實例的方式參考附圖描述本發(fā)明的優(yōu)選實施例,這些附圖是圖1示出了根據(jù)本發(fā)明的一個方面的通過單個虛擬機(jī)支持先前通過定制引擎支持的應(yīng)用的多個高級編程模型的使用;圖2示出了根據(jù)本發(fā)明的一個方面的入站事件的處理;圖3-6提供了示出根據(jù)本發(fā)明的一個方面的可用于在虛擬機(jī)內(nèi)處理“Ice”程序的邏輯的流程圖;圖7示出了可由本發(fā)明以及第一和第二相關(guān)申請中披露的發(fā)明的各方面執(zhí)行的處理的高級視圖;圖8-13分別提供了狀態(tài)機(jī)模型、事件類型規(guī)范、事件、上下文對象類型規(guī)范、上下文對象以及用于狀態(tài)機(jī)執(zhí)行的Ice程序的實例;圖14-17分別提供了監(jiān)視模型、編譯器生成的輸出文件、編譯器生成的交叉引用文件以及示例上下文對象類型規(guī)范的實例;圖18(包括圖18A和18B)示出了由第一相關(guān)申請中披露的發(fā)明的一個方面使用的編譯器算法;圖19提供了用于Ice語言的示例模式;圖20示出了適于存儲和/或執(zhí)行程序代碼的數(shù)據(jù)處理系統(tǒng);以及圖21示出了其中可使用本發(fā)明的一個或多個實施例的代表性網(wǎng)絡(luò)環(huán)境。具體實施例方式在本發(fā)明的一個方面中,定義了一種編程語言。此編程語言可以被稱為“機(jī)器級”編程語言。在本發(fā)明的另一個方面中,披露了一種處理引擎,在此等價地稱為虛擬機(jī)。可以在業(yè)務(wù)監(jiān)視和業(yè)務(wù)集成中使用兩種不同的通信類型,即遠(yuǎn)程方法調(diào)用(使用遠(yuǎn)程過程調(diào)用或“RPC”通信)和基于事件的通信。本發(fā)明的各方面涉及基于事件的通信?;谑录耐ㄐ趴梢詡溥x地被稱為事件產(chǎn)生者與事件使用者之間的基于“單向”消息的通信??梢允褂弥苯訉ぶ奉愋突蚴褂冒l(fā)布-訂閱方法交換此類單向消息。業(yè)務(wù)監(jiān)視情況中的通信通常是基于事件的,而業(yè)務(wù)基礎(chǔ)情況中的通信可以使用這兩種類型之一??梢詡溥x地根據(jù)其路由算法描述這些通信類型,注意基于消息的編程和基于事件的編程中使用的路由算法是不同的。用于基于消息的編程的路由算法通常使用有向或“推”模型,而用于基于事件的編程的路由算法通常使用訂閱或“拉”模型。但是,觀察到使用同一組基本步驟或功能來處理到達(dá)端點(diǎn)的事件或消息。相應(yīng)地,本發(fā)明的各實施例并不限于與事件驅(qū)動的可執(zhí)行體一起使用,諸如過程和調(diào)解之類的消息驅(qū)動的可執(zhí)行體也在本發(fā)明所界定的可執(zhí)行體范圍內(nèi)。用于處理事件或消息的基本步驟通常包括接收事件/消息;過濾所收到的事件/消息;將所述事件/消息與一個或多個執(zhí)行上下文對象關(guān)聯(lián)(并且取決于高級編程模型,這些對象可以表示狀態(tài)機(jī)執(zhí)行上下文、CEP存在時間、監(jiān)視上下文、過程執(zhí)行上下文、調(diào)解上下文等);根據(jù)事件/消息內(nèi)容更新目標(biāo)執(zhí)行上下文(多個)的內(nèi)部狀態(tài);評估條件并執(zhí)行有條件的分支;如有必要發(fā)送出站一個或多個事件/消息(例如,狀態(tài)機(jī)模型情況下的狀態(tài)轉(zhuǎn)變事件、CEP規(guī)則情況下的聚合消息、監(jiān)視上下文情況下的警報、過程模型情況下的下一活動的啟動消息,以及調(diào)解情況下的調(diào)解消息);以及創(chuàng)建或終止執(zhí)行上下文對象。雖然可以使用高級編程模型(S卩,狀態(tài)機(jī)、CEP、監(jiān)視、過程、調(diào)解等)以用戶友好的方式定義此類可執(zhí)行體,但是本發(fā)明的一個方面定義了一種包括相對簡單的指令集的編程語言,可以將這些模型作為可執(zhí)行體編譯成此編程語言。然后,可以在此處披露的虛擬機(jī)上執(zhí)行此編譯的可執(zhí)行體。值得注意的是,可以在此同一虛擬機(jī)上執(zhí)行來自不同高級編程模型的已編譯可執(zhí)行體(如將在下面參考圖1描述的那樣)。相比之下,現(xiàn)有技術(shù)業(yè)務(wù)集成平臺通常針對每個高級編程模型使用不同的執(zhí)行環(huán)境,從而針對平臺所支持的每種可執(zhí)行體提供“定制引擎”。例如,如果特定平臺支持狀態(tài)機(jī)、用于復(fù)雜事件處理和事件關(guān)聯(lián)的規(guī)則、監(jiān)視上下文、過程以及調(diào)解,則管理和維護(hù)此平臺及其各種引擎或執(zhí)行環(huán)境可能變得非常困難。在此披露的虛擬機(jī)能夠?qū)⒅С值膱?zhí)行環(huán)境的數(shù)量減少到1??梢岳缤ㄟ^專注于單個虛擬機(jī)實施的開發(fā)、性能優(yōu)化、管理和操作接口、文檔等實現(xiàn)成本節(jié)省。在此披露的編程語言能夠使用此單個虛擬機(jī)支持先前通過定制引擎支持的應(yīng)用。使用不同的編譯器支持不同的高級編程模型。參閱圖1,它示出了此方法。如圖中所示,可與監(jiān)視模型110的聲明式程序一起使用的第一編譯器120提供可使用虛擬機(jī)150執(zhí)行的代碼,并且可與狀態(tài)機(jī)模型130—起使用的第二編譯器140提供可使用此同一虛擬機(jī)150執(zhí)行的代碼。此方法提供的抽象還可便于將執(zhí)行環(huán)境移植到不同的硬件平臺和操作系統(tǒng)。本發(fā)明和相關(guān)發(fā)明的實施例優(yōu)選地用于其中使用發(fā)布_訂閱通信分發(fā)事件的應(yīng)用環(huán)境中,其中事件訂閱方從一個或多個事件源(發(fā)布方)接收事件并處理這些事件。但是,本發(fā)明和相關(guān)發(fā)明的實施例可以備選地用于基于消息范例的應(yīng)用環(huán)境中,其中只要消息滿足在目標(biāo)處部署的Ice程序的訂閱準(zhǔn)則,消息產(chǎn)生者便會將這些消息發(fā)送到特定目標(biāo)(即,消息接收方);將在下面更詳細(xì)地討論這些準(zhǔn)則。發(fā)送和接收事件可以遵循“事件總線”范例,由此將入站事件視為從連接事件源與事件接收方的總線(其例如可以實現(xiàn)為隊列或其他數(shù)據(jù)存儲和傳輸技術(shù))接收,并且由此將出站事件視為傳送到此總線以便傳輸給感興趣的收聽方。在此定義的編程語言使用相對較少數(shù)量的指令,這些指令設(shè)計為支持上述基本步驟或功能。借用處理器體系結(jié)構(gòu)領(lǐng)域中的術(shù)語,這可以被稱為用于事件處理應(yīng)用(或備選地消息處理應(yīng)用)的“精簡指令集”或“RISC”方法。要指出的是,此編程語言可以由編譯器生成,并且通常不供編程人員使用。(第一相關(guān)申請中披露了一個此類編譯器,此編譯器與監(jiān)視上下文模型有關(guān))。在一種方法中,此編程語言中使用的指令包括六個指令?,F(xiàn)在將描述其中每個指令?!皁nEvent”指令或語句通常對應(yīng)于接收單個入站事件,并指定入站事件“訂閱”(即,針對訂閱入站事件指定的信息)。優(yōu)選地使用可擴(kuò)展標(biāo)記語言或“XML”,表示法指定入站事件和出站事件,其中包括此類事件的內(nèi)容或“有效負(fù)載”。相應(yīng)地,onEvent指令可以引用入站事件內(nèi)XML文檔(或文檔片段)中的元素和屬性。在一個優(yōu)選實施例中,onEvent指令包括“filter(過濾)”屬性,其布爾條件表示訂閱準(zhǔn)則其內(nèi)容滿足過濾條件的任何事件均被視為滿足此onEvent語句的訂閱。當(dāng)此類事件到達(dá)虛擬機(jī)時,將由onEvent的從屬語句(多個)進(jìn)行處理,其中這些從屬語句也取自在此披露的指令集?,F(xiàn)在將描述這些從屬語句。提供了“fanOut(扇出)”指令或語句,此指令實現(xiàn)事件關(guān)聯(lián)和上下文切換。跟在onEvent語句之后的第一fanOut指令在入站事件的上下文中執(zhí)行,并將事件與零個或多個變成初始執(zhí)行上下文的上下文對象關(guān)聯(lián)以處理事件。后續(xù)fanOut語句在當(dāng)前上下文對象的上下文中執(zhí)行,并將事件與零個或多個新上下文對象關(guān)聯(lián),由此實現(xiàn)從當(dāng)前上下文對象到新上下文對象(多個)的上下文切換;這些新上下文對象將變成fanOut語句范圍內(nèi)的后續(xù)指令的執(zhí)行上下文?!癮ssign(賦值)”指令或語句通常對應(yīng)于為當(dāng)前上下文對象(其可以表示狀態(tài)機(jī)上下文、監(jiān)視上下文、過程執(zhí)行上下文等)的某個空位(slot)或出站事件的某個空位分配值。在一個優(yōu)選實施例中,賦值語句的右側(cè)是表達(dá)式,此表達(dá)式取決于1值或當(dāng)前上下文對象(如果具有建立此類上下文對象的fanOut)和入站事件(被視為執(zhí)行上下文的一部分)中的空位?!癰ranch(分支)”指令或語句通常對應(yīng)于控制有條件的轉(zhuǎn)移到程序中的上一或下一步驟,并且可以指定“distance(距離),,屬性以指示當(dāng)執(zhí)行分支時控制將轉(zhuǎn)移到的指令的相對偏移。distance屬性的正值指示執(zhí)行順序中的向前跳轉(zhuǎn),負(fù)值指示控制轉(zhuǎn)移到前一指令。在一個優(yōu)選實施例中,分支條件是布爾表達(dá)式,針對其1值應(yīng)用相同的規(guī)則,如上針對賦值語句的右側(cè)所討論的那樣。如果分支條件的值為true,則采用分支;否則,執(zhí)行繼續(xù)到跟在分支指令之后的語句。“emit(發(fā)送)”指令或語句通常對應(yīng)于指定要發(fā)送出站事件。通常在填充所述出站事件的一個或多個空位(例如,通過執(zhí)行賦值指令)之后使用此指令?!皌erminate(終止)”指令或語句通常對應(yīng)于指定應(yīng)終止當(dāng)前上下文對象(其可以表示狀態(tài)機(jī)上下文、監(jiān)視上下文、過程執(zhí)行上下文等)。可選地,還可以支持“macro(宏)”指令或語句。此指令可以用于封裝可重用的指令塊。術(shù)語“Ice”在此用于指此編程語言?!癐ce”源自術(shù)語“中間代碼”,并指示以此語言編寫的程序優(yōu)選地是執(zhí)行的中間步驟,表示派生自采用另一種表示法編寫的源代碼并且然后在此處描述的虛擬機(jī)環(huán)境中執(zhí)行的編譯后輸出。在第一相關(guān)申請中披露了一種用于從監(jiān)視模型派生Ice程序的可能算法。(值得注意的是,在此披露的編程語言優(yōu)選地由編譯器生成,并且通常不由用戶編寫。)通過將所述編程語言中的指令減少到在此描述的這些指令,可以促進(jìn)移植性,并且可以在單個運(yùn)行時環(huán)境的實施和優(yōu)化方面實現(xiàn)經(jīng)濟(jì)性。如第一和第二相關(guān)申請中所述,顯示中間代碼的執(zhí)行步驟以及原始源可以為用戶提供在調(diào)試期間查看的有用信息粒度。例如,當(dāng)調(diào)試事件驅(qū)動型程序時,允許用戶對算術(shù)表達(dá)式求值時涉及的每個操作或在數(shù)據(jù)庫中保持值時涉及的每個操作進(jìn)行單步調(diào)試并不被認(rèn)為是有用的。實際上,假設(shè)可以在不出現(xiàn)錯誤的情況下執(zhí)行此類型的基本操作。相應(yīng)地,在第一相關(guān)申請中披露的編譯器(其采用在此定義的編程語言生成代碼)的優(yōu)選實施例不會針對此類原始操作生成代碼(并且在第二相關(guān)申請中披露的調(diào)試器不提供對這些原始操作進(jìn)行單步調(diào)試),而是將此類操作封裝在已編譯代碼根據(jù)需要調(diào)用的低級例程中,從而為嘗試調(diào)試高級程序的用戶提供“原子”操作的外表。這預(yù)期不僅使調(diào)試更少地困擾用戶,而且預(yù)期還降低已編譯代碼的復(fù)雜性(這又預(yù)期通常改進(jìn)已生成代碼的編譯過程和運(yùn)行時效率)。此方法與業(yè)務(wù)監(jiān)視和業(yè)務(wù)集成中使用的高級編程模型的公知代碼生成器形成對照,后者可以采用Java編程語言生成代碼。(Java是SunMicrosystemsInc.的商標(biāo)。)此類代碼生成器通常生成包含許多步驟(例如,方法調(diào)用、內(nèi)部變量的初始化和管理、異常處理等)的代碼,這些步驟可使代碼生成器的邏輯復(fù)雜化。此外,由這些公知代碼生成器生成的代碼可能會給嘗試調(diào)試原始源程序的用戶增加太多不感興趣的細(xì)節(jié)分析上述高級編程模型的所需運(yùn)行時環(huán)境時,可以看到應(yīng)解決三個方面類型系統(tǒng)、表達(dá)式語言和執(zhí)行邏輯(即,指令排序)。對于事件處理,本發(fā)明的優(yōu)選實施例針對類型系統(tǒng)使用XML模式,針對表達(dá)式語言使用公知的XPath表示法,并使用在此披露的Ice語言指定執(zhí)行順序以便在接收上下文對象的領(lǐng)域中處理事件。但是,所述類型系統(tǒng)和表達(dá)式語言是可插入的,并且因此同一Ice語言編程模型可以用于不同的類型系統(tǒng)和不同的表達(dá)式語言。(在此披露的虛擬機(jī)可以將表達(dá)式求值例如委托給插入組件,然后可以通過重新配置虛擬機(jī)以使用不同的表達(dá)式求值組件來替代不同的表達(dá)式語言。)現(xiàn)在將描述由本發(fā)明的實施方式的一個優(yōu)選實施例提供的運(yùn)行時行為?,F(xiàn)在將描述優(yōu)選實施例中使用的執(zhí)行上下文方法??梢栽谔囟ㄉ舷挛闹刑幚砣胝臼录鎏囟ㄉ舷挛目梢允褂弥T如XML模式之類的類型定義語言建模。相應(yīng)地,可以在包含零個或多個上下文對象的上下文中處理入站事件,所述上下文可以是持久的(即,可跨若干入站事件重用)或暫時的(即,在處理事件之后終止)。上下文對象具有與之關(guān)聯(lián)的類型,并且在一種方法中,在虛擬容器(在此等價地簡稱為容器)中管理上下文對象。如果上下文對象的類型聲明“key(鍵)”屬性,則上下文對象可以在容器中被多次實例化,其中每個實例具有不同(即,唯一)的鍵值。如果上下文對象的類型沒有聲明key屬性,則上下文對象僅可被實例化一次,從而在容器中提供單個“靜態(tài)”實例。優(yōu)選地,容器管理它所包含的上下文對象的生命周期和持久性,并根據(jù)它所加載的事件處理程序集處理針對這些對象的入站事件?,F(xiàn)在將參考圖2討論此類程序的語義描述。通過將事件導(dǎo)向訂閱方來管理事件訂閱。在本發(fā)明的各優(yōu)選實施例中,容器承擔(dān)事件訂閱方的角色。當(dāng)事件到達(dá)容器時,將根據(jù)可能已由此容器加載的程序中的任何onEvent指令的過濾器來測試事件。在入站事件的上下文中執(zhí)行其過濾被求值為true的每個onEvent語句,其中包括處理此onEvent語句的所有嵌套指令(例如,fanOut、assign、branch>emit禾口/或terminate指令)。作為onEvent語句的一個嵌套指令提供fanOut指令。根據(jù)各優(yōu)選實施例,fanOut語句指定目標(biāo)對象類型和關(guān)聯(lián)謂詞,所述關(guān)聯(lián)謂詞用于標(biāo)識在其上下文中執(zhí)行跟在fanOut之后的指令的目標(biāo)對象實例(多個)。圖2示出了onEvent和fanOut的語義。事件201被導(dǎo)向虛擬容器202,虛擬容器202已加載一個或多個Ice程序203和關(guān)聯(lián)的類型定義204。在圖2中所示的時刻,"context1"205a的兩個實例和“context2”205b的四個實例已在容器中被實例化。所有已加載的Ice程序203中的onEvent語句表示容器的事件訂閱。根據(jù)每個訂閱測試定向到容器202的任意事件201,并且如果事件滿足過濾條件,則稱事件“通過過濾”206。已通過onEvent語句的過濾的事件由此onEvent語句的從屬語句處理。fanOut語句將事件與容器中特定上下文對象類型的零個或多個實例關(guān)聯(lián)。參閱207。然后在此對象的上下文中處理fanOut語句的從屬語句。其他指令(包括assign、branch、emit和terminate)的語義對應(yīng)于其他編程語言中的此類指令的公知用法?,F(xiàn)在參考圖3-6,現(xiàn)在將描述根據(jù)本發(fā)明的一個優(yōu)選實施例的在虛擬機(jī)內(nèi)處理Ice程序。圖3提供了示出可用于處理到達(dá)虛擬容器的入站事件的邏輯的流程圖。在各優(yōu)選實施例中,容器具有事件可以定向到的地址,例如統(tǒng)一資源定位器(“URL”)。針對此入站事件啟動工作單位或事務(wù)(方塊300)。方塊320測試是否仍根據(jù)此入站事件處理任何onEvent語句。優(yōu)選實施例按文檔順序?qū)Σ渴鹪诖巳萜魈幍腎ce程序的每個onEvent語句求值。如果方塊320中的測試具有否定結(jié)果,則在方塊310,提交所述工作單位(這可以包括發(fā)送出站事件,如在下面參考圖6B所討論的那樣)。然后此事件的處理結(jié)束。但是,當(dāng)剩余至少一個未處理的onEvent語句時,方塊320處的測試具有肯定結(jié)果,并且因此處理在方塊330繼續(xù)。方塊330獲取下一onEvent語句。方塊340測試此onEvent語句的rootElement屬性(如果在其中存在)是否與入站事件的文檔根的完全限定名稱匹配。如果不匹配,則處理返回方塊320以檢查此Ice程序中或此容器中加載的其他Ice程序中的其他onEvent語句。否則,當(dāng)根元素存在匹配時,處理在方塊350繼續(xù)。方塊350根據(jù)入站事件對此onEvent語句的filter屬性(如果存在)求值。如果過濾的求值結(jié)果為true(或如果不存在filter屬性),則處理在方塊360繼續(xù);否則,控制返回到方塊320。在方塊360,獲取此onEvent語句的嵌套語句,并且在方塊370處理這些語句,這在圖4中更詳細(xì)地示出。然后控制返回到方塊320。圖4提供了示出可用于處理onEvent語句的嵌套語句的邏輯的流程圖。圖4中的方塊400測試是否存在下一嵌套語句。如果不存在,則處理從圖4中退出。否則,處理在方塊410繼續(xù),方塊410取回此下一語句。然后方塊420測試已取回的語句是否為fanOut語句。如果是,則在方塊425處理fanOut語句,此后控制返回到方塊400以檢查另一個下一語句。在圖5中更詳細(xì)地描述方塊425。當(dāng)方塊420處的測試具有否定結(jié)果時,處理在方塊430繼續(xù)。方塊430測試已取回的語句是否為assign語句。如果是,則在方塊435處處理assign語句,此后控制返回到方塊400。在圖6A中更詳細(xì)地描述方塊435。當(dāng)方塊430處的測試具有否定結(jié)果時,處理在方塊440繼續(xù)。方塊440測試已取回的語句是否為emit語句。如果是,則在方塊445處理emit語句,此后控制返回到方塊400以檢查另一個下一語句。在圖6B中更詳細(xì)地描述方塊445。當(dāng)方塊440處的測試具有否定結(jié)果時,處理在方塊450繼續(xù)。方塊450測試已取回的語句是否為branch語句。如果是,則在方塊455處理branch語句,此后控制返回到方塊400。在圖6C中更詳細(xì)地描述方塊455。當(dāng)方塊450處的測試具有否定結(jié)果時,處理在方塊460繼續(xù)。方塊460測試已取回的語句是否為terminate語句。如果是,則在方塊465處理terminate語句,此后控制返回方塊400。在圖6D中更詳細(xì)地描述方塊465。當(dāng)方塊460處的測試具有否定結(jié)果時,則處理優(yōu)選地返回方塊400。此外或替代地,可生成錯誤條件以指示遇到未知語句?,F(xiàn)在參考圖5,提供了示出可用于處理現(xiàn)在將描述的fanOut語句的邏輯的流程圖。在方塊500,針對其根元素名稱與fanOut語句的“targetRootElement”屬性值匹配的容器中的所有上下文對象,對此fanOut語句的關(guān)聯(lián)謂詞求值。(參閱圖13中的1323以了解示例targetRootElement屬性。)如果當(dāng)前求值的fanOut語句中不存在此屬性,則根據(jù)優(yōu)選實施例,針對所有已加載的上下文對象對關(guān)聯(lián)謂詞求值。方塊510根據(jù)在方塊500處找到多少個匹配來確定要使用的處理選項。各優(yōu)選實施例針對沒有匹配、一個匹配以及多個匹配提供了處理。因此,fanOut語句可以針對這些情況中的每一種情況指定屬性,并且這些屬性中適用的一個屬性的值確定此fansOut語句將如何處理當(dāng)前處理的事件。例如,參考圖13中的編譯器生成的示例可執(zhí)行體1300,1320處的fanOut元素指定如果在其根元素名稱與targetRootElement值匹配的上下文對象之中沒有與關(guān)聯(lián)謂詞的匹配,則創(chuàng)建新的上下文對象(參閱1325,其中在此示例中將屬性值"createNewTarget"指定為“noMatches”屬性的值),如果只有一個匹配,則將事件傳送到單個匹配上下文對象(參閱1326,在此示例中將“deliverToTarget”指定為“oneMatch”屬性值的屬性值),并且如果具有多個匹配,則存在錯誤條件(參閱1327,在此示例中將"signalError"指定為"multipleMatches,,屬性的值)。方塊520-595的邏輯指定由優(yōu)選實施例實現(xiàn)的選項,用于根據(jù)這些“匹配”相關(guān)的屬性中的一個相應(yīng)屬性中指定的屬性值處理fanOut語句。根據(jù)各優(yōu)選實施例,這些處理選項的前四個(即,由方塊520-555表示)可以用作關(guān)聯(lián)謂詞的三個匹配相關(guān)的屬性中任何一個的屬性值;“createNewTarget”選項只能用作“noMatches”屬性的屬性值;“deIiverToTarget,,選項只能用作“oneMatch,,屬性的屬性值;以及這些處理選項的最后兩個(即,由方塊580-595表示)只能用作“multipleMatches”屬性的屬性值。現(xiàn)在將描述根據(jù)優(yōu)選實施例的對應(yīng)于每個屬性值的處理。方塊520測試此fanOut語句是否應(yīng)忽略當(dāng)前處理的事件(即,在方塊510處確定的適用屬性值是否為“ignore”)。如果是,則跳過此fanOut語句的嵌套語句,并且處理繼續(xù)到跟在此fanOut語句之后的下一語句,如在方塊525處所述,并且因此圖5中的處理退出ο否則,處理在方塊530繼續(xù),方塊530測試是否應(yīng)發(fā)信號通知錯誤(即,在方塊510處確定的適用屬性值是否為“signalError”)。如果是,則方塊535包括發(fā)送錯誤報告事件。此錯誤報告事件優(yōu)選地包裹當(dāng)前處理的入站事件,并被登臺以便在提交當(dāng)前事務(wù)時發(fā)送。將跳過此fanOut語句嵌套的語句。然后處理繼續(xù)到跟在此fanOut語句之后的下一語句,并且因此圖5中的處理退出。當(dāng)適用的屬性值不是“ignore”或“signalError”時,處理到達(dá)方塊540。然后方塊540測試適用的屬性值是否為“rollBack”。如果是,則方塊545包括回滾針對當(dāng)前處理的事件啟動的事務(wù),以便撤消此事件對執(zhí)行上下文的任何影響,并且將不發(fā)送任何待發(fā)送的出站事件。如果本發(fā)明的實施方式需要,則可以記錄錯誤。然后圖5中的處理退出,分支到圖3以從隊列中取回下一事件(如果有)。方塊550測試適用的屬性值是否為“rollBackAndRetry”。如果是,則方塊555包括回滾針對當(dāng)前處理的事件啟動的事務(wù),如上參考方塊545所述。但是,并不記錄錯誤,而是將當(dāng)前處理的事件放置在重試隊列中,當(dāng)前處理的事件將從其中出列并再次被求值。(此重試的計時以及可以嘗試的重試次數(shù)與實施方式相關(guān)。)然后圖5中的處理退出,分支到圖3以從隊列中取回下一事件(如果有)。方塊560測試方塊510所確定的適用屬性值是否為“creatNewTarget”。如果是,則方塊565包括實例化新的上下文對象(并且優(yōu)選地,為其分配默認(rèn)值)并使此對象成為當(dāng)前執(zhí)行上下文;然后在此新目標(biāo)上下文對象的上下文中執(zhí)行此fanOut內(nèi)嵌套的語句。要指出的是,如果此fanOut語句內(nèi)嵌套的任何語句指定“currentKey()”函數(shù),則優(yōu)選實施例將調(diào)用此函數(shù)以返回新的唯一鍵并將此鍵值分配給新上下文對象的鍵空位。然后圖5中的處理退出。方塊570測試適用的屬性值是否為“deliverToTarget”。如果是,則方塊575包括將當(dāng)前處理的事件傳送到(單個)匹配執(zhí)行上下文,以便在其中通過執(zhí)行此fanOut嵌套的語句來處理事件。然后圖5中的處理退出。方塊580測試適用的屬性值是否為“deliverToAny”。如果是,則方塊585包括將當(dāng)前處理的事件傳送到任何(單個)匹配執(zhí)行上下文,以便在其中通過執(zhí)行此fanOut嵌套的語句來處理事件。用于從一組匹配執(zhí)行上下文選擇此執(zhí)行上下文的方式與實施方式相關(guān)。然后圖5中的處理退出。最后,方塊590測試適用的屬性值是否為“deliverToAll”。如果是,則方塊595包括將當(dāng)前處理的事件傳送到所有匹配執(zhí)行上下文,以便在其中通過執(zhí)行此fanOut嵌套的語句來處理事件。然后圖5中的處理退出。圖6A-6D提供了示出當(dāng)分別實施assign、emit、branch和terminate語句時可以使用的邏輯的流程圖,如現(xiàn)在描述的那樣。接下來參考圖6A,現(xiàn)在將更詳細(xì)地描述assign語句的處理。在方塊600,通過對其“value”表達(dá)式求值并將此求值的結(jié)果分配給“target”表達(dá)式引用的空位來處理assign語句。例如,參閱圖13中1394處的assign語句的value表達(dá)式1396和target表達(dá)式1395。根據(jù)各優(yōu)選實施例,對target表達(dá)式求值以標(biāo)識定義完善的當(dāng)前上下文對象空位或要發(fā)送的出站事件的有效負(fù)載空位,并且分配將使用在assign語句的value屬性中指定的表達(dá)式覆蓋此空位的任何先前存在的值。(為了向序列中添加項目,可以將value表達(dá)式指定為現(xiàn)有空位值和要添加的值的并集。)然后圖6A中的處理退出?,F(xiàn)在將參考圖6B更詳細(xì)地描述emit語句的處理。在方塊610,通過對其通常導(dǎo)致創(chuàng)建文檔片段(根據(jù)優(yōu)選實施例,為XML文檔片段)的“event”表達(dá)式求值并將此文檔片段發(fā)送到事件總線(當(dāng)提交當(dāng)前工作單位時,將隨后從該總線發(fā)送此文檔片段)來處理emit語句。圖13中未示出emit語句。將文檔片段發(fā)送到事件總線之后,圖6B中的處理退出。現(xiàn)在將參考圖6C更詳細(xì)地描述branch語句的處理。在方塊620,通過對其“condition”表達(dá)式求值來處理branch語句。優(yōu)選地,使用XPath表示法指定此condition表達(dá)式。例如,參閱圖13的1331處的condition屬性。如果條件的求值結(jié)果為false,則執(zhí)行繼續(xù)到跟在branch語句之后的下一語句;否則(包括不存在條件的情況,優(yōu)選實施例將其視為無條件的分支),執(zhí)行在由branch語句標(biāo)識的語句處繼續(xù)。在一種方法中,使用"distance"屬性標(biāo)識此語句。在另一種方法中,使用“macro”屬性標(biāo)識此語句。在第三種方法中,既不指定“distance”屬性也不指定“macro”屬性?,F(xiàn)在將更詳細(xì)地描述這些方法中的每一種方法。當(dāng)存在distance屬性時,如圖13的1332處所示,執(zhí)行按照指示的語句號進(jìn)行分支。distance屬性的值可以是正的或負(fù)的。為1的distance值只是在下一順序語句處繼續(xù)執(zhí)行。在各優(yōu)選實施例中,如果distance屬性的值指示在最近的封閉onEvent或fanOut塊外部的語句,則如同未指定distance或macro屬性那樣執(zhí)行branch語句(如下所述)。當(dāng)存在macro屬性時,如同將由macro屬性(優(yōu)選地引用〈macro〉元素標(biāo)識符)的值標(biāo)識的語句插入行中取代branch語句那樣繼續(xù)執(zhí)行。當(dāng)既未指定distance屬性也未指定macro屬性時,如果采用分支,則branch語句離開當(dāng)前onEvent或fanOut塊。如果當(dāng)前塊為onEvent語句,則通過處理此Ice程序中的下一onEvent塊繼續(xù)執(zhí)行。如果當(dāng)前塊為fanOut語句,則通過以下方式繼續(xù)執(zhí)行在下一目標(biāo)上下文對象的上下文中重新執(zhí)行fanOut塊內(nèi)的語句,或者當(dāng)沒有其他匹配目標(biāo)上下文對象時,處理Ice程序中的下一語句。根據(jù)各優(yōu)選實施例,同時指定distance屬性和macro屬性是錯誤條件。按如上所述處理branch語句之后,圖6C中的處理然后退出。現(xiàn)在將參考圖6D更詳細(xì)地描述terminate語句的處理。在方塊630,terminate語句的處理包括終止當(dāng)前上下文對象,由此從此容器中刪除當(dāng)前上下文對象。處理然后從圖6D中退出。本發(fā)明的各實施例可以與第一相關(guān)申請和第二相關(guān)申請(以下為“相關(guān)發(fā)明”)中披露的發(fā)明的各實施例結(jié)合使用。相應(yīng)地,現(xiàn)在將討論相關(guān)發(fā)明以提供有關(guān)此結(jié)合使用的fn息ο現(xiàn)在參考圖7,示出了可由本發(fā)明和相關(guān)發(fā)明的各方面執(zhí)行的處理的高級視圖。如圖中所示,將監(jiān)視模型700(作為在此描述的高級編程模型的一個示例)作為輸入提供給編譯器720。優(yōu)選地,此編譯器720根據(jù)相關(guān)發(fā)明的一個方面生成代碼,其中所生成的代碼包括采用根據(jù)本發(fā)明的一個方面在此披露的編程語言的指令。此生成的代碼在圖7中示為“Ice”文件740。出于調(diào)試目的,編譯器720還優(yōu)選地生成將Ice文件740中的語句與監(jiān)視模型700中的源語句關(guān)聯(lián)的交叉引用文件760。根據(jù)相關(guān)發(fā)明的一個方面,除了監(jiān)視模型700之外,Ice文件740和交叉引用文件760還用作到調(diào)試器780的輸入。(當(dāng)指由編譯器720創(chuàng)建的可執(zhí)行文件740時,術(shù)語“編譯后的輸出,,和“所生成的輸出,,在此可互換地使用)。作為一種備選方案,Ice文件740可以在不提供其調(diào)試的情況下,在此處披露的虛擬機(jī)上執(zhí)行;在此備選執(zhí)行情況中,并不嚴(yán)格需要交叉引用文件760。優(yōu)選地使用XML表示法指定監(jiān)視模型700、Ice文件740和交叉引用文件760。雖然未在圖7中示出,但是用于監(jiān)視模型700的XML模式可以作為額外輸入被提供給編譯器720,由此使相關(guān)發(fā)明的一個方面的編譯器720能夠在編譯過程中驗證監(jiān)視模型700(即,輸入)的語法結(jié)構(gòu)。此外,編譯器720還可以針對Ice文件740使用XML模式而針對交叉引用文件760使用另一模式,其中這些模式(也未在圖7中示出)指定Ice文檔740和交叉引用文件760的允許的語法和結(jié)構(gòu),并且因此可以用于提供編譯器輸出的特定級別的結(jié)構(gòu)驗證。第一相關(guān)申請的圖3-5分別提供了監(jiān)視模型、編譯器輸出文件和交叉引用文件的示例,以描述可如何在監(jiān)視模型編程環(huán)境中使用Ice程序(并且在這些示例中,監(jiān)視模型對應(yīng)于簡單的成本聚合器情況)。第一相關(guān)申請的圖4中示出的編譯器輸出文件(由編譯第一相關(guān)申請的圖3中示出的監(jiān)視模型產(chǎn)生)使用在此定義的編程語言并且可以在此處披露的虛擬機(jī)上執(zhí)行。在此重復(fù)對第一相關(guān)申請中的這些圖的討論,其中這些圖顯示為圖14-16。但是,如上所述,在此披露的虛擬機(jī)可用于從多種類型的高級語言編程模型編譯的可執(zhí)行體。相應(yīng)地,除了支持第一相關(guān)申請的圖4(在此重復(fù)為圖15)中示出的可執(zhí)行體之外,此虛擬機(jī)還可以支持從其他或不同的編程模型編譯的可執(zhí)行體。現(xiàn)在將參考本申請的圖8-13描述用于一個此類備選編程模型的示例可執(zhí)行體。圖8-13分別提供了狀態(tài)機(jī)模型、事件類型規(guī)范、事件、上下文對象類型規(guī)范、上下文對象以及用于狀態(tài)機(jī)執(zhí)行的Ice程序的示例。圖13中的Ice程序1300可以由來自圖8中的模型的編譯器生成。更具體地說,狀態(tài)機(jī)模型和事件類型規(guī)范包括編譯器輸入,而上下文對象規(guī)范和Ice程序包括編譯器輸出。(備選地,可以手動定義狀態(tài)機(jī)的Ice實施方式,雖然使用編譯器生成Ice可執(zhí)行體被認(rèn)為是更典型的情況。首先參考圖8,示例模型800定義了用于門的有限狀態(tài)機(jī)。此門具有兩種狀態(tài),已打開(參閱810)和已關(guān)閉(參閱830)。0pen_d00r事件(參閱820)導(dǎo)致從已關(guān)閉狀態(tài)轉(zhuǎn)變?yōu)橐汛蜷_狀態(tài)。cl0Se_d00r事件(參閱821)導(dǎo)致從已打開狀態(tài)轉(zhuǎn)變?yōu)橐殃P(guān)閉狀態(tài)。圖9的模式900中示出的事件類型規(guī)范描述了open_door和close_door事件的類型(即,結(jié)構(gòu))。在此示例中,這兩個事件具有相同的類型,即“tns:D00rEvent”;參閱920。(擴(kuò)展“tns”的名稱空間定義時,類型為{http://www.example,org/surveillance}DoorEvent;參閱910,其中定義了“tns”名稱空間。)DoorEvent類型定義(參閱930)針對此類型附帶的事件的有效負(fù)載定義了兩個屬性,即“id”屬性931和“timestamp”屬性932。id屬性的值標(biāo)識被打開或關(guān)閉的門,timestamp屬性的值指示何時發(fā)生此事件。圖10中示出的示例open_door事件1000指示標(biāo)識符為“DoorOOl”(參閱1010)的門在2008-01-01T09:33:41+05:00(參閱1020)時被打開。圖11示出了用于Ice執(zhí)行環(huán)境中表示圖8的狀態(tài)機(jī)800的上下文對象的示例類型定義1100。雖然此特定示例被手動創(chuàng)建,但是備選地可以由圖8的狀態(tài)機(jī)定義800以及圖9的900處示出的事件類型定義中的編譯器生成。在此示例中,用于上下文對象類型的示例模式1100包括用于使用<xs:include〉語句1110的門事件類型的模式900。參閱“schemaLocation”屬性,它將位置“doorEvent.xsd”處的doorEvent模式定義指定為其值。然后模式1100定義上下文對象的根元素(參閱1120,其中根元素被指定為具有名稱“stateMachine”),其類型被給定為復(fù)雜類型定義。參閱其中引用此復(fù)雜類型定義的1122以及其中定義此復(fù)雜類型定義的1130。在此示例中,類型定義1130指定此類型的每個上下文對象具有以下結(jié)構(gòu)“」Ce_key”元素1131,它將保存對象的所生成的唯一標(biāo)識符;“id”元素1132,它將保存其狀態(tài)被此上下文對象鏡像的門的標(biāo)識符;“state”元素1133,它保存狀態(tài)機(jī)的當(dāng)前狀態(tài);“l(fā)astEvent”元素1134,它保存由此上下文對象處理的上一個事件的時間戳;以及“tns:0pen_d00r”空位1135和“close—door”空位1136,它們將保存狀態(tài)機(jī)已處理的對應(yīng)類型的上一個事件的副本。還指定了狀態(tài)機(jī)模型的可能狀態(tài)(在此示例中,即狀態(tài)“已打開”1141和“已關(guān)閉”1142)的枚舉類型1140?,F(xiàn)在參考圖12,其中示出的示例上下文對象1200是圖11中定義的stateMachine元素的實例。在此示例中,在1210處示出此對象的已生成鍵(用作唯一標(biāo)識符)。此示例上下文對象1200處理來自標(biāo)識符為“DoorOOl”(參閱1220)并且當(dāng)前狀態(tài)為已打開(參閱1230)的門的事件,并且在1240處示出的時間戳表示的時間處理此上下文對象的上一個事件。分別在空位1250和1260中示出所處理的上一個open_door和close_door事件的副本。圖13示出了實現(xiàn)圖8的狀態(tài)機(jī)800的Ice程序1300,該程序處理具有圖9的900處定義的類型的事件并且操作具有圖11中定義的類型的上下文對象。現(xiàn)在描述根據(jù)該示例Ice程序1300的處理。當(dāng)具有根兀素“{http://www.example,org/surveillance}open_door"(或等價地為“訪8:叩611_(1001·”)的事件到達(dá),并且具有非空“id”屬性(即,過濾器屬性1314的值"fn:exists(.Γ'id)”為true)時,則滿足<iceonEvent>語句1310的過濾準(zhǔn)則。參閱圖13的1312,其中指定所需的rootElement值1313和過濾器1314。因此,將執(zhí)行onEvent元素1310中的所有從屬語句。(要指出的是,上下文項目表達(dá)式‘.’用于指代當(dāng)前事件的根。相應(yīng)地,語法“fn:eXistS(.Γid)”測試“id”屬性是否在當(dāng)前事件的根級別處存在。相比之下,根據(jù)優(yōu)選實施例,未以‘.,開始的相對路徑表達(dá)式從上下文對象根開始導(dǎo)航。)第一嵌套語句為<ice:fan0ut>1320。此fanOut語句1320標(biāo)識虛擬機(jī)容器中目標(biāo)上下文對象的根元素(即,{http//www.example,org/surveillance}stateMachine;參閱1323)并指定關(guān)聯(lián)謂詞1324。關(guān)聯(lián)謂詞1324將入站事件的門標(biāo)識符(如correlationPredicate屬性左側(cè)處的語法“./"id”所示)與上下文對象的id(即,‘‘{http://www.example,org/surveillance}id”或等價地為‘‘tns:id”,如correlationPredicate屬性右側(cè)處所指定的)進(jìn)行比較。no/one/multiplematches屬性1325-1327指示當(dāng)找到與所述關(guān)聯(lián)謂詞匹配的零個/一個/許多上下文對象時要采取的操作,如上面參考圖5所述。當(dāng)沒有與所述關(guān)聯(lián)謂詞匹配的現(xiàn)有上下文對象時,將根據(jù)1325處“noMatches”屬性的“createNewTarget”值創(chuàng)建新的上下文對象并且該上下文對象變?yōu)楹罄m(xù)步驟的執(zhí)行上下文。由于新創(chuàng)建的上下文對象未被初始化(因此不包含鍵),因此不采用在1330處指定的分支。實際上,將執(zhí)行之后的語句1340,該語句為新的上下文對象分配鍵。賦值語句1350然后執(zhí)行并設(shè)置所述上下文對象的“tns:id”或“{http://www.example,org/surveillance}id”值。在該示例中,id值被設(shè)為來自入站事件的id屬性值(如賦值語句1350的值屬性上的表達(dá)式“.Γid”所指示的)。賦值語句1360然后執(zhí)行并將入站operudoor事件復(fù)制至Ij上下文對象中的{http://www.example,org/surveillance}open_door空位。賦值語句1370然后將上下文對象中包含時間戳(參閱圖12的1240)的{http://www.example,org/surveillance}IastEvent值設(shè)為該當(dāng)前處理的open_door事件上的事件時間戳的值。最后,賦值語句1380將上下文對象的當(dāng)前狀態(tài)設(shè)為“Opened”。如果所討論的門的上下文對象確實存在,則1324處的關(guān)聯(lián)謂詞針對此對象的求值結(jié)果為true,該對象將變?yōu)閛nEvent指定1310中的所有后續(xù)語句的執(zhí)行上下文,以便根據(jù)1326處的“oneMatch”屬性的“deliverToTarget”值處理該open_door事件。在此情況中,1330處的分支條件的求值結(jié)果為true,因此采用此分支,從而導(dǎo)致跳過賦值語句1340和1350。語句1360-1380如剛才所述的那樣執(zhí)行。當(dāng)具有根兀素“{http://www.example,org/surveillance}close_door"(或等價地為“tns:cl0se_d00r”)的事件到達(dá),并且具有非空“id”屬性(即,過濾器屬性1393的值"fn:exists(./"id)”為true)時,則滿足(第二)<iceonEvent〉語句1390的過濾準(zhǔn)則。參閱圖13的1391,其中指定所需的rootElement值1392和過濾器1393。該<iceonEvent〉塊的嵌套語句類似于剛才針對塊1310描述的嵌套語句。最后一個賦值語句1394將狀態(tài)機(jī)的狀態(tài)設(shè)為“Closed”。要指出的是,圖8中的狀態(tài)機(jī)800的更復(fù)雜實現(xiàn)將在進(jìn)行轉(zhuǎn)變之前測試初始狀態(tài)(即,例如在當(dāng)前狀態(tài)為“Closed”的情況下僅處理operudoor事件)。為了簡潔,Ice程序1300中省略了這些測試。圖13的實例中未示出可能由編譯器生成的若干語句。如先前針對此處定義的編程語言指令所述的,這些指令包括用于指定要發(fā)送出站事件的<emit>語句,以及用于指定應(yīng)終止當(dāng)前上下文對象的〈terminate〉指令。在不偏離本發(fā)明范圍的情況下,本發(fā)明的實現(xiàn)可以支持附加和/或其他指令。如上所述,除了或代替執(zhí)行根據(jù)圖8的狀態(tài)機(jī)模型800編譯的Ice程序,此處所披露的虛擬機(jī)還可用于執(zhí)行根據(jù)其他高級編程模型編譯的程序。第一相關(guān)申請的圖3-5分別提供了監(jiān)視模型、編譯器輸出文件和交叉引用文件的示例。針對本發(fā)明作為圖14-16而重復(fù)這些圖并且現(xiàn)在介紹這些圖以說明如何使用Ice程序在此處所披露的虛擬機(jī)上執(zhí)行監(jiān)視模型。首先參考圖14,現(xiàn)在描述圖中使用的語法以提供對該示例監(jiān)視模型1400的理解。<inboundEvent>元素定義實例化模型的事件入口點(diǎn),并指定要在此入口點(diǎn)處接收的入站事件的詳細(xì)信息。嵌套的〈filter〉元素可以用于指定入站事件必須滿足的特定準(zhǔn)則,不與此指定匹配的事件將被忽略。嵌套的〈correlationPredicate〉元素可以用于將通過過濾準(zhǔn)則的每個入站事件與其中處理所述事件的適當(dāng)監(jiān)視上下文(多個)進(jìn)行關(guān)聯(lián)??梢灾付ㄅc關(guān)聯(lián)謂詞有關(guān)的屬性,從而指示(例如)在未出現(xiàn)任何匹配時要執(zhí)行何種操作、在僅有一個匹配時要執(zhí)行何種操作,以及當(dāng)存在多個匹配時要執(zhí)行何種操作。<outboundEvent>元素定義發(fā)出特定事件所經(jīng)過的事件出口點(diǎn)。嵌套的〈filter〉元素可以用于過濾出應(yīng)抑制其發(fā)出的事件。可以將一個或多個鍵值與監(jiān)視上下文一起使用,以實現(xiàn)從特定監(jiān)視上下文定義實例化多個上下文實例。所述鍵值使能區(qū)分多個實例?!磎etric〉元素指定監(jiān)視上下文中存在的數(shù)據(jù)值的鍵入空位。它還可以指定用于如何初始化和更新該值的處理指令。(在監(jiān)視模型上下文中,metric(度量)指數(shù)據(jù)值)??梢允褂媒?shù)據(jù)更新模型的映射來指定度量更新指令(在監(jiān)視模型上下文中,“map(映射)”是在一個或多個輸入元素以及一個或多個輸出元素之間定義的關(guān)系)。可以在其他元素定義中引用度量,從而指示在運(yùn)行時對條件求值或更新其他度量中使用該度量的值。〈counter〉元素定義要在監(jiān)視上下文中使用的計數(shù)器。所述計數(shù)器可以被遞增、遞減、設(shè)為零以及在其他元素定義中引用?!磘rigger〉元素用作當(dāng)滿足特定準(zhǔn)則時應(yīng)采取的一個或多個操作的啟動器。在監(jiān)視上下文中滿足這些準(zhǔn)則時,觸發(fā)器被稱為“啟動”。這可能會影響其他觸發(fā)器、映射或模型中的其他實體。一般而言,監(jiān)視上下文中觸發(fā)器的作用與入站事件的觸發(fā)器的作用相同或相似。因此,可以將其視為用于發(fā)信號通知監(jiān)視應(yīng)用所發(fā)現(xiàn)的特定條件的“內(nèi)部事件”?!磗topwatch〉元素定義在監(jiān)視上下文中用于表示已過去的時間的值??梢蚤_始、停止、復(fù)位和在其他元素定義中引用所述st0pWatch(計時器)。<map>元素可以是〈metric〉或<outboundEvent>元素的子元素,并且定義具有一個或多個輸入空位以及一個或多個輸出空位的映射。每個輸入空位對應(yīng)于度量或?qū)?yīng)于其他類型的承載數(shù)據(jù)值的實體。映射的輸出空位還連接到度量或其他類型的可以接收一個或多個數(shù)據(jù)值的實體。映射指定某種使用輸入空位中的值計算輸出值(多個)以及將輸出值(多個)寫入輸入空位(多個)的算法。<map>元素可以包含指定何時執(zhí)行映射的〈trigger〉元素以及指定如何設(shè)置輸出空位的值的〈assignment〉元素。監(jiān)視應(yīng)用可以確保如果映射的輸入空位因任何原因而發(fā)生改變,則重新計算映射并更新輸出空位。(根據(jù)各優(yōu)選實施例,用于生成此類級聯(lián)更新的編譯器算法使用遞歸,下面將參考圖18進(jìn)行更詳細(xì)的介紹)。入站事件導(dǎo)致在監(jiān)視應(yīng)用處執(zhí)行一個或多個操作。模型內(nèi)部的觸發(fā)器也可以自發(fā)地調(diào)用操作。例如,可以將〈stopwatch〉元素與被定期求值的觸發(fā)條件中的時限進(jìn)行比較;當(dāng)超過所述時限時,將激活觸發(fā)器并調(diào)用操作,這與任何外部事件無關(guān)??梢皂憫?yīng)于模型的操作而使用值填充出站事件,并將所述出站事件發(fā)送到事件總線(假設(shè)滿足任何過濾準(zhǔn)則)。實現(xiàn)可以支持額外和/或其他元素和屬性而不偏離相關(guān)發(fā)明的范圍?,F(xiàn)在返回圖14-16的示例成本聚合器,在該示例中,成本聚合器是監(jiān)聽物品成本事件或消息的監(jiān)視器。這些事件帶有訂單編號、物品編號以及該物品的成本數(shù)字。(另參閱圖17,該圖提供了可用于描述成本聚合器實例的數(shù)據(jù)結(jié)構(gòu)的示例模式1700)。由成本聚合器處理的事件可以在填寫訂單時例如報告物品的利用率。當(dāng)具有給定訂單編號的第一物品成本事件到達(dá)時,將創(chuàng)建新的成本聚合器實例并使用該訂單編號對其進(jìn)行初始化。該成本聚合器的運(yùn)輸成本被設(shè)為默認(rèn)值29.75$并且其物品成本(其是單個物品的成本數(shù)字的合計)被初始化為0。然后將入站事件中報告的物品成本與所述物品成本相加,并且作為物品成本與運(yùn)輸成本的和來計算總成本。同一訂單的后續(xù)事件將被傳送到同一聚合器,并且對于這些后續(xù)事件,跳過初始化階段將僅更新物品成本值和總成本值。圖14的示例監(jiān)視模型1400指定一種入站事件作為該成本聚合器感興趣的事件。參閱標(biāo)號1410處的〈inboimdEvent〉指定。如其中所指定的,該事件的標(biāo)識符(“id”)為AcostRport。該事件的關(guān)聯(lián)器語法1412指定如果在對所有現(xiàn)有實例的關(guān)聯(lián)謂詞求值之后,找不到具有指定rootElement和extensionName的入站事件的任何匹配監(jiān)視上下文,貝Ij創(chuàng)建新的上下文,但是如果有一個監(jiān)視上下文與該事件匹配,則將該事件發(fā)送到匹配的監(jiān)視上下文;另一方面,如果有多個監(jiān)視上下文與該事件匹配,則表示存在錯誤并生成異常。1414處的correlationPredicate表達(dá)式指定如何判定監(jiān)視上下文是否與該事件匹配,在該示例中,將入站事件中的“orderNumber”值與當(dāng)前活動的監(jiān)視上下文的“orderNum”度量進(jìn)行比較。該示例成本聚合器的每個實例都具有4個度量,它們在1420、1430、1440和1450處定義。第一度量1420是“OrderNum”。度量定義1420指定“costR印ort”入站事件1410的擴(kuò)展數(shù)據(jù)部分中的“orderNumber”值用于設(shè)置該OrderNum度量。度量定義1430與“shippingCost”度量有關(guān),在該示例中,該度量定義指定在初始化時將默認(rèn)值$29.75賦給shippingCost度量。度量定義1440指定使用指定條件邏輯的映射處理成本聚合器的“totalCost”度量。如其中所述,如果當(dāng)前監(jiān)視上下文中存在“itemCost”值,則將該值與運(yùn)輸成本(S卩,shippingCost度量)相加并用于設(shè)置監(jiān)視上下文中的totalCost空位或度量;否則,單獨(dú)使用運(yùn)輸成本設(shè)置totalCost度量。最后,度量定義1450與“itemCost”度量相關(guān)。該定義1450提供映射和默認(rèn)值指定。所述映射指定將itemCost度量遞增“costR印ort”入站事件的擴(kuò)展數(shù)據(jù)部分中的“cost”值,并且結(jié)果用作監(jiān)視上下文中的itemCost空位的輸出值。默認(rèn)值指定itemCost在初始化時被設(shè)為“0.0”。根據(jù)相關(guān)發(fā)明的一個方面,生成圖15的編譯器輸出文件1500以作為與圖14的聲明式監(jiān)視模型1400對應(yīng)的順序排序可執(zhí)行體。在該示例中,生成單個〈onEvent〉元素1510(其使用名稱空間前綴“ice”,從而在圖15中示為<iceonEvent,并且該元素與圖14的單個入站事件入口點(diǎn)1410對應(yīng)。一般情況下,〈onEvent〉元素指定入站事件訂閱,并且可以包括“filter”屬性和/或〈fanOut〉子元素?!癴ilter”屬性捕獲針對監(jiān)視模型中的該入站事件指定的過濾準(zhǔn)則(如果有)。針對圖14中的示例模型生成的過濾屬性將測試入站事件的根元素為“cbeCommonBaseEvent”,并且具有值為“IteportItemCost,,的"extensionName”屬性。這些條件對應(yīng)于<inboundEvent>元素1410中的rootElement禾口extensionName指定。<fan0ut>元素1511提供事件關(guān)聯(lián)、封裝(在該示例中)在與圖14的1412和1414處的關(guān)聯(lián)器語法對應(yīng)的1512處的語法,以及與處理〈onEvent〉元素1510的入站事件相關(guān)的所有步驟的元素1520-1590。〈fanOut〉元素使能從當(dāng)前上下文對象(或者,在開始處理事件時,沒有任何上下文對象)到一個或多個目標(biāo)上下文對象的上下文切換。1512處的關(guān)聯(lián)器語法指示針對所有活動上下文對象的關(guān)聯(lián)謂詞求值時發(fā)現(xiàn)的各種匹配應(yīng)執(zhí)行何種操作。1514處的語法與圖14的1414處的關(guān)聯(lián)謂詞對應(yīng),并且指示將入站事件中的“orderNumer”值與當(dāng)前上下文對象的“orderNum”空位進(jìn)行比較以判定是否存在匹配(或多個匹配)。在該示例中,編譯器還將1414中引用的事件字段的簡化語法“costR印ort/extendedData/orderNumber”轉(zhuǎn)換成訪問1514中的該字段所需的實際XPath。在1520處生成〈branch〉語句,并且測試對于匹配的上下文對象是否已存在鍵值。如果是,則已創(chuàng)建和初始化上下文對象,并且分支語句指示控制應(yīng)在運(yùn)行時向前跳5步(距離“5”)。生成分支語句以向前跳5步可以避免執(zhí)行在1530-1560處生成的初始化步驟。否貝U,如果尚不存在鍵值,則在運(yùn)行時不采用分支并且執(zhí)行下一順序步驟1530。一般情況下,〈branch〉語句提供將控制有條件的轉(zhuǎn)移到程序中的先前的步驟或以后的步驟(并且可以針對距離屬性使用負(fù)值以將控制轉(zhuǎn)移到先前的步驟)。生成包括1530-1590處的語法的若干〈assign〉語句,所述語句在此可以等價地稱為“賦值”語句。一般情況下,〈assign〉語句指定對當(dāng)前監(jiān)視上下文中空位的賦值或?qū)Τ稣臼录馁x值。賦值語句1530初始化當(dāng)前監(jiān)視上下文實例的鍵值,并且賦值語句1540將該實例中的shippingCost度量初始化為“29.75”。賦值語句1550將該實例中的itemCost度量初始化為“0.0”,以及賦值語句1560執(zhí)行上面參考監(jiān)視模型中的度量定義1440的映射中指定的語法介紹的相同的條件處理。這完成了一系列初始化步驟,在采用分支1520的情況下可以跳過這些步驟。賦值語句1570將orderNum度量設(shè)為入站事件中的orderNumer值,并且與監(jiān)視模型內(nèi)的度量定義1420中的映射對應(yīng)。賦值語句1580如上面針對度量定義1450中的映射所述計算itemCost度量的值,并且賦值語句1590如上面針對度量定義1440中的映射所述設(shè)置totalCost度量。要指出的是,在該示例中,賦值語句1590與賦值語句1560完全相同。出現(xiàn)這種情況是因為totalCost度量的映射取決于兩個輸入,即itemCost和shippingCost。編譯器識別到在初始化期間設(shè)置了這些度量,因此在1560處生成代碼以考慮由這些初始化造成的任何下游效應(yīng)。編譯器還識別到通過在1580處執(zhí)行代碼動態(tài)地更新itemCost度量,因而生成另一賦值語句1590以考慮動態(tài)更新。這示出了相關(guān)發(fā)明的一個方面的編譯器如何在分析數(shù)據(jù)相關(guān)性之后將監(jiān)視模型的聲明式邏輯轉(zhuǎn)換成一系列正確的賦值語句。通過將編譯器輸出文件1500與編譯器輸入文件(即,監(jiān)視模型1400)進(jìn)行比較,可以看出這些相關(guān)文件內(nèi)語句的排序非常不同,并且使用傳統(tǒng)調(diào)試器對編譯器輸出文件1500進(jìn)行單步調(diào)試的用戶可能在嘗試確定某個時刻正在執(zhí)行源代碼的哪個部分時感到困惑。(此外,如果生成運(yùn)行時錯誤,甚至更難在正常執(zhí)行期間確定錯誤源)。因此,相關(guān)發(fā)明的一個方面提供了交叉引用文件作為附加編譯器輸出并使用該文件作為附加調(diào)試器輸入(如圖7所示和上面所述)。該交叉引用文件的示例版本在圖16的1600處示出,并且現(xiàn)在進(jìn)行介紹。文件1600在圖14的監(jiān)視模型(編譯器輸入)1400與圖15的編譯器輸出文件之間進(jìn)行交叉引用。這些文件1400、1500被識別為1611(使用mmResource屬性識別監(jiān)視模型)和1610(使用iceResource屬性識別編譯器輸出文件)處的交叉引用文件的主題。要指出的是,該交叉引用文件中的關(guān)系可以是一對多,因為監(jiān)視模型中的單個元素會引起編譯器輸出文件中的多個步驟。針對輸入監(jiān)視模型中的每個操作(例如,執(zhí)行映射,停止計時器,遞增計數(shù)器等)在文件1600中生成<mmSt印〉元素。例如,參閱<mmSt印〉元素1620。每個<mmSt印〉元素都標(biāo)識來自源代碼的模型元素以及編譯器輸出文件的相應(yīng)語句(多個)。使用公知的XPath表示法的變型將源代碼中定義操作的模型元素標(biāo)識為<mmSt印〉元素內(nèi)的mmRef屬性的值。因此,例如,1630處的mmRef屬性標(biāo)識文件1400的模型元素1410,以及1640處的mmRef屬性標(biāo)識文件1400的<map>元素1421。通過這種方式,交叉引用文件遍歷監(jiān)視模型1400的元素。使用類似XPath的表示法在交叉引用文件中將文件1500內(nèi)的Ice語句標(biāo)識為iceRefs屬性的值。例如,1621處的iceRefs屬性標(biāo)識編譯器輸出文件1500的語句1510、1511、1520、1530、1540、1550和1560,生成所有這些語句來描述通過mmRef屬性1630引用的<inboundEvent>1410的作用,并且1650處的iceRefs屬性標(biāo)識1590處的〈assign〉語句(即,在圖16中使用基于零的計數(shù)的序數(shù)“6”標(biāo)識的嵌套〈fanOut〉內(nèi)生成的第七個賦值語句)。要指出的是,使用標(biāo)號1622標(biāo)識的語法包括單個<mmSt印〉元素。這是因為其中引用的分支語句和賦值語句都是作為圖14的1410處定義的入站事件訂閱(該定義繼續(xù)到標(biāo)號1419)的結(jié)果產(chǎn)生的。圖18示出了由相關(guān)發(fā)明的一個方面使用的用于針對監(jiān)視模型生成Ice語言的編譯器算法,現(xiàn)在將詳細(xì)進(jìn)行介紹。所述編譯器算法從模型獲取入站事件定義(事件訂閱)(方塊1800),方塊1805測試是否找到此類定義。如果找到,則在方塊1810生成onEvent語句(表示事件訂閱,帶有過濾條件)、fanOut語句(表示關(guān)聯(lián)邏輯),以及上下文初始化語句,從而生成與圖15中的語句1510-1560類似的邏輯。接下來,該編譯器的優(yōu)選實施例從沒有觸發(fā)器控制介入的情況下發(fā)生的事件中找到所有下游效應(yīng)(例如,在一個實施例中,所有事件驅(qū)動型計時器和計數(shù)器命令以及所有直接和間接的度量更新)。可以通過將某些計算值分配給表示執(zhí)行上下文(即,監(jiān)視上下文)的對象中的空位來實現(xiàn)所有這些效應(yīng)。相應(yīng)地,方塊1815針對每個事件驅(qū)動型計時器命令和每個計數(shù)器命令生成一個賦值語句(或相應(yīng)地生成多個賦值語句),并且方塊1820針對每個直接或間接的度量更新生成一個賦值語句(或相應(yīng)地生成多個賦值語句)。值得注意的是,在考慮依賴性的情況下生成這些賦值語句。例如,如果到metircl的映射依賴于metirc2,并且作為入站事件的結(jié)果更新這兩個度量,則生成賦值以確保在更新metricl之前更新metric^。由于在監(jiān)視模型中禁止循環(huán)依賴性,因此在確定賦值語句順序中考慮數(shù)據(jù)依賴性不會導(dǎo)致矛盾(或死鎖)并且生成這些級聯(lián)更新將在有限數(shù)量的步驟之后結(jié)束。接下來,該編譯器的優(yōu)選實施例從沒有觸發(fā)器控制介入的情況下發(fā)生的事件中找到所有下游效應(yīng)(例如,在一個實施例中,所有事件驅(qū)動型計時器和計數(shù)器命令以及所有直接和間接的度量更新)??梢酝ㄟ^將某些計算值分配給表示執(zhí)行上下文(即,監(jiān)視上下文)的對象中的空位來實現(xiàn)所有這些效應(yīng)。相應(yīng)地,方塊1815針對每個事件驅(qū)動型計時器命令和每個計數(shù)器命令生成一個賦值語句(或相應(yīng)地生成多個賦值語句),并且方塊1820針對每個直接或間接的度量更新生成一個賦值語句(或相應(yīng)地生成多個賦值語句)。值得注意的是,在考慮依賴性的情況下生成這些賦值語句。例如,如果到metircl的映射依賴于metirc2,并且作為入站事件的結(jié)果更新這兩個度量,則生成賦值以確保在更新metricl之前更新metric^。由于在監(jiān)視模型中禁止循環(huán)依賴性,因此在確定賦值語句順序中考慮數(shù)據(jù)依賴性不會導(dǎo)致矛盾(或死鎖)并且生成這些級聯(lián)更新將在有限數(shù)量的步驟之后結(jié)束。圖18B示出了對觸發(fā)器的處理,類似于圖18A中的入站事件處理。在圖18B的方塊1850,編譯器算法從模型獲取“待求值”觸發(fā)器的定義。在方塊1855生成測試觸發(fā)器的開啟條件并在得出false結(jié)果之后跳過后續(xù)語句的分支語句。該編譯器的優(yōu)選實施例然后找到該觸發(fā)器的所有下游效應(yīng),其中包括可能作為該觸發(fā)器啟動的結(jié)果而發(fā)生的所有觸發(fā)器驅(qū)動型計時器和計數(shù)器命令(如果輸入模型中具有此類元素)以及所有直接和間接的度量更新??梢酝ㄟ^將某些計算值分配給表示執(zhí)行上下文(即,監(jiān)視上下文)的對象中的空位來實現(xiàn)所有這些效應(yīng)。因此,方塊I860針對每個觸發(fā)器驅(qū)動型計時器命令和每個計數(shù)器命令生成一個賦值語句(或相應(yīng)地生成多個賦值語句),并且方塊1865針對每個直接或間接的度量更新生成一個賦值語句(或相應(yīng)地生成多個賦值語句)。如上參考方塊1820所述,在考慮依賴性的情況下生成在方塊1865處生成的賦值語句。在方塊1870,生成將啟動當(dāng)前待發(fā)出的任何出站事件的代碼。方塊1875生成代碼以對作為執(zhí)行先前生成的任何語句的結(jié)果而變?yōu)榇笾档娜魏斡|發(fā)器求值,并在需要時啟動這些觸發(fā)器,從而遞歸地調(diào)用圖18B中的邏輯。(此遞歸會結(jié)束,因為僅存在有限數(shù)量的觸發(fā)器定義數(shù)并且它們的依賴性圖沒有循環(huán))。最后,方塊1880生成將終止當(dāng)前待終止的任何監(jiān)視上下文的代碼。要指出的是,在同時啟動若干觸發(fā)器的情況下,未定義處理觸發(fā)器的運(yùn)行時順序??梢詫⒋艘暈楦偁帡l件,并且如果同時接收到若干入站事件,將出現(xiàn)類似競爭條件。如果根據(jù)特定模型處理兩個同時到達(dá)的事件的結(jié)果取決于處理所述事件的順序,則該模型為有設(shè)計問題的模型。類似地,如果對兩個同時啟動的觸發(fā)器執(zhí)行觸發(fā)器處理的結(jié)果取決于執(zhí)行其效應(yīng)的順序,則該模型為有設(shè)計問題的模型。(希望在監(jiān)視模型編輯器中檢測到此類問題并提示用戶相應(yīng)地修改模型)。因此,對于事件/觸發(fā)器驅(qū)動型編程模型而言,可能在方塊1830和1875處出現(xiàn)的明顯“任意性”是自然的,并且實際上是所期望的。通過比較圖18A和18B可以看到,生成表示圖18B中觸發(fā)器效應(yīng)的語句時所遵循的邏輯與圖18A中針對入站事件示出的邏輯相同針對觸發(fā)器驅(qū)動型計時器和計數(shù)器更新、直接和間接的度量更新、出站事件的發(fā)出、其他觸發(fā)器的求值(如果先前觸發(fā)器或其引起的任何更新導(dǎo)致此類求值)生成語句,最后針對上下文終止生成語句(如有必要)。如上所述,編譯器B除了產(chǎn)生Ice輸出文件B中的執(zhí)行順序以外,還產(chǎn)生將所生成的編譯器輸出中的每個步驟與來自原始監(jiān)視模型指定的入站事件訂閱、映射、計數(shù)器或計時器命令、觸發(fā)器定義或出站事件定義進(jìn)行關(guān)聯(lián)的交叉引用文件。當(dāng)用戶以單步模式執(zhí)行步驟時,這些交叉引用可以由第二相關(guān)申請的調(diào)試器使用,以便亮顯從其產(chǎn)生所生成的編譯器輸出的這些步驟的原始模型結(jié)構(gòu)。相應(yīng)地,在方塊1810-1835和1855-1880中的每個方塊處,所述編譯器優(yōu)選地將語法寫入交叉引用文件以記錄監(jiān)視模型輸入文件與所生成的編譯器輸出文件之間的關(guān)系。該語法已在圖16中示出并且上面參考該圖以及圖14-15進(jìn)行了介紹。(要指出的是,編譯器針對圖15所示的輸出文件和圖16所示的交叉引用文件生成了各種“內(nèi)務(wù)處理”型語法,例如名稱空間定義、或“xmlns”,出現(xiàn)在這些文件開頭的語句。本領(lǐng)域的技術(shù)人員很容易理解此類語法,并且對理解本發(fā)明或相關(guān)發(fā)明而言,不認(rèn)為對此類語法的說明是必需的)。圖19提供了根據(jù)本發(fā)明一個方面的優(yōu)選實施例的示例模式1900。(此示例模式的提供僅作為說明而非限制)。本領(lǐng)域的技術(shù)人員將理解,本發(fā)明的實施例可以提供為(例如)方法、系統(tǒng)和/或計算機(jī)程序產(chǎn)品。本發(fā)明可以采取完全硬件實施例、完全軟件實施例,或同時包含硬件和軟件元素的實施例的形式。在一個優(yōu)選實施例中,本發(fā)明以軟件實現(xiàn),所述軟件包括(但不限于)固件、駐留軟件、微代碼等。在硬件實施例中,可以提供執(zhí)行此處所述的功能的專用或?qū)iT電路。此外,本發(fā)明可以采取位于其中包含計算機(jī)可用程序代碼的一個或多個計算機(jī)可用存儲介質(zhì)(包括但不限于盤存儲設(shè)備、CD-ROM、光存儲設(shè)備等)上的計算機(jī)程序產(chǎn)品的形式,其中所述計算機(jī)程序產(chǎn)品可以被計算機(jī)或任何指令執(zhí)行系統(tǒng)使用或與計算機(jī)或任何指令執(zhí)行系統(tǒng)結(jié)合。出于在此說明的目的,計算機(jī)可用或計算機(jī)可讀介質(zhì)可以是任何能夠包含、存儲、傳送、傳播或傳輸由指令執(zhí)行系統(tǒng)、裝置或設(shè)備使用或與所述指令執(zhí)行系統(tǒng)、裝置或設(shè)備結(jié)合的程序的裝置。所述介質(zhì)可以是電、磁、光、電磁、紅外線或半導(dǎo)體系統(tǒng)(或裝置或設(shè)備)或傳播介質(zhì)。計算機(jī)可讀介質(zhì)的示例包括半導(dǎo)體或固態(tài)存儲器、磁帶、可移動計算機(jī)盤、隨機(jī)存取存儲器(_RAM_)、只讀存儲器(_R0M_)、硬磁盤和光盤。光盤的當(dāng)前實例包括光盤-只讀存儲器(_CD-R0M_)、光盤-讀/寫(_CR-R/W_)和DVD?,F(xiàn)在參考圖20,適于存儲和/或執(zhí)行程序代碼的數(shù)據(jù)處理系統(tǒng)2000包括至少一個直接或通過系統(tǒng)總線2014間接連接到存儲器元件的處理器2012。所述存儲器元件可以包括在程序代碼的實際執(zhí)行期間采用的本地存儲器2028、大容量存儲設(shè)備2030以及提供至少某些程序代碼的臨時存儲以減少必須在執(zhí)行期間從大容量存儲設(shè)備檢索代碼的次數(shù)的高速緩沖存儲器(未示出)。輸入/輸出(_1/0_)設(shè)備(包括但不限于鍵盤2018、顯示器2024、指點(diǎn)設(shè)備2020,其他接口設(shè)備2022等)可以直接或通過中間I/O控制器或適配器(2016、2026)與系統(tǒng)相連。網(wǎng)絡(luò)適配器也可以被連接到系統(tǒng)以使所述數(shù)據(jù)處理系統(tǒng)能夠通過中間專用或公共網(wǎng)絡(luò)(如總體在2032處所示)變得與其他數(shù)據(jù)處理系統(tǒng)或遠(yuǎn)程打印機(jī)或存儲設(shè)備相連。調(diào)制解調(diào)器、電纜調(diào)制解調(diào)器、無線適配器和以太網(wǎng)卡只是當(dāng)前可用類型的網(wǎng)絡(luò)適配器中的少數(shù)幾種。圖21示出了其中可實現(xiàn)本發(fā)明的數(shù)據(jù)處理網(wǎng)絡(luò)環(huán)境2100。數(shù)據(jù)處理網(wǎng)絡(luò)2100可以包括多個諸如無線網(wǎng)絡(luò)2142和網(wǎng)絡(luò)2144之類的單獨(dú)網(wǎng)絡(luò)。多個無線設(shè)備2110可以通過無線網(wǎng)絡(luò)2142進(jìn)行通信,并且在圖中(通過例示)被示為工作站2111的多個有線設(shè)備可以通過網(wǎng)絡(luò)2114進(jìn)行通信。此外,本領(lǐng)域的技術(shù)人員將理解,可以包括一個或多個局域網(wǎng)(_LAN_)(未示出),其中局域網(wǎng)可以包括多個與主機(jī)處理器相連的設(shè)備。仍參考圖21,網(wǎng)絡(luò)2142和2144還可以包括諸如網(wǎng)關(guān)計算機(jī)2146或應(yīng)用服務(wù)器2147之類的大型計算機(jī)或服務(wù)器(它們可以訪問數(shù)據(jù)存儲庫2148)。網(wǎng)關(guān)計算機(jī)2146充當(dāng)進(jìn)入每個網(wǎng)絡(luò)(例如網(wǎng)絡(luò)2144)的入口點(diǎn)。網(wǎng)關(guān)計算機(jī)2146可以優(yōu)選地通過通信鏈路2150a與另一網(wǎng)絡(luò)2142相連。網(wǎng)關(guān)2146還可以使用通信鏈路2150b、2150c與一個或多個工作站2111直接相連,以及/或者與此類設(shè)備間接相連。網(wǎng)關(guān)計算機(jī)2146可以使用IBM的EnterpriseSystemArchitecture/39_computer來實現(xiàn)。根據(jù)應(yīng)用的不同,可以采用諸如ApplicationSystem/400_(也稱為AS/400_)、iSeries7、SystemiJ之類的中型計算機(jī)。(—EnterpriseSystemArchitecture/39_、“ApplicationSystem/400”、“AS/400”以及“iSeries”是IBM在美國和/或其他國家/地區(qū)的注冊商標(biāo),“Systemi”是IBM的商標(biāo))。網(wǎng)關(guān)計算機(jī)2146還可以與存儲設(shè)備(諸如數(shù)據(jù)存儲庫2148)相連2149。本領(lǐng)域的技術(shù)人員將理解,網(wǎng)關(guān)計算機(jī)2146可以位于距離網(wǎng)絡(luò)2142非常遠(yuǎn)的地理位置,并且類似地,無線設(shè)備2110和/或工作站2111可以分別與網(wǎng)絡(luò)2142和2144具有一段距離。例如,網(wǎng)絡(luò)2142可以位于加利福尼亞州,而網(wǎng)關(guān)2146可以位于德克薩斯州,一個或多個工作站2111可以位于佛羅里達(dá)州。無線設(shè)備2110可以使用諸如傳輸控制協(xié)議/網(wǎng)際協(xié)議(_TCP/IP_)之類的聯(lián)網(wǎng)協(xié)議通過諸如蜂窩電話、射頻網(wǎng)絡(luò)、衛(wèi)星網(wǎng)絡(luò)之類的多個備選連接介質(zhì)與無線網(wǎng)絡(luò)2142相連。無線網(wǎng)絡(luò)2142優(yōu)選地使用諸如TCP或用戶數(shù)據(jù)報協(xié)議(_UDP_)之類的網(wǎng)絡(luò)連接2150a通過IP、X.25、幀中繼、綜合業(yè)務(wù)數(shù)字網(wǎng)(_ISDN_)、公共交換電話網(wǎng)(_PSTN_)等與網(wǎng)關(guān)2146相連。工作站2111可以使用撥號連接2150b或2150c直接連接到網(wǎng)關(guān)2146。進(jìn)而,無線網(wǎng)絡(luò)2142和網(wǎng)絡(luò)2144可以使用類似于圖21所示的方式與一個或多個其他網(wǎng)絡(luò)(未示出)相連。已參考根據(jù)本發(fā)明的各實施例的流程圖和/或方塊圖對本發(fā)明進(jìn)行了描述。應(yīng)該理解,所述流程圖和/或方塊圖中的每個流程和/或方塊,以及所述流程圖和/或方塊圖中的流程和/或方塊的組合可以通過計算機(jī)程序指令實現(xiàn)。這些計算機(jī)程序指令可以提供給通用計算機(jī)、專用計算機(jī)、嵌入式處理器或其他可編程數(shù)據(jù)處理裝置的處理器以產(chǎn)生機(jī)器,從而使所述指令在通過所述計算機(jī)或其他可編程數(shù)據(jù)處理裝置的處理器執(zhí)行時,能夠創(chuàng)建用于實現(xiàn)所述流程圖和/或方塊圖中的一個或多個流程和/或方塊中指定的功能的裝置。這些計算機(jī)程序指令還可以存儲在可引導(dǎo)計算機(jī)或其他可編程數(shù)據(jù)處理裝置按照特定方式運(yùn)行的計算機(jī)可讀存儲器中,以便存儲在所述計算機(jī)可讀存儲器中的指令產(chǎn)生包括用于實現(xiàn)所述流程圖和/或方塊圖中的一個或多個流程和/或方塊中指定的功能的指令裝置的制品所述計算機(jī)程序指令還可以加載到計算機(jī)或其他可編程數(shù)據(jù)處理裝置上以在所述計算機(jī)或其他可編程裝置上執(zhí)行一系列操作步驟以生成計算機(jī)實現(xiàn)的過程,以便在所述計算機(jī)或其他可編程裝置上執(zhí)行的指令提供用于實現(xiàn)所述流程圖和/或方塊圖中的一個或多個流程和/或方塊中指定的功能的步驟。盡管已經(jīng)描述了本發(fā)明的各實施例,但是本領(lǐng)域的技術(shù)人員在了解基本發(fā)明理念之后,將想到這些實施例的其他變型和修改。因此,所附權(quán)利要求旨在被理解為包括所述的實施例以及所有此類變型和修改都落入本發(fā)明的精神和范圍之內(nèi)。權(quán)利要求一種用于執(zhí)行虛擬機(jī)的方法,包括在計算機(jī)上使用所述虛擬機(jī)執(zhí)行來自程序的指令,其中所述指令包括以下指令中的至少一個事件指令,其用于接收入站事件;賦值指令,其用于分配值;分支指令,其用于有條件的轉(zhuǎn)移到另一個指令;發(fā)送指令,其用于指定要發(fā)送出站事件;終止指令,其用于指定要終止當(dāng)前執(zhí)行上下文對象;以及扇出指令,其用于指定事件關(guān)聯(lián)和啟用上下文切換中的至少一個。2.如權(quán)利要求1中所述的方法,其中從事件驅(qū)動的模型規(guī)范生成所述指令。3.如權(quán)利要求1中所述的方法,其中從消息驅(qū)動的模型規(guī)范生成所述指令。4.如權(quán)利要求1中所述的方法,還包括在所述計算機(jī)上使用所述虛擬機(jī)執(zhí)行來自多個程序的指令,所述多個程序從至少兩個不同的執(zhí)行模型生成。5.如權(quán)利要求1中所述的方法,其中執(zhí)行所述事件指令進(jìn)一步包括執(zhí)行所述事件指令以接收特定入站事件;查找與所述事件指令關(guān)聯(lián)的扇出指令;執(zhí)行所找到的扇出指令以便使用與所找到的扇出指令關(guān)聯(lián)的關(guān)聯(lián)謂詞信息判定任何當(dāng)前執(zhí)行上下文對象是否能夠進(jìn)一步處理所述特定入站事件;以及如果有能力的執(zhí)行上下文對象存在,將所述特定入站事件導(dǎo)向每個所確定的有能力的執(zhí)行上下文對象以便在其中進(jìn)行進(jìn)一步處理。6.如權(quán)利要求1中所述的方法,其中用于接收入站事件的所述事件指令還過濾所述入站事件。7.如權(quán)利要求1中所述的方法,其中使用所述虛擬機(jī)執(zhí)行所述指令進(jìn)一步包括在接收到特定入站事件時,在來自所述程序的多個事件指令中的每個事件指令內(nèi)存在類型規(guī)范的情況下,通過將所述特定入站事件聲明的類型與所述多個事件指令中的每個事件指令內(nèi)的類型規(guī)范相比較來確定要執(zhí)行所述多個事件指令中的哪個事件指令。8.如權(quán)利要求1中所述的方法,其中執(zhí)行所述賦值指令進(jìn)一步包括對所述賦值指令的表達(dá)式求值;以及將所述求值的結(jié)果作為值分配給由所述賦值指令標(biāo)識的目標(biāo)。9.如權(quán)利要求1中所述的方法,其中執(zhí)行所述分支指令進(jìn)一步包括對所述分支指令的條件表達(dá)式求值;以及其中所述有條件的轉(zhuǎn)移進(jìn)一步包括當(dāng)所述求值返回“true”結(jié)果時,接下來執(zhí)行由所述分支指令的屬性標(biāo)識的另一個指令,否則,接下來執(zhí)行所述指令中的下一順序指令。10.如權(quán)利要求1中所述的方法,其中執(zhí)行所述發(fā)送指令進(jìn)一步包括將所述出站事件發(fā)送到事件總線。11.如權(quán)利要求10中所述的方法,其中執(zhí)行所述發(fā)送指令進(jìn)一步包括對所述發(fā)送指令中指定的表達(dá)式求值并在所述發(fā)送之前在所述出站事件中反映所述求值的結(jié)果。12.如權(quán)利要求1中所述的方法,其中執(zhí)行所述終止指令進(jìn)一步包括終止所述當(dāng)前執(zhí)行上下文對象。13.一種用于執(zhí)行程序的虛擬機(jī),包括指令執(zhí)行器,其用于使用計算機(jī)執(zhí)行來自所述程序的指令,其中所述指令包括以下指令中的至少一個事件指令,其用于接收入站事件;賦值指令,其用于分配值;分支指令,其用于有條件的轉(zhuǎn)移到另一個指令;發(fā)送指令,其用于指定要發(fā)送出站事件;終止指令,其用于指定要終止當(dāng)前執(zhí)行上下文對象;以及扇出指令,其用于指定事件關(guān)聯(lián)和啟用上下文切換中的至少一個。14.如利權(quán)要求13中所述的虛擬機(jī),其中從事件驅(qū)動的模型規(guī)范生成所述指令。15.如利權(quán)要求13中所述的虛擬機(jī),其中從消息驅(qū)動的模型規(guī)范生成所述指令。16.如權(quán)利要求13中所述的虛擬機(jī),其中所述虛擬機(jī)可用于執(zhí)行多個程序,所述多個程序從至少兩個不同的執(zhí)行模型生成。17.如權(quán)利要求13中所述的虛擬機(jī),其中執(zhí)行所述事件指令進(jìn)一步包括執(zhí)行所述事件指令以接收特定入站事件;查找與所述事件指令關(guān)聯(lián)的扇出指令;執(zhí)行所找到的扇出指令以便使用與所找到的扇出指令關(guān)聯(lián)的關(guān)聯(lián)謂詞信息判定任何當(dāng)前執(zhí)行上下文對象是否能夠進(jìn)一步處理所述特定入站事件;以及如果有能力的執(zhí)行上下文對象存在,將所述特定入站事件導(dǎo)向每個所確定的有能力的執(zhí)行上下文對象以便在其中進(jìn)行進(jìn)一步處理。18.如權(quán)利要求13中所述的虛擬機(jī),其中用于接收入站事件的所述事件指令還過濾所述入站事件。19.如權(quán)利要求13中所述的虛擬機(jī),其中所述虛擬機(jī)的指令執(zhí)行器在接收到特定入站事件時,在來自所述程序的多個事件指令中的每個事件指令內(nèi)存在類型規(guī)范的情況下,通過將所述特定入站事件聲明的類型與所述多個事件指令中的每個事件指令內(nèi)的類型規(guī)范相比較來確定要執(zhí)行所述多個事件指令中的哪個事件指令。20.如權(quán)利要求13中所述的虛擬機(jī),其中執(zhí)行所述賦值指令進(jìn)一步包括對所述賦值指令的表達(dá)式求值;以及將所述求值的結(jié)果作為值分配給由所述賦值指令標(biāo)識的目標(biāo)。21.如權(quán)利要求13中所述的虛擬機(jī),其中執(zhí)行所述分支指令進(jìn)一步包括對所述分支指令的條件表達(dá)式求值;以及其中所述有條件的轉(zhuǎn)移進(jìn)一步包括當(dāng)所述求值返回“true”結(jié)果時,接下來執(zhí)行由所述分支指令的屬性標(biāo)識的另一個指令,否則,接下來執(zhí)行所述指令中的下一順序指令。22.如權(quán)利要求13中所述的虛擬機(jī),其中執(zhí)行所述發(fā)送指令進(jìn)一步包括將所述出站事件發(fā)送到事件總線。23.如權(quán)利要求22中所述的虛擬機(jī),其中執(zhí)行所述發(fā)送指令進(jìn)一步包括對所述發(fā)送指令中指定的表達(dá)式求值并在所述發(fā)送之前在所述出站事件中反映所述求值的結(jié)果。24.如權(quán)利要求13中所述的虛擬機(jī),其中執(zhí)行所述終止指令進(jìn)一步包括終止所述當(dāng)前執(zhí)行上下文對象。25.一種用于執(zhí)行虛擬機(jī)的計算機(jī)程序產(chǎn)品,其中所述計算機(jī)程序產(chǎn)品包含在一個或多個計算機(jī)可讀介質(zhì)中并且包括用于以下操作的計算機(jī)可讀指令在計算機(jī)上使用所述虛擬機(jī)執(zhí)行來自程序的指令,其中所述指令包括以下指令中的至少一個事件指令,其用于接收入站事件;賦值指令,其用于分配值;分支指令,其用于有條件的轉(zhuǎn)移到另一個指令;發(fā)送指令,其用于指定要發(fā)送出站事件;終止指令,其用于指定要終止當(dāng)前執(zhí)行上下文對象;以及扇出指令,其用于指定事件關(guān)聯(lián)和啟用上下文切換中的至少一個。26.一種存儲以編程語言編寫的源代碼的計算機(jī)可讀介質(zhì),其中所述編程語言包括事件指令,其用于接收入站事件;賦值指令,其用于分配值;分支指令,其用于有條件的轉(zhuǎn)移到另一個指令;發(fā)送指令,其用于指定要發(fā)送出站事件;終止指令,其用于指定要終止當(dāng)前執(zhí)行上下文對象;以及扇出指令,其用于指定事件關(guān)聯(lián)和啟用上下文切換中的至少一個;以及所述源代碼包括所述編程語言中的多個所述指令。27.如權(quán)利要求26中所述的計算機(jī)可讀介質(zhì),其中從事件驅(qū)動的模型規(guī)范生成所述源代碼。28.如權(quán)利要求26中所述的計算機(jī)可讀介質(zhì),其中從消息驅(qū)動的模型規(guī)范生成所述源代碼。29.—種可存儲在計算機(jī)可讀介質(zhì)中以使計算機(jī)執(zhí)行的指令程序,其中所述指令包括多個以下指令事件指令,其用于接收入站事件;賦值指令,其用于分配值;分支指令,其用于有條件的轉(zhuǎn)移到另一個指令;發(fā)送指令,其用于指定要發(fā)送出站事件;終止指令,其用于指定要終止當(dāng)前執(zhí)行上下文對象;以及扇出指令,其用于指定事件關(guān)聯(lián)和啟用上下文切換中的至少一個。30.如權(quán)利要求29中所述的指令程序,其中從事件驅(qū)動的模型規(guī)范生成所述指令。31.如權(quán)利要求29中所述的指令程序,其中從消息驅(qū)動的模型規(guī)范生成所述指令。全文摘要虛擬機(jī)支持編譯器生成的代碼的執(zhí)行,并為可以與若干不同事件驅(qū)動或消息驅(qū)動的編程模型(例如狀態(tài)機(jī)、用于復(fù)雜事件處理和事件關(guān)聯(lián)的規(guī)則、監(jiān)視上下文、過程以及調(diào)解)中的任何一個對應(yīng)的代碼提供執(zhí)行環(huán)境。所述編程模型可以用在業(yè)務(wù)監(jiān)視和/或業(yè)務(wù)集成環(huán)境中。定義編程語言以便使用所述虛擬機(jī)執(zhí)行,所述編程語言包含相對較少數(shù)量的指令并且優(yōu)選地由編譯器從高級的事件驅(qū)動或消息驅(qū)動的模型生成。文檔編號G06F9/46GK101960425SQ200980106872公開日2011年1月26日申請日期2009年2月26日優(yōu)先權(quán)日2008年2月29日發(fā)明者J·法蘭克,W·賈米森申請人:國際商業(yè)機(jī)器公司