用于事件处理的虚拟机和编程语言的制作方法

文档序号:6592960阅读:526来源:国知局

专利名称::用于事件处理的虚拟机和编程语言的制作方法
技术领域
:本发明涉及计算机,更具体地说,涉及用于事件处理(例如,在业务监视和/或业务集成环境中)的虚拟机和编程语言。
背景技术
:事件驱动的应用程序在业务监视和业务集成中扮演着越来越重要的角色。例如,国际商业机器公司(“IBM”)提供的WebSphere业务集成平台支持用于业务环境的多种不同类型的事件驱动的可执行体(executables)。这些类型的可执行体包括状态机、用于复杂事件处理(“CEP”)和事件关联的规则以及监视上下文。(“WebSphere”是IBM在美国和/或其他国家/地区的注册商标。)在业务监视和业务集成环境中,通常作为消息传送事件。消息驱动的可执行体包括过程和调解(mediation)。
发明内容在第一方面中,本发明涉及执行事件处理的虚拟机。在一个实施例中,此方面包括在计算机上使用所述虚拟机执行来自程序的指令,其中所述指令包括以下指令中的至少一个事件指令,其用于接收入站事件;赋值指令,其用于分配值;分支指令,其用于有条件的转移到另一个指令;发送指令,其用于指定要发送出站事件;终止指令,其用于指定要终止当前执行上下文对象;以及扇出指令,其用于指定事件关联和启用上下文切换中的至少一个。可以从事件驱动的模型规范和/或消息驱动的模型规范生成所述指令。可以在所述计算机上使用所述虚拟机执行来自多个程序的指令,所述多个程序可从至少两个不同的执行模型生成。执行所述事件指令可以进一步包括执行所述事件指令以接收特定入站事件;查找与所述事件指令关联的扇出指令;执行所找到的扇出指令以便使用与所找到的扇出指令关联的关联谓词信息判定任何当前执行上下文对象是否能够进一步处理所述特定入站事件;以及如果有能力的执行上下文对象存在,将所述特定入站事件导向每个所确定的有能力的执行上下文对象以便在其中进行进一步处理。用于接收入站事件的所述事件指令还可以过滤所述入站事件。使用所述虚拟机执行所述指令可以进一步包括在接收到特定入站事件时,在来自所述程序的多个事件指令中的每个事件指令内存在类型规范的情况下,通过将所述特定入站事件声明的类型与所述多个事件指令中的每个事件指令内的类型规范相比较来确定要执行所述多个事件指令中的哪个事件指令。执行所述赋值指令可以进一步包括对所述赋值指令的表达式求值;以及将所述求值的结果作为值分配给由所述赋值指令标识的目标。执行所述分支指令可以进一步包括对所述分支指令的条件表达式求值;以及其中所述有条件的转移可以进一步包括当所述求值返回“true”结果时,接下来执行由所述分支指令的属性标识的另一个指令,否则,接下来执行所述指令中的下一顺序指令。执行所述发送指令可以进一步包括将所述出站事件发送到事件总线。执行所述发送指令可以进一步包括对所述发送指令中指定的表达式求值并在所述发送之前在所述出站事件中反映所述求值的结果。执行所述终止指令可以进一步包括终止所述当前执行上下文对象。在第二方面中,本发明涉及用于事件处理的编程语言。在一个实施例中,此方面包括存储以编程语言编写的源代码的计算机可读介质,其中所述编程语言包括事件指令,其用于接收入站事件;赋值指令,其用于分配值;分支指令,其用于有条件的转移到另一个指令;发送指令,其用于指定要发送出站事件;终止指令,其用于指定要终止当前执行上下文对象;以及扇出指令,其用于指定事件关联和启用上下文切换中的至少一个,并且其中所述源代码包括所述编程语言中的多个所述指令。在另一个实施例中,此方面包括一种可存储在计算机可读介质中以使计算机执行的指令程序,其中所述指令包括多个以下指令事件指令,其用于接收入站事件;赋值指令,其用于分配值;分支指令,其用于有条件的转移到另一个指令;发送指令,其用于指定要发送出站事件;终止指令,其用于指定要终止当前执行上下文对象;以及扇出指令,其用于指定事件关联和启用上下文切换中的至少一个。所述编程语言可以用于从事件驱动的模型规范和/或消息驱动的模型规范生成的程序。本发明的这些和其他方面的实施例可以被提供为方法、系统和/或计算机程序产品。应指出的是,上述内容为概要,并且因此必然包含详细信息的简化、概括和省略;从而,本领域的技术人员将意识到所述概要仅为示例性的,并非旨在以任何方式进行限制。如所附权利要求限定的本发明的其他方面、发明特性和优点将在下面给出的非限制详细描述中变得显而易见。现在将仅通过实例的方式参考附图描述本发明的优选实施例,这些附图是图1示出了根据本发明的一个方面的通过单个虚拟机支持先前通过定制引擎支持的应用的多个高级编程模型的使用;图2示出了根据本发明的一个方面的入站事件的处理;图3-6提供了示出根据本发明的一个方面的可用于在虚拟机内处理“Ice”程序的逻辑的流程图;图7示出了可由本发明以及第一和第二相关申请中披露的发明的各方面执行的处理的高级视图;图8-13分别提供了状态机模型、事件类型规范、事件、上下文对象类型规范、上下文对象以及用于状态机执行的Ice程序的实例;图14-17分别提供了监视模型、编译器生成的输出文件、编译器生成的交叉引用文件以及示例上下文对象类型规范的实例;图18(包括图18A和18B)示出了由第一相关申请中披露的发明的一个方面使用的编译器算法;图19提供了用于Ice语言的示例模式;图20示出了适于存储和/或执行程序代码的数据处理系统;以及图21示出了其中可使用本发明的一个或多个实施例的代表性网络环境。具体实施例方式在本发明的一个方面中,定义了一种编程语言。此编程语言可以被称为“机器级”编程语言。在本发明的另一个方面中,披露了一种处理引擎,在此等价地称为虚拟机。可以在业务监视和业务集成中使用两种不同的通信类型,即远程方法调用(使用远程过程调用或“RPC”通信)和基于事件的通信。本发明的各方面涉及基于事件的通信。基于事件的通信可以备选地被称为事件产生者与事件使用者之间的基于“单向”消息的通信。可以使用直接寻址类型或使用发布-订阅方法交换此类单向消息。业务监视情况中的通信通常是基于事件的,而业务基础情况中的通信可以使用这两种类型之一。可以备选地根据其路由算法描述这些通信类型,注意基于消息的编程和基于事件的编程中使用的路由算法是不同的。用于基于消息的编程的路由算法通常使用有向或“推”模型,而用于基于事件的编程的路由算法通常使用订阅或“拉”模型。但是,观察到使用同一组基本步骤或功能来处理到达端点的事件或消息。相应地,本发明的各实施例并不限于与事件驱动的可执行体一起使用,诸如过程和调解之类的消息驱动的可执行体也在本发明所界定的可执行体范围内。用于处理事件或消息的基本步骤通常包括接收事件/消息;过滤所收到的事件/消息;将所述事件/消息与一个或多个执行上下文对象关联(并且取决于高级编程模型,这些对象可以表示状态机执行上下文、CEP存在时间、监视上下文、过程执行上下文、调解上下文等);根据事件/消息内容更新目标执行上下文(多个)的内部状态;评估条件并执行有条件的分支;如有必要发送出站一个或多个事件/消息(例如,状态机模型情况下的状态转变事件、CEP规则情况下的聚合消息、监视上下文情况下的警报、过程模型情况下的下一活动的启动消息,以及调解情况下的调解消息);以及创建或终止执行上下文对象。虽然可以使用高级编程模型(S卩,状态机、CEP、监视、过程、调解等)以用户友好的方式定义此类可执行体,但是本发明的一个方面定义了一种包括相对简单的指令集的编程语言,可以将这些模型作为可执行体编译成此编程语言。然后,可以在此处披露的虚拟机上执行此编译的可执行体。值得注意的是,可以在此同一虚拟机上执行来自不同高级编程模型的已编译可执行体(如将在下面参考图1描述的那样)。相比之下,现有技术业务集成平台通常针对每个高级编程模型使用不同的执行环境,从而针对平台所支持的每种可执行体提供“定制引擎”。例如,如果特定平台支持状态机、用于复杂事件处理和事件关联的规则、监视上下文、过程以及调解,则管理和维护此平台及其各种引擎或执行环境可能变得非常困难。在此披露的虚拟机能够将支持的执行环境的数量减少到1。可以例如通过专注于单个虚拟机实施的开发、性能优化、管理和操作接口、文档等实现成本节省。在此披露的编程语言能够使用此单个虚拟机支持先前通过定制引擎支持的应用。使用不同的编译器支持不同的高级编程模型。参阅图1,它示出了此方法。如图中所示,可与监视模型110的声明式程序一起使用的第一编译器120提供可使用虚拟机150执行的代码,并且可与状态机模型130—起使用的第二编译器140提供可使用此同一虚拟机150执行的代码。此方法提供的抽象还可便于将执行环境移植到不同的硬件平台和操作系统。本发明和相关发明的实施例优选地用于其中使用发布_订阅通信分发事件的应用环境中,其中事件订阅方从一个或多个事件源(发布方)接收事件并处理这些事件。但是,本发明和相关发明的实施例可以备选地用于基于消息范例的应用环境中,其中只要消息满足在目标处部署的Ice程序的订阅准则,消息产生者便会将这些消息发送到特定目标(即,消息接收方);将在下面更详细地讨论这些准则。发送和接收事件可以遵循“事件总线”范例,由此将入站事件视为从连接事件源与事件接收方的总线(其例如可以实现为队列或其他数据存储和传输技术)接收,并且由此将出站事件视为传送到此总线以便传输给感兴趣的收听方。在此定义的编程语言使用相对较少数量的指令,这些指令设计为支持上述基本步骤或功能。借用处理器体系结构领域中的术语,这可以被称为用于事件处理应用(或备选地消息处理应用)的“精简指令集”或“RISC”方法。要指出的是,此编程语言可以由编译器生成,并且通常不供编程人员使用。(第一相关申请中披露了一个此类编译器,此编译器与监视上下文模型有关)。在一种方法中,此编程语言中使用的指令包括六个指令。现在将描述其中每个指令。“onEvent”指令或语句通常对应于接收单个入站事件,并指定入站事件“订阅”(即,针对订阅入站事件指定的信息)。优选地使用可扩展标记语言或“XML”,表示法指定入站事件和出站事件,其中包括此类事件的内容或“有效负载”。相应地,onEvent指令可以引用入站事件内XML文档(或文档片段)中的元素和属性。在一个优选实施例中,onEvent指令包括“filter(过滤)”属性,其布尔条件表示订阅准则其内容满足过滤条件的任何事件均被视为满足此onEvent语句的订阅。当此类事件到达虚拟机时,将由onEvent的从属语句(多个)进行处理,其中这些从属语句也取自在此披露的指令集。现在将描述这些从属语句。提供了“fanOut(扇出)”指令或语句,此指令实现事件关联和上下文切换。跟在onEvent语句之后的第一fanOut指令在入站事件的上下文中执行,并将事件与零个或多个变成初始执行上下文的上下文对象关联以处理事件。后续fanOut语句在当前上下文对象的上下文中执行,并将事件与零个或多个新上下文对象关联,由此实现从当前上下文对象到新上下文对象(多个)的上下文切换;这些新上下文对象将变成fanOut语句范围内的后续指令的执行上下文。“assign(赋值)”指令或语句通常对应于为当前上下文对象(其可以表示状态机上下文、监视上下文、过程执行上下文等)的某个空位(slot)或出站事件的某个空位分配值。在一个优选实施例中,赋值语句的右侧是表达式,此表达式取决于1值或当前上下文对象(如果具有建立此类上下文对象的fanOut)和入站事件(被视为执行上下文的一部分)中的空位。“branch(分支)”指令或语句通常对应于控制有条件的转移到程序中的上一或下一步骤,并且可以指定“distance(距离),,属性以指示当执行分支时控制将转移到的指令的相对偏移。distance属性的正值指示执行顺序中的向前跳转,负值指示控制转移到前一指令。在一个优选实施例中,分支条件是布尔表达式,针对其1值应用相同的规则,如上针对赋值语句的右侧所讨论的那样。如果分支条件的值为true,则采用分支;否则,执行继续到跟在分支指令之后的语句。“emit(发送)”指令或语句通常对应于指定要发送出站事件。通常在填充所述出站事件的一个或多个空位(例如,通过执行赋值指令)之后使用此指令。“terminate(终止)”指令或语句通常对应于指定应终止当前上下文对象(其可以表示状态机上下文、监视上下文、过程执行上下文等)。可选地,还可以支持“macro(宏)”指令或语句。此指令可以用于封装可重用的指令块。术语“Ice”在此用于指此编程语言。“Ice”源自术语“中间代码”,并指示以此语言编写的程序优选地是执行的中间步骤,表示派生自采用另一种表示法编写的源代码并且然后在此处描述的虚拟机环境中执行的编译后输出。在第一相关申请中披露了一种用于从监视模型派生Ice程序的可能算法。(值得注意的是,在此披露的编程语言优选地由编译器生成,并且通常不由用户编写。)通过将所述编程语言中的指令减少到在此描述的这些指令,可以促进移植性,并且可以在单个运行时环境的实施和优化方面实现经济性。如第一和第二相关申请中所述,显示中间代码的执行步骤以及原始源可以为用户提供在调试期间查看的有用信息粒度。例如,当调试事件驱动型程序时,允许用户对算术表达式求值时涉及的每个操作或在数据库中保持值时涉及的每个操作进行单步调试并不被认为是有用的。实际上,假设可以在不出现错误的情况下执行此类型的基本操作。相应地,在第一相关申请中披露的编译器(其采用在此定义的编程语言生成代码)的优选实施例不会针对此类原始操作生成代码(并且在第二相关申请中披露的调试器不提供对这些原始操作进行单步调试),而是将此类操作封装在已编译代码根据需要调用的低级例程中,从而为尝试调试高级程序的用户提供“原子”操作的外表。这预期不仅使调试更少地困扰用户,而且预期还降低已编译代码的复杂性(这又预期通常改进已生成代码的编译过程和运行时效率)。此方法与业务监视和业务集成中使用的高级编程模型的公知代码生成器形成对照,后者可以采用Java编程语言生成代码。(Java是SunMicrosystemsInc.的商标。)此类代码生成器通常生成包含许多步骤(例如,方法调用、内部变量的初始化和管理、异常处理等)的代码,这些步骤可使代码生成器的逻辑复杂化。此外,由这些公知代码生成器生成的代码可能会给尝试调试原始源程序的用户增加太多不感兴趣的细节分析上述高级编程模型的所需运行时环境时,可以看到应解决三个方面类型系统、表达式语言和执行逻辑(即,指令排序)。对于事件处理,本发明的优选实施例针对类型系统使用XML模式,针对表达式语言使用公知的XPath表示法,并使用在此披露的Ice语言指定执行顺序以便在接收上下文对象的领域中处理事件。但是,所述类型系统和表达式语言是可插入的,并且因此同一Ice语言编程模型可以用于不同的类型系统和不同的表达式语言。(在此披露的虚拟机可以将表达式求值例如委托给插入组件,然后可以通过重新配置虚拟机以使用不同的表达式求值组件来替代不同的表达式语言。)现在将描述由本发明的实施方式的一个优选实施例提供的运行时行为。现在将描述优选实施例中使用的执行上下文方法。可以在特定上下文中处理入站事件,所述特定上下文可以使用诸如XML模式之类的类型定义语言建模。相应地,可以在包含零个或多个上下文对象的上下文中处理入站事件,所述上下文可以是持久的(即,可跨若干入站事件重用)或暂时的(即,在处理事件之后终止)。上下文对象具有与之关联的类型,并且在一种方法中,在虚拟容器(在此等价地简称为容器)中管理上下文对象。如果上下文对象的类型声明“key(键)”属性,则上下文对象可以在容器中被多次实例化,其中每个实例具有不同(即,唯一)的键值。如果上下文对象的类型没有声明key属性,则上下文对象仅可被实例化一次,从而在容器中提供单个“静态”实例。优选地,容器管理它所包含的上下文对象的生命周期和持久性,并根据它所加载的事件处理程序集处理针对这些对象的入站事件。现在将参考图2讨论此类程序的语义描述。通过将事件导向订阅方来管理事件订阅。在本发明的各优选实施例中,容器承担事件订阅方的角色。当事件到达容器时,将根据可能已由此容器加载的程序中的任何onEvent指令的过滤器来测试事件。在入站事件的上下文中执行其过滤被求值为true的每个onEvent语句,其中包括处理此onEvent语句的所有嵌套指令(例如,fanOut、assign、branch>emit禾口/或terminate指令)。作为onEvent语句的一个嵌套指令提供fanOut指令。根据各优选实施例,fanOut语句指定目标对象类型和关联谓词,所述关联谓词用于标识在其上下文中执行跟在fanOut之后的指令的目标对象实例(多个)。图2示出了onEvent和fanOut的语义。事件201被导向虚拟容器202,虚拟容器202已加载一个或多个Ice程序203和关联的类型定义204。在图2中所示的时刻,"context1"205a的两个实例和“context2”205b的四个实例已在容器中被实例化。所有已加载的Ice程序203中的onEvent语句表示容器的事件订阅。根据每个订阅测试定向到容器202的任意事件201,并且如果事件满足过滤条件,则称事件“通过过滤”206。已通过onEvent语句的过滤的事件由此onEvent语句的从属语句处理。fanOut语句将事件与容器中特定上下文对象类型的零个或多个实例关联。参阅207。然后在此对象的上下文中处理fanOut语句的从属语句。其他指令(包括assign、branch、emit和terminate)的语义对应于其他编程语言中的此类指令的公知用法。现在参考图3-6,现在将描述根据本发明的一个优选实施例的在虚拟机内处理Ice程序。图3提供了示出可用于处理到达虚拟容器的入站事件的逻辑的流程图。在各优选实施例中,容器具有事件可以定向到的地址,例如统一资源定位器(“URL”)。针对此入站事件启动工作单位或事务(方块300)。方块320测试是否仍根据此入站事件处理任何onEvent语句。优选实施例按文档顺序对部署在此容器处的Ice程序的每个onEvent语句求值。如果方块320中的测试具有否定结果,则在方块310,提交所述工作单位(这可以包括发送出站事件,如在下面参考图6B所讨论的那样)。然后此事件的处理结束。但是,当剩余至少一个未处理的onEvent语句时,方块320处的测试具有肯定结果,并且因此处理在方块330继续。方块330获取下一onEvent语句。方块340测试此onEvent语句的rootElement属性(如果在其中存在)是否与入站事件的文档根的完全限定名称匹配。如果不匹配,则处理返回方块320以检查此Ice程序中或此容器中加载的其他Ice程序中的其他onEvent语句。否则,当根元素存在匹配时,处理在方块350继续。方块350根据入站事件对此onEvent语句的filter属性(如果存在)求值。如果过滤的求值结果为true(或如果不存在filter属性),则处理在方块360继续;否则,控制返回到方块320。在方块360,获取此onEvent语句的嵌套语句,并且在方块370处理这些语句,这在图4中更详细地示出。然后控制返回到方块320。图4提供了示出可用于处理onEvent语句的嵌套语句的逻辑的流程图。图4中的方块400测试是否存在下一嵌套语句。如果不存在,则处理从图4中退出。否则,处理在方块410继续,方块410取回此下一语句。然后方块420测试已取回的语句是否为fanOut语句。如果是,则在方块425处理fanOut语句,此后控制返回到方块400以检查另一个下一语句。在图5中更详细地描述方块425。当方块420处的测试具有否定结果时,处理在方块430继续。方块430测试已取回的语句是否为assign语句。如果是,则在方块435处处理assign语句,此后控制返回到方块400。在图6A中更详细地描述方块435。当方块430处的测试具有否定结果时,处理在方块440继续。方块440测试已取回的语句是否为emit语句。如果是,则在方块445处理emit语句,此后控制返回到方块400以检查另一个下一语句。在图6B中更详细地描述方块445。当方块440处的测试具有否定结果时,处理在方块450继续。方块450测试已取回的语句是否为branch语句。如果是,则在方块455处理branch语句,此后控制返回到方块400。在图6C中更详细地描述方块455。当方块450处的测试具有否定结果时,处理在方块460继续。方块460测试已取回的语句是否为terminate语句。如果是,则在方块465处理terminate语句,此后控制返回方块400。在图6D中更详细地描述方块465。当方块460处的测试具有否定结果时,则处理优选地返回方块400。此外或替代地,可生成错误条件以指示遇到未知语句。现在参考图5,提供了示出可用于处理现在将描述的fanOut语句的逻辑的流程图。在方块500,针对其根元素名称与fanOut语句的“targetRootElement”属性值匹配的容器中的所有上下文对象,对此fanOut语句的关联谓词求值。(参阅图13中的1323以了解示例targetRootElement属性。)如果当前求值的fanOut语句中不存在此属性,则根据优选实施例,针对所有已加载的上下文对象对关联谓词求值。方块510根据在方块500处找到多少个匹配来确定要使用的处理选项。各优选实施例针对没有匹配、一个匹配以及多个匹配提供了处理。因此,fanOut语句可以针对这些情况中的每一种情况指定属性,并且这些属性中适用的一个属性的值确定此fansOut语句将如何处理当前处理的事件。例如,参考图13中的编译器生成的示例可执行体1300,1320处的fanOut元素指定如果在其根元素名称与targetRootElement值匹配的上下文对象之中没有与关联谓词的匹配,则创建新的上下文对象(参阅1325,其中在此示例中将属性值"createNewTarget"指定为“noMatches”属性的值),如果只有一个匹配,则将事件传送到单个匹配上下文对象(参阅1326,在此示例中将“deliverToTarget”指定为“oneMatch”属性值的属性值),并且如果具有多个匹配,则存在错误条件(参阅1327,在此示例中将"signalError"指定为"multipleMatches,,属性的值)。方块520-595的逻辑指定由优选实施例实现的选项,用于根据这些“匹配”相关的属性中的一个相应属性中指定的属性值处理fanOut语句。根据各优选实施例,这些处理选项的前四个(即,由方块520-555表示)可以用作关联谓词的三个匹配相关的属性中任何一个的属性值;“createNewTarget”选项只能用作“noMatches”属性的属性值;“deIiverToTarget,,选项只能用作“oneMatch,,属性的属性值;以及这些处理选项的最后两个(即,由方块580-595表示)只能用作“multipleMatches”属性的属性值。现在将描述根据优选实施例的对应于每个属性值的处理。方块520测试此fanOut语句是否应忽略当前处理的事件(即,在方块510处确定的适用属性值是否为“ignore”)。如果是,则跳过此fanOut语句的嵌套语句,并且处理继续到跟在此fanOut语句之后的下一语句,如在方块525处所述,并且因此图5中的处理退出ο否则,处理在方块530继续,方块530测试是否应发信号通知错误(即,在方块510处确定的适用属性值是否为“signalError”)。如果是,则方块535包括发送错误报告事件。此错误报告事件优选地包裹当前处理的入站事件,并被登台以便在提交当前事务时发送。将跳过此fanOut语句嵌套的语句。然后处理继续到跟在此fanOut语句之后的下一语句,并且因此图5中的处理退出。当适用的属性值不是“ignore”或“signalError”时,处理到达方块540。然后方块540测试适用的属性值是否为“rollBack”。如果是,则方块545包括回滚针对当前处理的事件启动的事务,以便撤消此事件对执行上下文的任何影响,并且将不发送任何待发送的出站事件。如果本发明的实施方式需要,则可以记录错误。然后图5中的处理退出,分支到图3以从队列中取回下一事件(如果有)。方块550测试适用的属性值是否为“rollBackAndRetry”。如果是,则方块555包括回滚针对当前处理的事件启动的事务,如上参考方块545所述。但是,并不记录错误,而是将当前处理的事件放置在重试队列中,当前处理的事件将从其中出列并再次被求值。(此重试的计时以及可以尝试的重试次数与实施方式相关。)然后图5中的处理退出,分支到图3以从队列中取回下一事件(如果有)。方块560测试方块510所确定的适用属性值是否为“creatNewTarget”。如果是,则方块565包括实例化新的上下文对象(并且优选地,为其分配默认值)并使此对象成为当前执行上下文;然后在此新目标上下文对象的上下文中执行此fanOut内嵌套的语句。要指出的是,如果此fanOut语句内嵌套的任何语句指定“currentKey()”函数,则优选实施例将调用此函数以返回新的唯一键并将此键值分配给新上下文对象的键空位。然后图5中的处理退出。方块570测试适用的属性值是否为“deliverToTarget”。如果是,则方块575包括将当前处理的事件传送到(单个)匹配执行上下文,以便在其中通过执行此fanOut嵌套的语句来处理事件。然后图5中的处理退出。方块580测试适用的属性值是否为“deliverToAny”。如果是,则方块585包括将当前处理的事件传送到任何(单个)匹配执行上下文,以便在其中通过执行此fanOut嵌套的语句来处理事件。用于从一组匹配执行上下文选择此执行上下文的方式与实施方式相关。然后图5中的处理退出。最后,方块590测试适用的属性值是否为“deliverToAll”。如果是,则方块595包括将当前处理的事件传送到所有匹配执行上下文,以便在其中通过执行此fanOut嵌套的语句来处理事件。然后图5中的处理退出。图6A-6D提供了示出当分别实施assign、emit、branch和terminate语句时可以使用的逻辑的流程图,如现在描述的那样。接下来参考图6A,现在将更详细地描述assign语句的处理。在方块600,通过对其“value”表达式求值并将此求值的结果分配给“target”表达式引用的空位来处理assign语句。例如,参阅图13中1394处的assign语句的value表达式1396和target表达式1395。根据各优选实施例,对target表达式求值以标识定义完善的当前上下文对象空位或要发送的出站事件的有效负载空位,并且分配将使用在assign语句的value属性中指定的表达式覆盖此空位的任何先前存在的值。(为了向序列中添加项目,可以将value表达式指定为现有空位值和要添加的值的并集。)然后图6A中的处理退出。现在将参考图6B更详细地描述emit语句的处理。在方块610,通过对其通常导致创建文档片段(根据优选实施例,为XML文档片段)的“event”表达式求值并将此文档片段发送到事件总线(当提交当前工作单位时,将随后从该总线发送此文档片段)来处理emit语句。图13中未示出emit语句。将文档片段发送到事件总线之后,图6B中的处理退出。现在将参考图6C更详细地描述branch语句的处理。在方块620,通过对其“condition”表达式求值来处理branch语句。优选地,使用XPath表示法指定此condition表达式。例如,参阅图13的1331处的condition属性。如果条件的求值结果为false,则执行继续到跟在branch语句之后的下一语句;否则(包括不存在条件的情况,优选实施例将其视为无条件的分支),执行在由branch语句标识的语句处继续。在一种方法中,使用"distance"属性标识此语句。在另一种方法中,使用“macro”属性标识此语句。在第三种方法中,既不指定“distance”属性也不指定“macro”属性。现在将更详细地描述这些方法中的每一种方法。当存在distance属性时,如图13的1332处所示,执行按照指示的语句号进行分支。distance属性的值可以是正的或负的。为1的distance值只是在下一顺序语句处继续执行。在各优选实施例中,如果distance属性的值指示在最近的封闭onEvent或fanOut块外部的语句,则如同未指定distance或macro属性那样执行branch语句(如下所述)。当存在macro属性时,如同将由macro属性(优选地引用〈macro〉元素标识符)的值标识的语句插入行中取代branch语句那样继续执行。当既未指定distance属性也未指定macro属性时,如果采用分支,则branch语句离开当前onEvent或fanOut块。如果当前块为onEvent语句,则通过处理此Ice程序中的下一onEvent块继续执行。如果当前块为fanOut语句,则通过以下方式继续执行在下一目标上下文对象的上下文中重新执行fanOut块内的语句,或者当没有其他匹配目标上下文对象时,处理Ice程序中的下一语句。根据各优选实施例,同时指定distance属性和macro属性是错误条件。按如上所述处理branch语句之后,图6C中的处理然后退出。现在将参考图6D更详细地描述terminate语句的处理。在方块630,terminate语句的处理包括终止当前上下文对象,由此从此容器中删除当前上下文对象。处理然后从图6D中退出。本发明的各实施例可以与第一相关申请和第二相关申请(以下为“相关发明”)中披露的发明的各实施例结合使用。相应地,现在将讨论相关发明以提供有关此结合使用的fn息ο现在参考图7,示出了可由本发明和相关发明的各方面执行的处理的高级视图。如图中所示,将监视模型700(作为在此描述的高级编程模型的一个示例)作为输入提供给编译器720。优选地,此编译器720根据相关发明的一个方面生成代码,其中所生成的代码包括采用根据本发明的一个方面在此披露的编程语言的指令。此生成的代码在图7中示为“Ice”文件740。出于调试目的,编译器720还优选地生成将Ice文件740中的语句与监视模型700中的源语句关联的交叉引用文件760。根据相关发明的一个方面,除了监视模型700之外,Ice文件740和交叉引用文件760还用作到调试器780的输入。(当指由编译器720创建的可执行文件740时,术语“编译后的输出,,和“所生成的输出,,在此可互换地使用)。作为一种备选方案,Ice文件740可以在不提供其调试的情况下,在此处披露的虚拟机上执行;在此备选执行情况中,并不严格需要交叉引用文件760。优选地使用XML表示法指定监视模型700、Ice文件740和交叉引用文件760。虽然未在图7中示出,但是用于监视模型700的XML模式可以作为额外输入被提供给编译器720,由此使相关发明的一个方面的编译器720能够在编译过程中验证监视模型700(即,输入)的语法结构。此外,编译器720还可以针对Ice文件740使用XML模式而针对交叉引用文件760使用另一模式,其中这些模式(也未在图7中示出)指定Ice文档740和交叉引用文件760的允许的语法和结构,并且因此可以用于提供编译器输出的特定级别的结构验证。第一相关申请的图3-5分别提供了监视模型、编译器输出文件和交叉引用文件的示例,以描述可如何在监视模型编程环境中使用Ice程序(并且在这些示例中,监视模型对应于简单的成本聚合器情况)。第一相关申请的图4中示出的编译器输出文件(由编译第一相关申请的图3中示出的监视模型产生)使用在此定义的编程语言并且可以在此处披露的虚拟机上执行。在此重复对第一相关申请中的这些图的讨论,其中这些图显示为图14-16。但是,如上所述,在此披露的虚拟机可用于从多种类型的高级语言编程模型编译的可执行体。相应地,除了支持第一相关申请的图4(在此重复为图15)中示出的可执行体之外,此虚拟机还可以支持从其他或不同的编程模型编译的可执行体。现在将参考本申请的图8-13描述用于一个此类备选编程模型的示例可执行体。图8-13分别提供了状态机模型、事件类型规范、事件、上下文对象类型规范、上下文对象以及用于状态机执行的Ice程序的示例。图13中的Ice程序1300可以由来自图8中的模型的编译器生成。更具体地说,状态机模型和事件类型规范包括编译器输入,而上下文对象规范和Ice程序包括编译器输出。(备选地,可以手动定义状态机的Ice实施方式,虽然使用编译器生成Ice可执行体被认为是更典型的情况。首先参考图8,示例模型800定义了用于门的有限状态机。此门具有两种状态,已打开(参阅810)和已关闭(参阅830)。0pen_d00r事件(参阅820)导致从已关闭状态转变为已打开状态。cl0Se_d00r事件(参阅821)导致从已打开状态转变为已关闭状态。图9的模式900中示出的事件类型规范描述了open_door和close_door事件的类型(即,结构)。在此示例中,这两个事件具有相同的类型,即“tns:D00rEvent”;参阅920。(扩展“tns”的名称空间定义时,类型为{http://www.example,org/surveillance}DoorEvent;参阅910,其中定义了“tns”名称空间。)DoorEvent类型定义(参阅930)针对此类型附带的事件的有效负载定义了两个属性,即“id”属性931和“timestamp”属性932。id属性的值标识被打开或关闭的门,timestamp属性的值指示何时发生此事件。图10中示出的示例open_door事件1000指示标识符为“DoorOOl”(参阅1010)的门在2008-01-01T09:33:41+05:00(参阅1020)时被打开。图11示出了用于Ice执行环境中表示图8的状态机800的上下文对象的示例类型定义1100。虽然此特定示例被手动创建,但是备选地可以由图8的状态机定义800以及图9的900处示出的事件类型定义中的编译器生成。在此示例中,用于上下文对象类型的示例模式1100包括用于使用<xs:include〉语句1110的门事件类型的模式900。参阅“schemaLocation”属性,它将位置“doorEvent.xsd”处的doorEvent模式定义指定为其值。然后模式1100定义上下文对象的根元素(参阅1120,其中根元素被指定为具有名称“stateMachine”),其类型被给定为复杂类型定义。参阅其中引用此复杂类型定义的1122以及其中定义此复杂类型定义的1130。在此示例中,类型定义1130指定此类型的每个上下文对象具有以下结构“」Ce_key”元素1131,它将保存对象的所生成的唯一标识符;“id”元素1132,它将保存其状态被此上下文对象镜像的门的标识符;“state”元素1133,它保存状态机的当前状态;“lastEvent”元素1134,它保存由此上下文对象处理的上一个事件的时间戳;以及“tns:0pen_d00r”空位1135和“close—door”空位1136,它们将保存状态机已处理的对应类型的上一个事件的副本。还指定了状态机模型的可能状态(在此示例中,即状态“已打开”1141和“已关闭”1142)的枚举类型1140。现在参考图12,其中示出的示例上下文对象1200是图11中定义的stateMachine元素的实例。在此示例中,在1210处示出此对象的已生成键(用作唯一标识符)。此示例上下文对象1200处理来自标识符为“DoorOOl”(参阅1220)并且当前状态为已打开(参阅1230)的门的事件,并且在1240处示出的时间戳表示的时间处理此上下文对象的上一个事件。分别在空位1250和1260中示出所处理的上一个open_door和close_door事件的副本。图13示出了实现图8的状态机800的Ice程序1300,该程序处理具有图9的900处定义的类型的事件并且操作具有图11中定义的类型的上下文对象。现在描述根据该示例Ice程序1300的处理。当具有根兀素“{http://www.example,org/surveillance}open_door"(或等价地为“访8:叩611_(1001·”)的事件到达,并且具有非空“id”属性(即,过滤器属性1314的值"fn:exists(.Γ'id)”为true)时,则满足<iceonEvent>语句1310的过滤准则。参阅图13的1312,其中指定所需的rootElement值1313和过滤器1314。因此,将执行onEvent元素1310中的所有从属语句。(要指出的是,上下文项目表达式‘.’用于指代当前事件的根。相应地,语法“fn:eXistS(.Γid)”测试“id”属性是否在当前事件的根级别处存在。相比之下,根据优选实施例,未以‘.,开始的相对路径表达式从上下文对象根开始导航。)第一嵌套语句为<ice:fan0ut>1320。此fanOut语句1320标识虚拟机容器中目标上下文对象的根元素(即,{http//www.example,org/surveillance}stateMachine;参阅1323)并指定关联谓词1324。关联谓词1324将入站事件的门标识符(如correlationPredicate属性左侧处的语法“./"id”所示)与上下文对象的id(即,‘‘{http://www.example,org/surveillance}id”或等价地为‘‘tns:id”,如correlationPredicate属性右侧处所指定的)进行比较。no/one/multiplematches属性1325-1327指示当找到与所述关联谓词匹配的零个/一个/许多上下文对象时要采取的操作,如上面参考图5所述。当没有与所述关联谓词匹配的现有上下文对象时,将根据1325处“noMatches”属性的“createNewTarget”值创建新的上下文对象并且该上下文对象变为后续步骤的执行上下文。由于新创建的上下文对象未被初始化(因此不包含键),因此不采用在1330处指定的分支。实际上,将执行之后的语句1340,该语句为新的上下文对象分配键。赋值语句1350然后执行并设置所述上下文对象的“tns:id”或“{http://www.example,org/surveillance}id”值。在该示例中,id值被设为来自入站事件的id属性值(如赋值语句1350的值属性上的表达式“.Γid”所指示的)。赋值语句1360然后执行并将入站operudoor事件复制至Ij上下文对象中的{http://www.example,org/surveillance}open_door空位。赋值语句1370然后将上下文对象中包含时间戳(参阅图12的1240)的{http://www.example,org/surveillance}IastEvent值设为该当前处理的open_door事件上的事件时间戳的值。最后,赋值语句1380将上下文对象的当前状态设为“Opened”。如果所讨论的门的上下文对象确实存在,则1324处的关联谓词针对此对象的求值结果为true,该对象将变为onEvent指定1310中的所有后续语句的执行上下文,以便根据1326处的“oneMatch”属性的“deliverToTarget”值处理该open_door事件。在此情况中,1330处的分支条件的求值结果为true,因此采用此分支,从而导致跳过赋值语句1340和1350。语句1360-1380如刚才所述的那样执行。当具有根兀素“{http://www.example,org/surveillance}close_door"(或等价地为“tns:cl0se_d00r”)的事件到达,并且具有非空“id”属性(即,过滤器属性1393的值"fn:exists(./"id)”为true)时,则满足(第二)<iceonEvent〉语句1390的过滤准则。参阅图13的1391,其中指定所需的rootElement值1392和过滤器1393。该<iceonEvent〉块的嵌套语句类似于刚才针对块1310描述的嵌套语句。最后一个赋值语句1394将状态机的状态设为“Closed”。要指出的是,图8中的状态机800的更复杂实现将在进行转变之前测试初始状态(即,例如在当前状态为“Closed”的情况下仅处理operudoor事件)。为了简洁,Ice程序1300中省略了这些测试。图13的实例中未示出可能由编译器生成的若干语句。如先前针对此处定义的编程语言指令所述的,这些指令包括用于指定要发送出站事件的<emit>语句,以及用于指定应终止当前上下文对象的〈terminate〉指令。在不偏离本发明范围的情况下,本发明的实现可以支持附加和/或其他指令。如上所述,除了或代替执行根据图8的状态机模型800编译的Ice程序,此处所披露的虚拟机还可用于执行根据其他高级编程模型编译的程序。第一相关申请的图3-5分别提供了监视模型、编译器输出文件和交叉引用文件的示例。针对本发明作为图14-16而重复这些图并且现在介绍这些图以说明如何使用Ice程序在此处所披露的虚拟机上执行监视模型。首先参考图14,现在描述图中使用的语法以提供对该示例监视模型1400的理解。<inboundEvent>元素定义实例化模型的事件入口点,并指定要在此入口点处接收的入站事件的详细信息。嵌套的〈filter〉元素可以用于指定入站事件必须满足的特定准则,不与此指定匹配的事件将被忽略。嵌套的〈correlationPredicate〉元素可以用于将通过过滤准则的每个入站事件与其中处理所述事件的适当监视上下文(多个)进行关联。可以指定与关联谓词有关的属性,从而指示(例如)在未出现任何匹配时要执行何种操作、在仅有一个匹配时要执行何种操作,以及当存在多个匹配时要执行何种操作。<outboundEvent>元素定义发出特定事件所经过的事件出口点。嵌套的〈filter〉元素可以用于过滤出应抑制其发出的事件。可以将一个或多个键值与监视上下文一起使用,以实现从特定监视上下文定义实例化多个上下文实例。所述键值使能区分多个实例。〈metric〉元素指定监视上下文中存在的数据值的键入空位。它还可以指定用于如何初始化和更新该值的处理指令。(在监视模型上下文中,metric(度量)指数据值)。可以使用建立数据更新模型的映射来指定度量更新指令(在监视模型上下文中,“map(映射)”是在一个或多个输入元素以及一个或多个输出元素之间定义的关系)。可以在其他元素定义中引用度量,从而指示在运行时对条件求值或更新其他度量中使用该度量的值。〈counter〉元素定义要在监视上下文中使用的计数器。所述计数器可以被递增、递减、设为零以及在其他元素定义中引用。〈trigger〉元素用作当满足特定准则时应采取的一个或多个操作的启动器。在监视上下文中满足这些准则时,触发器被称为“启动”。这可能会影响其他触发器、映射或模型中的其他实体。一般而言,监视上下文中触发器的作用与入站事件的触发器的作用相同或相似。因此,可以将其视为用于发信号通知监视应用所发现的特定条件的“内部事件”。〈stopwatch〉元素定义在监视上下文中用于表示已过去的时间的值。可以开始、停止、复位和在其他元素定义中引用所述st0pWatch(计时器)。<map>元素可以是〈metric〉或<outboundEvent>元素的子元素,并且定义具有一个或多个输入空位以及一个或多个输出空位的映射。每个输入空位对应于度量或对应于其他类型的承载数据值的实体。映射的输出空位还连接到度量或其他类型的可以接收一个或多个数据值的实体。映射指定某种使用输入空位中的值计算输出值(多个)以及将输出值(多个)写入输入空位(多个)的算法。<map>元素可以包含指定何时执行映射的〈trigger〉元素以及指定如何设置输出空位的值的〈assignment〉元素。监视应用可以确保如果映射的输入空位因任何原因而发生改变,则重新计算映射并更新输出空位。(根据各优选实施例,用于生成此类级联更新的编译器算法使用递归,下面将参考图18进行更详细的介绍)。入站事件导致在监视应用处执行一个或多个操作。模型内部的触发器也可以自发地调用操作。例如,可以将〈stopwatch〉元素与被定期求值的触发条件中的时限进行比较;当超过所述时限时,将激活触发器并调用操作,这与任何外部事件无关。可以响应于模型的操作而使用值填充出站事件,并将所述出站事件发送到事件总线(假设满足任何过滤准则)。实现可以支持额外和/或其他元素和属性而不偏离相关发明的范围。现在返回图14-16的示例成本聚合器,在该示例中,成本聚合器是监听物品成本事件或消息的监视器。这些事件带有订单编号、物品编号以及该物品的成本数字。(另参阅图17,该图提供了可用于描述成本聚合器实例的数据结构的示例模式1700)。由成本聚合器处理的事件可以在填写订单时例如报告物品的利用率。当具有给定订单编号的第一物品成本事件到达时,将创建新的成本聚合器实例并使用该订单编号对其进行初始化。该成本聚合器的运输成本被设为默认值29.75$并且其物品成本(其是单个物品的成本数字的合计)被初始化为0。然后将入站事件中报告的物品成本与所述物品成本相加,并且作为物品成本与运输成本的和来计算总成本。同一订单的后续事件将被传送到同一聚合器,并且对于这些后续事件,跳过初始化阶段将仅更新物品成本值和总成本值。图14的示例监视模型1400指定一种入站事件作为该成本聚合器感兴趣的事件。参阅标号1410处的〈inboimdEvent〉指定。如其中所指定的,该事件的标识符(“id”)为AcostRport。该事件的关联器语法1412指定如果在对所有现有实例的关联谓词求值之后,找不到具有指定rootElement和extensionName的入站事件的任何匹配监视上下文,贝Ij创建新的上下文,但是如果有一个监视上下文与该事件匹配,则将该事件发送到匹配的监视上下文;另一方面,如果有多个监视上下文与该事件匹配,则表示存在错误并生成异常。1414处的correlationPredicate表达式指定如何判定监视上下文是否与该事件匹配,在该示例中,将入站事件中的“orderNumber”值与当前活动的监视上下文的“orderNum”度量进行比较。该示例成本聚合器的每个实例都具有4个度量,它们在1420、1430、1440和1450处定义。第一度量1420是“OrderNum”。度量定义1420指定“costR印ort”入站事件1410的扩展数据部分中的“orderNumber”值用于设置该OrderNum度量。度量定义1430与“shippingCost”度量有关,在该示例中,该度量定义指定在初始化时将默认值$29.75赋给shippingCost度量。度量定义1440指定使用指定条件逻辑的映射处理成本聚合器的“totalCost”度量。如其中所述,如果当前监视上下文中存在“itemCost”值,则将该值与运输成本(S卩,shippingCost度量)相加并用于设置监视上下文中的totalCost空位或度量;否则,单独使用运输成本设置totalCost度量。最后,度量定义1450与“itemCost”度量相关。该定义1450提供映射和默认值指定。所述映射指定将itemCost度量递增“costR印ort”入站事件的扩展数据部分中的“cost”值,并且结果用作监视上下文中的itemCost空位的输出值。默认值指定itemCost在初始化时被设为“0.0”。根据相关发明的一个方面,生成图15的编译器输出文件1500以作为与图14的声明式监视模型1400对应的顺序排序可执行体。在该示例中,生成单个〈onEvent〉元素1510(其使用名称空间前缀“ice”,从而在图15中示为<iceonEvent,并且该元素与图14的单个入站事件入口点1410对应。一般情况下,〈onEvent〉元素指定入站事件订阅,并且可以包括“filter”属性和/或〈fanOut〉子元素。“filter”属性捕获针对监视模型中的该入站事件指定的过滤准则(如果有)。针对图14中的示例模型生成的过滤属性将测试入站事件的根元素为“cbeCommonBaseEvent”,并且具有值为“IteportItemCost,,的"extensionName”属性。这些条件对应于<inboundEvent>元素1410中的rootElement禾口extensionName指定。<fan0ut>元素1511提供事件关联、封装(在该示例中)在与图14的1412和1414处的关联器语法对应的1512处的语法,以及与处理〈onEvent〉元素1510的入站事件相关的所有步骤的元素1520-1590。〈fanOut〉元素使能从当前上下文对象(或者,在开始处理事件时,没有任何上下文对象)到一个或多个目标上下文对象的上下文切换。1512处的关联器语法指示针对所有活动上下文对象的关联谓词求值时发现的各种匹配应执行何种操作。1514处的语法与图14的1414处的关联谓词对应,并且指示将入站事件中的“orderNumer”值与当前上下文对象的“orderNum”空位进行比较以判定是否存在匹配(或多个匹配)。在该示例中,编译器还将1414中引用的事件字段的简化语法“costR印ort/extendedData/orderNumber”转换成访问1514中的该字段所需的实际XPath。在1520处生成〈branch〉语句,并且测试对于匹配的上下文对象是否已存在键值。如果是,则已创建和初始化上下文对象,并且分支语句指示控制应在运行时向前跳5步(距离“5”)。生成分支语句以向前跳5步可以避免执行在1530-1560处生成的初始化步骤。否贝U,如果尚不存在键值,则在运行时不采用分支并且执行下一顺序步骤1530。一般情况下,〈branch〉语句提供将控制有条件的转移到程序中的先前的步骤或以后的步骤(并且可以针对距离属性使用负值以将控制转移到先前的步骤)。生成包括1530-1590处的语法的若干〈assign〉语句,所述语句在此可以等价地称为“赋值”语句。一般情况下,〈assign〉语句指定对当前监视上下文中空位的赋值或对出站事件的赋值。赋值语句1530初始化当前监视上下文实例的键值,并且赋值语句1540将该实例中的shippingCost度量初始化为“29.75”。赋值语句1550将该实例中的itemCost度量初始化为“0.0”,以及赋值语句1560执行上面参考监视模型中的度量定义1440的映射中指定的语法介绍的相同的条件处理。这完成了一系列初始化步骤,在采用分支1520的情况下可以跳过这些步骤。赋值语句1570将orderNum度量设为入站事件中的orderNumer值,并且与监视模型内的度量定义1420中的映射对应。赋值语句1580如上面针对度量定义1450中的映射所述计算itemCost度量的值,并且赋值语句1590如上面针对度量定义1440中的映射所述设置totalCost度量。要指出的是,在该示例中,赋值语句1590与赋值语句1560完全相同。出现这种情况是因为totalCost度量的映射取决于两个输入,即itemCost和shippingCost。编译器识别到在初始化期间设置了这些度量,因此在1560处生成代码以考虑由这些初始化造成的任何下游效应。编译器还识别到通过在1580处执行代码动态地更新itemCost度量,因而生成另一赋值语句1590以考虑动态更新。这示出了相关发明的一个方面的编译器如何在分析数据相关性之后将监视模型的声明式逻辑转换成一系列正确的赋值语句。通过将编译器输出文件1500与编译器输入文件(即,监视模型1400)进行比较,可以看出这些相关文件内语句的排序非常不同,并且使用传统调试器对编译器输出文件1500进行单步调试的用户可能在尝试确定某个时刻正在执行源代码的哪个部分时感到困惑。(此外,如果生成运行时错误,甚至更难在正常执行期间确定错误源)。因此,相关发明的一个方面提供了交叉引用文件作为附加编译器输出并使用该文件作为附加调试器输入(如图7所示和上面所述)。该交叉引用文件的示例版本在图16的1600处示出,并且现在进行介绍。文件1600在图14的监视模型(编译器输入)1400与图15的编译器输出文件之间进行交叉引用。这些文件1400、1500被识别为1611(使用mmResource属性识别监视模型)和1610(使用iceResource属性识别编译器输出文件)处的交叉引用文件的主题。要指出的是,该交叉引用文件中的关系可以是一对多,因为监视模型中的单个元素会引起编译器输出文件中的多个步骤。针对输入监视模型中的每个操作(例如,执行映射,停止计时器,递增计数器等)在文件1600中生成<mmSt印〉元素。例如,参阅<mmSt印〉元素1620。每个<mmSt印〉元素都标识来自源代码的模型元素以及编译器输出文件的相应语句(多个)。使用公知的XPath表示法的变型将源代码中定义操作的模型元素标识为<mmSt印〉元素内的mmRef属性的值。因此,例如,1630处的mmRef属性标识文件1400的模型元素1410,以及1640处的mmRef属性标识文件1400的<map>元素1421。通过这种方式,交叉引用文件遍历监视模型1400的元素。使用类似XPath的表示法在交叉引用文件中将文件1500内的Ice语句标识为iceRefs属性的值。例如,1621处的iceRefs属性标识编译器输出文件1500的语句1510、1511、1520、1530、1540、1550和1560,生成所有这些语句来描述通过mmRef属性1630引用的<inboundEvent>1410的作用,并且1650处的iceRefs属性标识1590处的〈assign〉语句(即,在图16中使用基于零的计数的序数“6”标识的嵌套〈fanOut〉内生成的第七个赋值语句)。要指出的是,使用标号1622标识的语法包括单个<mmSt印〉元素。这是因为其中引用的分支语句和赋值语句都是作为图14的1410处定义的入站事件订阅(该定义继续到标号1419)的结果产生的。图18示出了由相关发明的一个方面使用的用于针对监视模型生成Ice语言的编译器算法,现在将详细进行介绍。所述编译器算法从模型获取入站事件定义(事件订阅)(方块1800),方块1805测试是否找到此类定义。如果找到,则在方块1810生成onEvent语句(表示事件订阅,带有过滤条件)、fanOut语句(表示关联逻辑),以及上下文初始化语句,从而生成与图15中的语句1510-1560类似的逻辑。接下来,该编译器的优选实施例从没有触发器控制介入的情况下发生的事件中找到所有下游效应(例如,在一个实施例中,所有事件驱动型计时器和计数器命令以及所有直接和间接的度量更新)。可以通过将某些计算值分配给表示执行上下文(即,监视上下文)的对象中的空位来实现所有这些效应。相应地,方块1815针对每个事件驱动型计时器命令和每个计数器命令生成一个赋值语句(或相应地生成多个赋值语句),并且方块1820针对每个直接或间接的度量更新生成一个赋值语句(或相应地生成多个赋值语句)。值得注意的是,在考虑依赖性的情况下生成这些赋值语句。例如,如果到metircl的映射依赖于metirc2,并且作为入站事件的结果更新这两个度量,则生成赋值以确保在更新metricl之前更新metric^。由于在监视模型中禁止循环依赖性,因此在确定赋值语句顺序中考虑数据依赖性不会导致矛盾(或死锁)并且生成这些级联更新将在有限数量的步骤之后结束。接下来,该编译器的优选实施例从没有触发器控制介入的情况下发生的事件中找到所有下游效应(例如,在一个实施例中,所有事件驱动型计时器和计数器命令以及所有直接和间接的度量更新)。可以通过将某些计算值分配给表示执行上下文(即,监视上下文)的对象中的空位来实现所有这些效应。相应地,方块1815针对每个事件驱动型计时器命令和每个计数器命令生成一个赋值语句(或相应地生成多个赋值语句),并且方块1820针对每个直接或间接的度量更新生成一个赋值语句(或相应地生成多个赋值语句)。值得注意的是,在考虑依赖性的情况下生成这些赋值语句。例如,如果到metircl的映射依赖于metirc2,并且作为入站事件的结果更新这两个度量,则生成赋值以确保在更新metricl之前更新metric^。由于在监视模型中禁止循环依赖性,因此在确定赋值语句顺序中考虑数据依赖性不会导致矛盾(或死锁)并且生成这些级联更新将在有限数量的步骤之后结束。图18B示出了对触发器的处理,类似于图18A中的入站事件处理。在图18B的方块1850,编译器算法从模型获取“待求值”触发器的定义。在方块1855生成测试触发器的开启条件并在得出false结果之后跳过后续语句的分支语句。该编译器的优选实施例然后找到该触发器的所有下游效应,其中包括可能作为该触发器启动的结果而发生的所有触发器驱动型计时器和计数器命令(如果输入模型中具有此类元素)以及所有直接和间接的度量更新。可以通过将某些计算值分配给表示执行上下文(即,监视上下文)的对象中的空位来实现所有这些效应。因此,方块I860针对每个触发器驱动型计时器命令和每个计数器命令生成一个赋值语句(或相应地生成多个赋值语句),并且方块1865针对每个直接或间接的度量更新生成一个赋值语句(或相应地生成多个赋值语句)。如上参考方块1820所述,在考虑依赖性的情况下生成在方块1865处生成的赋值语句。在方块1870,生成将启动当前待发出的任何出站事件的代码。方块1875生成代码以对作为执行先前生成的任何语句的结果而变为待求值的任何触发器求值,并在需要时启动这些触发器,从而递归地调用图18B中的逻辑。(此递归会结束,因为仅存在有限数量的触发器定义数并且它们的依赖性图没有循环)。最后,方块1880生成将终止当前待终止的任何监视上下文的代码。要指出的是,在同时启动若干触发器的情况下,未定义处理触发器的运行时顺序。可以将此视为竞争条件,并且如果同时接收到若干入站事件,将出现类似竞争条件。如果根据特定模型处理两个同时到达的事件的结果取决于处理所述事件的顺序,则该模型为有设计问题的模型。类似地,如果对两个同时启动的触发器执行触发器处理的结果取决于执行其效应的顺序,则该模型为有设计问题的模型。(希望在监视模型编辑器中检测到此类问题并提示用户相应地修改模型)。因此,对于事件/触发器驱动型编程模型而言,可能在方块1830和1875处出现的明显“任意性”是自然的,并且实际上是所期望的。通过比较图18A和18B可以看到,生成表示图18B中触发器效应的语句时所遵循的逻辑与图18A中针对入站事件示出的逻辑相同针对触发器驱动型计时器和计数器更新、直接和间接的度量更新、出站事件的发出、其他触发器的求值(如果先前触发器或其引起的任何更新导致此类求值)生成语句,最后针对上下文终止生成语句(如有必要)。如上所述,编译器B除了产生Ice输出文件B中的执行顺序以外,还产生将所生成的编译器输出中的每个步骤与来自原始监视模型指定的入站事件订阅、映射、计数器或计时器命令、触发器定义或出站事件定义进行关联的交叉引用文件。当用户以单步模式执行步骤时,这些交叉引用可以由第二相关申请的调试器使用,以便亮显从其产生所生成的编译器输出的这些步骤的原始模型结构。相应地,在方块1810-1835和1855-1880中的每个方块处,所述编译器优选地将语法写入交叉引用文件以记录监视模型输入文件与所生成的编译器输出文件之间的关系。该语法已在图16中示出并且上面参考该图以及图14-15进行了介绍。(要指出的是,编译器针对图15所示的输出文件和图16所示的交叉引用文件生成了各种“内务处理”型语法,例如名称空间定义、或“xmlns”,出现在这些文件开头的语句。本领域的技术人员很容易理解此类语法,并且对理解本发明或相关发明而言,不认为对此类语法的说明是必需的)。图19提供了根据本发明一个方面的优选实施例的示例模式1900。(此示例模式的提供仅作为说明而非限制)。本领域的技术人员将理解,本发明的实施例可以提供为(例如)方法、系统和/或计算机程序产品。本发明可以采取完全硬件实施例、完全软件实施例,或同时包含硬件和软件元素的实施例的形式。在一个优选实施例中,本发明以软件实现,所述软件包括(但不限于)固件、驻留软件、微代码等。在硬件实施例中,可以提供执行此处所述的功能的专用或专门电路。此外,本发明可以采取位于其中包含计算机可用程序代码的一个或多个计算机可用存储介质(包括但不限于盘存储设备、CD-ROM、光存储设备等)上的计算机程序产品的形式,其中所述计算机程序产品可以被计算机或任何指令执行系统使用或与计算机或任何指令执行系统结合。出于在此说明的目的,计算机可用或计算机可读介质可以是任何能够包含、存储、传送、传播或传输由指令执行系统、装置或设备使用或与所述指令执行系统、装置或设备结合的程序的装置。所述介质可以是电、磁、光、电磁、红外线或半导体系统(或装置或设备)或传播介质。计算机可读介质的示例包括半导体或固态存储器、磁带、可移动计算机盘、随机存取存储器(_RAM_)、只读存储器(_R0M_)、硬磁盘和光盘。光盘的当前实例包括光盘-只读存储器(_CD-R0M_)、光盘-读/写(_CR-R/W_)和DVD。现在参考图20,适于存储和/或执行程序代码的数据处理系统2000包括至少一个直接或通过系统总线2014间接连接到存储器元件的处理器2012。所述存储器元件可以包括在程序代码的实际执行期间采用的本地存储器2028、大容量存储设备2030以及提供至少某些程序代码的临时存储以减少必须在执行期间从大容量存储设备检索代码的次数的高速缓冲存储器(未示出)。输入/输出(_1/0_)设备(包括但不限于键盘2018、显示器2024、指点设备2020,其他接口设备2022等)可以直接或通过中间I/O控制器或适配器(2016、2026)与系统相连。网络适配器也可以被连接到系统以使所述数据处理系统能够通过中间专用或公共网络(如总体在2032处所示)变得与其他数据处理系统或远程打印机或存储设备相连。调制解调器、电缆调制解调器、无线适配器和以太网卡只是当前可用类型的网络适配器中的少数几种。图21示出了其中可实现本发明的数据处理网络环境2100。数据处理网络2100可以包括多个诸如无线网络2142和网络2144之类的单独网络。多个无线设备2110可以通过无线网络2142进行通信,并且在图中(通过例示)被示为工作站2111的多个有线设备可以通过网络2114进行通信。此外,本领域的技术人员将理解,可以包括一个或多个局域网(_LAN_)(未示出),其中局域网可以包括多个与主机处理器相连的设备。仍参考图21,网络2142和2144还可以包括诸如网关计算机2146或应用服务器2147之类的大型计算机或服务器(它们可以访问数据存储库2148)。网关计算机2146充当进入每个网络(例如网络2144)的入口点。网关计算机2146可以优选地通过通信链路2150a与另一网络2142相连。网关2146还可以使用通信链路2150b、2150c与一个或多个工作站2111直接相连,以及/或者与此类设备间接相连。网关计算机2146可以使用IBM的EnterpriseSystemArchitecture/39_computer来实现。根据应用的不同,可以采用诸如ApplicationSystem/400_(也称为AS/400_)、iSeries7、SystemiJ之类的中型计算机。(—EnterpriseSystemArchitecture/39_、“ApplicationSystem/400”、“AS/400”以及“iSeries”是IBM在美国和/或其他国家/地区的注册商标,“Systemi”是IBM的商标)。网关计算机2146还可以与存储设备(诸如数据存储库2148)相连2149。本领域的技术人员将理解,网关计算机2146可以位于距离网络2142非常远的地理位置,并且类似地,无线设备2110和/或工作站2111可以分别与网络2142和2144具有一段距离。例如,网络2142可以位于加利福尼亚州,而网关2146可以位于德克萨斯州,一个或多个工作站2111可以位于佛罗里达州。无线设备2110可以使用诸如传输控制协议/网际协议(_TCP/IP_)之类的联网协议通过诸如蜂窝电话、射频网络、卫星网络之类的多个备选连接介质与无线网络2142相连。无线网络2142优选地使用诸如TCP或用户数据报协议(_UDP_)之类的网络连接2150a通过IP、X.25、帧中继、综合业务数字网(_ISDN_)、公共交换电话网(_PSTN_)等与网关2146相连。工作站2111可以使用拨号连接2150b或2150c直接连接到网关2146。进而,无线网络2142和网络2144可以使用类似于图21所示的方式与一个或多个其他网络(未示出)相连。已参考根据本发明的各实施例的流程图和/或方块图对本发明进行了描述。应该理解,所述流程图和/或方块图中的每个流程和/或方块,以及所述流程图和/或方块图中的流程和/或方块的组合可以通过计算机程序指令实现。这些计算机程序指令可以提供给通用计算机、专用计算机、嵌入式处理器或其他可编程数据处理装置的处理器以产生机器,从而使所述指令在通过所述计算机或其他可编程数据处理装置的处理器执行时,能够创建用于实现所述流程图和/或方块图中的一个或多个流程和/或方块中指定的功能的装置。这些计算机程序指令还可以存储在可引导计算机或其他可编程数据处理装置按照特定方式运行的计算机可读存储器中,以便存储在所述计算机可读存储器中的指令产生包括用于实现所述流程图和/或方块图中的一个或多个流程和/或方块中指定的功能的指令装置的制品所述计算机程序指令还可以加载到计算机或其他可编程数据处理装置上以在所述计算机或其他可编程装置上执行一系列操作步骤以生成计算机实现的过程,以便在所述计算机或其他可编程装置上执行的指令提供用于实现所述流程图和/或方块图中的一个或多个流程和/或方块中指定的功能的步骤。尽管已经描述了本发明的各实施例,但是本领域的技术人员在了解基本发明理念之后,将想到这些实施例的其他变型和修改。因此,所附权利要求旨在被理解为包括所述的实施例以及所有此类变型和修改都落入本发明的精神和范围之内。权利要求一种用于执行虚拟机的方法,包括在计算机上使用所述虚拟机执行来自程序的指令,其中所述指令包括以下指令中的至少一个事件指令,其用于接收入站事件;赋值指令,其用于分配值;分支指令,其用于有条件的转移到另一个指令;发送指令,其用于指定要发送出站事件;终止指令,其用于指定要终止当前执行上下文对象;以及扇出指令,其用于指定事件关联和启用上下文切换中的至少一个。2.如权利要求1中所述的方法,其中从事件驱动的模型规范生成所述指令。3.如权利要求1中所述的方法,其中从消息驱动的模型规范生成所述指令。4.如权利要求1中所述的方法,还包括在所述计算机上使用所述虚拟机执行来自多个程序的指令,所述多个程序从至少两个不同的执行模型生成。5.如权利要求1中所述的方法,其中执行所述事件指令进一步包括执行所述事件指令以接收特定入站事件;查找与所述事件指令关联的扇出指令;执行所找到的扇出指令以便使用与所找到的扇出指令关联的关联谓词信息判定任何当前执行上下文对象是否能够进一步处理所述特定入站事件;以及如果有能力的执行上下文对象存在,将所述特定入站事件导向每个所确定的有能力的执行上下文对象以便在其中进行进一步处理。6.如权利要求1中所述的方法,其中用于接收入站事件的所述事件指令还过滤所述入站事件。7.如权利要求1中所述的方法,其中使用所述虚拟机执行所述指令进一步包括在接收到特定入站事件时,在来自所述程序的多个事件指令中的每个事件指令内存在类型规范的情况下,通过将所述特定入站事件声明的类型与所述多个事件指令中的每个事件指令内的类型规范相比较来确定要执行所述多个事件指令中的哪个事件指令。8.如权利要求1中所述的方法,其中执行所述赋值指令进一步包括对所述赋值指令的表达式求值;以及将所述求值的结果作为值分配给由所述赋值指令标识的目标。9.如权利要求1中所述的方法,其中执行所述分支指令进一步包括对所述分支指令的条件表达式求值;以及其中所述有条件的转移进一步包括当所述求值返回“true”结果时,接下来执行由所述分支指令的属性标识的另一个指令,否则,接下来执行所述指令中的下一顺序指令。10.如权利要求1中所述的方法,其中执行所述发送指令进一步包括将所述出站事件发送到事件总线。11.如权利要求10中所述的方法,其中执行所述发送指令进一步包括对所述发送指令中指定的表达式求值并在所述发送之前在所述出站事件中反映所述求值的结果。12.如权利要求1中所述的方法,其中执行所述终止指令进一步包括终止所述当前执行上下文对象。13.一种用于执行程序的虚拟机,包括指令执行器,其用于使用计算机执行来自所述程序的指令,其中所述指令包括以下指令中的至少一个事件指令,其用于接收入站事件;赋值指令,其用于分配值;分支指令,其用于有条件的转移到另一个指令;发送指令,其用于指定要发送出站事件;终止指令,其用于指定要终止当前执行上下文对象;以及扇出指令,其用于指定事件关联和启用上下文切换中的至少一个。14.如利权要求13中所述的虚拟机,其中从事件驱动的模型规范生成所述指令。15.如利权要求13中所述的虚拟机,其中从消息驱动的模型规范生成所述指令。16.如权利要求13中所述的虚拟机,其中所述虚拟机可用于执行多个程序,所述多个程序从至少两个不同的执行模型生成。17.如权利要求13中所述的虚拟机,其中执行所述事件指令进一步包括执行所述事件指令以接收特定入站事件;查找与所述事件指令关联的扇出指令;执行所找到的扇出指令以便使用与所找到的扇出指令关联的关联谓词信息判定任何当前执行上下文对象是否能够进一步处理所述特定入站事件;以及如果有能力的执行上下文对象存在,将所述特定入站事件导向每个所确定的有能力的执行上下文对象以便在其中进行进一步处理。18.如权利要求13中所述的虚拟机,其中用于接收入站事件的所述事件指令还过滤所述入站事件。19.如权利要求13中所述的虚拟机,其中所述虚拟机的指令执行器在接收到特定入站事件时,在来自所述程序的多个事件指令中的每个事件指令内存在类型规范的情况下,通过将所述特定入站事件声明的类型与所述多个事件指令中的每个事件指令内的类型规范相比较来确定要执行所述多个事件指令中的哪个事件指令。20.如权利要求13中所述的虚拟机,其中执行所述赋值指令进一步包括对所述赋值指令的表达式求值;以及将所述求值的结果作为值分配给由所述赋值指令标识的目标。21.如权利要求13中所述的虚拟机,其中执行所述分支指令进一步包括对所述分支指令的条件表达式求值;以及其中所述有条件的转移进一步包括当所述求值返回“true”结果时,接下来执行由所述分支指令的属性标识的另一个指令,否则,接下来执行所述指令中的下一顺序指令。22.如权利要求13中所述的虚拟机,其中执行所述发送指令进一步包括将所述出站事件发送到事件总线。23.如权利要求22中所述的虚拟机,其中执行所述发送指令进一步包括对所述发送指令中指定的表达式求值并在所述发送之前在所述出站事件中反映所述求值的结果。24.如权利要求13中所述的虚拟机,其中执行所述终止指令进一步包括终止所述当前执行上下文对象。25.一种用于执行虚拟机的计算机程序产品,其中所述计算机程序产品包含在一个或多个计算机可读介质中并且包括用于以下操作的计算机可读指令在计算机上使用所述虚拟机执行来自程序的指令,其中所述指令包括以下指令中的至少一个事件指令,其用于接收入站事件;赋值指令,其用于分配值;分支指令,其用于有条件的转移到另一个指令;发送指令,其用于指定要发送出站事件;终止指令,其用于指定要终止当前执行上下文对象;以及扇出指令,其用于指定事件关联和启用上下文切换中的至少一个。26.一种存储以编程语言编写的源代码的计算机可读介质,其中所述编程语言包括事件指令,其用于接收入站事件;赋值指令,其用于分配值;分支指令,其用于有条件的转移到另一个指令;发送指令,其用于指定要发送出站事件;终止指令,其用于指定要终止当前执行上下文对象;以及扇出指令,其用于指定事件关联和启用上下文切换中的至少一个;以及所述源代码包括所述编程语言中的多个所述指令。27.如权利要求26中所述的计算机可读介质,其中从事件驱动的模型规范生成所述源代码。28.如权利要求26中所述的计算机可读介质,其中从消息驱动的模型规范生成所述源代码。29.—种可存储在计算机可读介质中以使计算机执行的指令程序,其中所述指令包括多个以下指令事件指令,其用于接收入站事件;赋值指令,其用于分配值;分支指令,其用于有条件的转移到另一个指令;发送指令,其用于指定要发送出站事件;终止指令,其用于指定要终止当前执行上下文对象;以及扇出指令,其用于指定事件关联和启用上下文切换中的至少一个。30.如权利要求29中所述的指令程序,其中从事件驱动的模型规范生成所述指令。31.如权利要求29中所述的指令程序,其中从消息驱动的模型规范生成所述指令。全文摘要虚拟机支持编译器生成的代码的执行,并为可以与若干不同事件驱动或消息驱动的编程模型(例如状态机、用于复杂事件处理和事件关联的规则、监视上下文、过程以及调解)中的任何一个对应的代码提供执行环境。所述编程模型可以用在业务监视和/或业务集成环境中。定义编程语言以便使用所述虚拟机执行,所述编程语言包含相对较少数量的指令并且优选地由编译器从高级的事件驱动或消息驱动的模型生成。文档编号G06F9/46GK101960425SQ200980106872公开日2011年1月26日申请日期2009年2月26日优先权日2008年2月29日发明者J·法兰克,W·贾米森申请人:国际商业机器公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1