本申请要求:2002年5月10日提交的名为“进程编程语言(ProcessProgramming Language”的美国临时申请号60/379,864的优先权,该申请通过引用明确地结合于此;2002年11月22日提交的名为“进程内核(Process Kernel)”的美国专利号10/303,407的优先权,该申请通过引用明确地结合于此;2002年11月22日提交的名为“进程和作为队列中的进程的查询的集成的置换细微差别(Permutation Nuances of the Integration of Processed and Queries as Processes atQueues)”的美国专利号10/303,445的优先权,该申请通过引用明确地结合于此;2002年11月22日提交的名为“包含进程和查询的表达式的结构等价物(StructuralEquivalence of Expressions Containing Processes and Queries)”的美国专利号10/303,379的优先权,该申请通过引用明确地结合于此;2002年11月22日提交的名为“控制进程和作为进程的查询的进展的可操作语义规则(Operational SemanticsRules Governing Evolution of Processes and Queries as Processes)”的美国专利号10/303,343的优先权,该申请通过引用明确地结合于此。
具体实施方式
图2示出了用于实践本发明的某些方面,如处理依照本发明生成的查询、队列和进程,和/或执行后文描述的进程内核的合适的计算系统的一个示例。计算系统环境200仅为合适的计算环境的一个示例,并非建议对本发明的使用或功能的范围的局限。也不应将计算环境200解释为对示例性操作环境200中示出的任一组件或其组合具有依赖或需求。
本发明可以使用众多其它通用或专用计算系统环境或配置来操作。适合使用本发明的众所周知的计算系统、环境和/或配置包括但不限于:个人计算机、服务器计算机、手持式或膝上设备、多处理器系统、基于微处理器的系统、机顶盒、可编程消费者电子设备、网络PC、小型机、大型机、包括任一上述系统或设备的分布式计算环境等等。
本发明将在诸如由计算机执行的程序模块等计算机可执行指令的一般上下文环境中描述。一般而言,程序模块包括例程、程序、对象、组件、数据结构等等,执行特定的任务或实现特定的抽象数据类型。
本发明也可以在分布式计算环境中实践,其中,任务由通过通信网络连接的远程处理设备来执行。在分布式计算环境中,程序模块可以位于本地和远程计算机存储媒质中,包括存储器存储设备。
图2所示的计算系统环境包括以计算机210形式的通用计算装置。计算机210的组件包括但不限于,处理单元220、系统存储器230以及将包括系统存储器的各类系统组件耦合至处理单元220的系统总线221。系统总线221可以是若干种总线结构类型的任一种,包括存储器总线或存储器控制器、外围总线以及使用各类总线结构的局部总线。作为示例而非局限,这类结构包括工业标准体系结构(ISA)总线、微通道体系结构(MCA)总线、增强ISA(EISA)总线、视频电子技术标准协会(VESA)局部总线以及外围部件互连(PCI)总线,也称为Mezzanine总线。
计算机210通常包括各种计算机可读媒质。计算机可读媒质可以是可由计算机110访问的任一可用媒质,包括易失和非易失媒质、可移动和不可移动媒质。作为示例而非局限,计算机可读媒质包括计算机存储媒质和通信媒质。计算机存储媒质包括以用于储存诸如计算机可读指令、数据结构、程序模块或其它数据等信息的任一方法或技术实现的易失和非易失,可移动和不可移动媒质。计算机存储媒质包括但不限于,RAM、ROM、EEPROM、闪存或其它存储器技术、CD-ROM、数字多功能盘(DVD)或其它光盘存储、磁盒、磁带、磁盘存储或其它磁存储设备、或可以用来储存所期望的信息并可由计算机110访问的任一其它媒质。通信媒质通常在诸如载波或其它传输机制的已调制数据信号中包含计算机可读指令、数据结构、程序模块或其它数据,并包括任一信息传送媒质。术语“已调制数据信号”指以对信号中的信息进行编码的方式设置或改变其一个或多个特征的信号。作为示例而非局限,通信媒质包括有线媒质,如有线网络或直接连线连接,以及无线媒质,如声学、RF、红外和其它无线媒质。上述任一的组合也应当包括在计算机可读媒质的范围之内。
系统存储器230包括以易失和/或非易失存储器形式的计算机存储媒质,如只读存储器(ROM)231和随机存取存储器(RAM)232。基本输入/输出系统233(BIOS)包括如在启动时帮助在计算机210内的元件之间传输信息的基本例程,通常储存在ROM 231中。RAM 232通常包含处理单元220立即可访问或者当前正在操作的数据和/或程序模块。作为示例而非局限,图2示出了操作系统234、应用程序235、其它程序模块236和程序数据237。
计算机210也可包括其它可移动/不可移动、易失/非易失计算机存储媒质。仅作示例,图2示出了对不可移动、非易失磁媒质进行读写的硬盘驱动器241、对可移动、非易失磁盘252进行读写的磁盘驱动器251以及对可移动、非易失光盘256,如CD ROM或其它光媒质进行读写的光盘驱动器255。可以在示例性操作环境中使用的其它可移动/不可移动、易失/非易失计算机存储媒质包括但不限于,磁带盒、闪存卡、数字多功能盘、数字视频带、固态RAM、固态ROM等等。硬盘驱动器241通常通过不可移动存储器接口,如接口240连接到系统总线221,磁盘驱动器251和光盘驱动器255通常通过可移动存储器接口,如接口250连接到系统总线221。
图2讨论并示出的驱动器及其关联的计算机存储媒质为计算机210提供了计算机可读指令、数据结构、程序模块和其它数据的存储。例如,在图2中,示出硬盘驱动器241储存操作系统244、应用程序245、其它程序模块246和程序数据247。注意,这些组件可以与操作系统234、应用程序235、其它程序模块236和程序数据237相同,也可以与它们不同。这里对操作系统244、应用程序245、其它程序模块246和程序数据247给予不同的标号来说明至少它们是不同的副本。用户可以通过输入设备,如键盘262和定位设备261,后者通常指鼠标、跟踪球或触摸板,向计算机110输入命令和信息。其它输入设备(未示出)可包括麦克风、操纵杆、游戏垫、圆盘式卫星天线、扫描仪等等。这些和其它输入设备通常通过耦合至系统总线的用户输入接口260连接至处理单元220,但是也可以通过其它接口和总线结构连接,如并行端口、游戏端口或通用串行总线(USB)。监视器291或其它类型的显示设备也通过接口,如视频接口290连接至系统总线221。除监视器之外,计算机也包括其它外围输出设备,如扬声器297和打印机296,通过输入/输出外围接口295连接。
计算机210可以在使用到一个或多个远程计算机,如远程计算机280的逻辑连接的网络化环境中操作。远程计算机280可以是个人计算机、服务器、路由器、网络PC、对等设备或其它公用网络节点,并通常包括许多或所有上述与计算机210相关的元件,尽管在图2中仅示出了存储器存储设备281。图2描述的逻辑连接包括局域网(LAN)271和广域网(WAN)273,但也可包括其它网络。这类网络环境常见于办公室、企业范围计算机网络、内联网以及因特网。
当在LAN网络环境中使用时,计算机210通过网络接口或适配器270连接至LAN 271。当在WAN网络环境中使用时,计算机210通常包括调制解调器272或其它装置,用于通过WAN 273,如因特网建立通信。调制解调器272可以是内置或外置的,通过输入/输出接口295或其它合适的机制连接至系统总线221。在网络化环境中,描述的与计算机210相关的程序模块或其部分可储存在远程存储器存储设备中。作为示例而非局限,图2示出了远程应用程序285驻留在存储器设备281上。可以理解,示出的网络连接仅是示例性的,也可以使用在计算机之间建立通信链路的其它装置。
图3A示出了系统300,它是可一起工作以执行一个或多个计算任务的组成元件的集合。一个示例是硬件系统344,它可包括若干计算设备,如个人数字助理302、蜂窝电话334和台式机336,它们的每一个都包括一微处理器、其集成的芯片和电路、输入和输出设备以及外围设备(未示出)。为便于说明,随后的附图中唯一示出的计算设备是个人数字助理(PDA)。
系统300包括操作系统342,它包括一组程序和数据文件,如操作系统内核303A、一个或多个设备驱动程序303B以及进程内核302C。在下层耦合至操作系统342的是硬件抽象层301。硬件抽象层301是由程序员用于访问硬件系统344的设备(如计算设备302、蜂窝电话334和台式机336)的应用编程接口。操作系统内核303A是操作系统342的核心,它被设计成(通过硬件抽象层301)管理存储器、文件和外围设备;维护时间和日期;装入应用程序,如web服务302A;以及分配系统资源。设备驱动程序303B是准许web服务302A与诸如计算设备302等设备进行通信的单独的组件。进程内核302C将web服务302A表示为进程302B、管理进程302B并方便进程302B与其它进程的通信(下文描述)。操作系统内核303A、设备驱动程序303B以及进程内核303C驻留在操作系统342的内核模式部分中,而web服务302A和进程302B驻留在操作系统342的用户模式部分346中。可选地,当在下层耦合至诸如COM(组件对象模型)等其它系统软件组件305、307(图3B)时,进程内核303C可驻留在用户模式部分346中。
依照本发明使用的术语“进程”指具有通过执行行动来进展的能力或允许其它进程进展的一个或多个计算实体的动态表示。换言之,术语“进程”表示计算实体的二元性特性的其中之一。当计算实体休眠时,它可被检查,如通过察看程序。当计算实体移动时(作为进程),它不能被看见,但是其行为可由依照本发明形成的编程语言400来解释并核实(下文描述)。
web服务302A被设计成专用于某一服务。为获取更多的功能,web服务302A可利用那些能提供不在web服务302A的范围之内的服务的其它web服务的帮助。为追踪到其它web服务,web服务302A可与目录框架326进行通信。目录框架326是与平台不相关的软件片段(目录框架),它提供一种查找并注册因特网上的web服务的方式。目录框架326包括包含多个已注册web服务,并包括关于这些web服务的详细技术信息的存储330。目录框架326的发现组件328担当进程302B和存储330之间的代理程序(broker),以查找期望的web服务。
一旦目录框架326找到web服务302A所请求的合适的服务,则web服务302A可开始与发现的web服务进行交互以完成期望的任务。图3B示出了一个已发现的web服务304A。进程内核304C将web服务304A表示为进程304B,它通过诸如队列310等通信手段与进程302B进行交互以完成web服务302A、304A的任务。
通过其通信的进程的队列210可采取各种形式,如数据库、通道或其它合适的结构化存储。由于计算设备302、304可位于彼此远离的地理位置上,因此进程302B、304B无法通过共享存储器进行通信。诸如队列310等合适的通信手段包括使进程302B、304B在不同时刻运行时能够跨越暂时离线的异构网络和系统进行通信的技术。进程302B、304B向通信装置发送消息,并从通信装置读取消息。通信装置可提供保证的消息传送、有效的路由、安全性和基于优先级的消息通信。另外,通信装置可用于对需要高性能的异步和同步情况实现解决方案。如上所述,合适的通信装置的具体示例包括通道、队列或数据库以及其它结构化存储等等。当队列310-316是数据库时,它们是由记录组成的文件,它们的每一个都包含字段以及用于搜索、排序、重组和其它处理功能的一组操作,它们被组织成多个表,每一个都是具有行和列特征的数据结构,由数据占有或潜在地占有由行-列交叉点形成的每一单元。
进程内核302C、304C的内部体系结构包括进程虚拟机器302C1、304C1,包含用于定义进程并用于支配进程之间的交互的软件组件;查询虚拟机器302C3、304C3,包含用于定义查询并用于支配查询和队列之间的交互的软件组件;反应虚拟机器302C2、304C2,包含用于支配查询、队列和进程之间的交互的软件组件;以及过渡虚拟机器302C4、304C4,包含用于将进程内核302C、304C从计算设备302、304上的系统软件组件305、307(如COM和操作系统等等)的细节隔离的软件组件。
计算设备302、304通过局域网、广域网或无线网络338进行交互、通信和交换信息。进程302B、304B通过队列310进行通信以交换消息,如消息318。与实现π演算及其变异的现有系统不同,依照本发明形成的系统300允许诸如消息318等消息在进程302B、304B之间交换时由进程内核302C、304C表示为进程。这允许程序或web服务的协作维度,如API的调用排序等在进程302B、304B之间表达。
图3C示出系统300为非集中式网络,它包括多个计算设备302、304、306、308,它们可彼此通信,并可对用户看似为共享的硬件、软件和数据的单个、大型、可访问“仓库”。在计算机科学家的习惯用语中,系统300是一分布式系统,这在概念上与集中式或单片系统相反,其中,不智能的客户机连接到诸如大型机等单个、智能集中式计算机上。系统300是一种动态的网络拓扑,其中,高度分布式、并发进程302B、304B、306B、308B在计算设备302-308上并行地交互。
进程302B-308B相互协作以相互解释作为消息或查询发送到队列310-314的信息。通过通信装置发送的信息片段包括执行顺序、数据定时、服务质量以及进程302B-308B中组织模式的传递,该组织模式从包含数据并以方便数据的解释或数据上的操作的执行的方式描述数据的可定制、基于标签的语言形成。尽管一个合适的可定制、基于标签的语言是可扩充标记语言(XML),本发明不限于该语言。可使用其它可定制、基于标签的语言。
进程302B-308B之间的协作通信由依照本发明形成的编程语言400(图4)提供。语言400是π演算的高阶变异。换言之,语言400是一种基于进程的语言。更具体地,除下文讨论的其它特性之外,语言400能够程序地检测“活性(liveness)”。活性是进程在活动的指示。该质量需要被程序地核实以使程序被信任来完成它打算完成的任务。诸如以语言400书写的web服务302A的程序可被程序地核实其“活性”。其它特性包括分析进程302B-308B的安全性以及资源访问运行时错误的能力。安全问题包括保护计算设备302-308及其数据免遭损害或丢失。安全性,尤其是对诸如系统300等由多人通过多个队列310、312、314、316访问的非集中式服务而言的一个主要焦点是防止非授权个体的访问。以语言400书写的web服务302A可被核实以检测由不可信web程序或不可信计算设备引起的安全问题。
语言400的正式数学定义在附录中给出。语言400包括语法、结构等效性的规则以及可操作语义的规则。语言400的语法是规则的系统,它定义了将查询和进程的句法元素放在一起以形成容许的编程语句的方式。换言之,除非能够以语言400的语法正确地表达,否则无法将概念,如API的调用从一个进程传递到另一个。一旦正确地形成了表达式,语义规则将表达式与意义相连接。由于进程是动态的,因此语言400使用可操作语义以将意义耦合至进程。换言之,进程通过动作或与其它进程进行交互来进展。可以理解,语言400的表达式的意义直接涉及理解其操作。结构等效性的规则允许语言400的可操作语义被简化,使一个表达式可以被比作另一表达式。由此,可保持可操作语义的规则的数量较少,因为这些规则可应用到表达式的置换上。
语言400具有若干主要句法类别:队列句法402,它表示队列、数据库、通信通道、或允许在不同时刻或同一时刻运行的进程通过消息进行通信的任一结构化存储;查询句法404,它表示以数据操纵语言书写的指令以汇编并反汇编消息、操纵由队列句法402表示的存储、并删除消息模式;和进程句法406,它表示计算实体的一个动态方面,在由队列句法402表示的结构化存储上不仅可交换诸如API等名字,而且还可交换诸如消息等进程。队列句法402、查询句法404以及进程句法406一起形成了语言400的主要句法元素。语言400的句法元素402-406可单独使用,或在置换中组合,以表达诸如进程302B-308B等进程之间的协作细微差别。句法规则(参考图11C-11F和附录的1.1节详细描述)、结构等效性规则(下文参考图11J和附录的2.1节详细讨论)以及可操作语义规则(下文参考图11O-11R和附录的3.1节详细讨论)连同查询一起放置在查询虚拟机器302C3、304C3中。句法规则(参考图11G-11I和附录的1.2节详细描述)、结构等效性规则(下文参考图11K-11N和附录的2.2节详细讨论)以及可操作语义规则(下文结合图11S-11V和附录的3.2节详细讨论)连同进程一起放置在进程虚拟机器302C1、304C1中。反应虚拟机器302C2、304C2包含定义队列、查询和进程用语相互反应的方法的可操作语义规则。
编程语言400允许形成表达式,用于描述诸如进程302B-208B等进程,它们并行地运行并通过诸如队列310-314等通信装置交互。数学上,如果T和P是进程,则表达式T|P描述进程T、P并行地运行,可能通过通信手段彼此进行通信或与外界进行通信。
队列310-314由名字(对应地为“X”、“Y”、“Z”和“W”)来表示。编程语言400允许诸如进程318-324等某些类别的进程的传递被表达为队列310-314上的消息。进程318-324包含从一可定制、基于标签的语言形成的组织模式,该语言包含数据并以方便数据的解释或数据上操作的执行的方式描述了数据。一个示例性组织模式包括查询。另一示例性组织模式包括消息。再一示例性组织模式包括XML文档。
查询包含数据以及操纵数据的信息。考虑该示例:计算设备302表示出版者处的计算机,计算设备304表示书店处的计算机。出版者和书店都能够独立地以XML定义关于作者、书名和书本的发行日期的其自己的信息标签。这一书籍信息可用合适的标签组织成XML文档。信息由出版处的计算设备302或书店处的计算设备304交换,将XML文档变换成队列,队列由进程内核302C-308C表示为通过队列310在进程302B和进程304B之间传递的进程,如进程318。
现有的π演算变异不允许诸如XML文档等结构化信息通过诸如队列310等通信装置来传递。然而,应用程序的实际执行有时候需要某些结构化信息交换。一个相关的情况包括表达API的调用顺序的结构化信息。另一相关情况是上文讨论的出版者和书店之间的示例。编程语言400允许多维数据(数据结构)包含在作为在进程302B-308B之间传递的消息传送的进程中,如进程318-324。语言400允许创建环境,以方便在并发且分布式的非集中式网络中,通过队列在进程之间交换组织模式(该模式以可定制、基于标签的语言来表达,它包含数据并以方便数据的解释或数据上操作的执行的方式描述了数据)。
图5可视地示出了将队列310(X)、查询504、506(Q0,Q1)和进程302B、304B(T,P)相关联的句法表达式。储存在队列310-316中的是一个或多个查询502,它们是包含结构化数据或没有明显结构的名字的进程。为将诸如XML文档500A等结构化数据文件通过队列310从进程302B传递到进程304B,进程302B将XML文档500A转换成查询500B,然后将查询500B写入队列310。查询500B由进程内核302C-308C作为进程处理。与现有的π演算的变异不同,编程语言400允许诸如查询500B等进程通过诸如队列310等通信装置传递。查询500B包含一个以上纯名,查询500B也包含XML文档500A的结构化内容。为获取查询500B,进程304B读队列310。
编程语言400提供一组查询操作,用于汇编和反汇编查询、操纵查询并删除查询中的模式。其它查询操作用于将消息放入队列、从队列中获取消息并从现有消息构建新消息。查询包括两个部分:头部和正文。查询的头部定义了一组参数及其对应的类型。正文是一组绑定。通过将其参数绑定到自变量并激活其绑定组来调用查询。绑定定义了两个项之间的关系。不是都有的项都可以被绑定在一起。当绑定将某一类型的项绑定到其互补类型的项时,存在有效的绑定。查询可被比作传统的过程:查询的头部类似于过程的签名;查询的正文类似于过程的编程语句组;每一绑定是使用储存在过程的签名的参数中的数据,或将数据放入过程的签名的参数中的编程语句。
数学上,队列310、查询500B和进程304B之间的关系可依照句法被表达为X[Q0].P,其中,X是队列310;Q0是查询500B;P表示进程304B,它是查询Q0被写入队列X之后的延续点。由此,在语言上,数学表达式X[Q0].P描述了将查询500B存入队列310中的过程,此后过程继续执行进程304B。在编程语言400的框架中,Q0和P都是数学符号X[Q0].P中的进程。编程语言400标识了可通过队列X作为消息传递的进程的子集(或某些类别)。该子集包含查询,其每一个都与诸如包含在XML文档中的可定制、基于标签的数据结构相关。
语言400的一个主要方面是用于确定查询和进程之间的结构等效性的等效法则的集合。用语言400的这些等效法则确定结构等效性的过程摆脱了两个程序文档,如两个程序或两个软件规范之间的微小差别,以确定它们是否在每一相关方面都一致。这些结构等效性法则允许语言400的可操作语义如上所述地被简化。
图6A示出了以适合该说明的语言书写的程序602。程序502包括main()函数,它是诸如C或C++等某些语言的执行起始点。嵌套在第一组花括号之间的是包含测试条件(A==7)的IF语句。测试条件确定变量A是否等于值7。如果测试条件为真,则执行包含在第二组花括号中的编程语句。在第二组花括号内有两个编程语句。第一个编程语句调用fork()函数,它采用P0作为自变量。在某些语言中,fork()函数在父进程开始之后在并发系统中启动子进程。在这一情况下,子进程由自变量P0表示。在调用fork()函数之后,子进程P0与执行程序602的父进程并行地运行。第二个编程语句也包含fork()函数的调用,但是并非采用变量P0作为自变量,fork()函数的第二个调用采用了变量P1作为自变量。用第二fork()函数的调用启动由自变量P1表示的另一子进程。子进程P0、P1在程序流从第二组花括号的关闭花括号的出口处彼此并行地执行。
另一程序604在许多方面类似于程序602,但是有一些不同。一个差异是程序604的IF语句的测试条件,它包含变量B而非变量A。另一差异是在子进程P0的调用之前用fork()函数的第一调用来启动子进程P1。虽然有这些差异,但是如果两个IF语句的测试条件都为真,则程序602、604中的逻辑流最终都将到达程序602、604的fork()语句。由此,变量A、B的名字中的差异是可忽略的,并且它们不影响程序602、604的逻辑结构。此外,由于子进程P0、P1并行地运行,其调用顺序也是可忽略的。
如上所述,程序602可用许多不同的编程语言来书写,它们的每一个都包含阻碍结构等效性分析的不同且多样的语法结构。使用语言400,程序602可由除程序602的语法细节之外的性质来表达。例如,程序602的本质是子进程P0、P1并行地执行。该本质可由语言400通过将程序602翻译成规范602A来表达。进程P0、P1的并行执行在程序602A中被表达为“P0|P1”。语句“P0|P1”在标签<I_DO>和其对应的结束标签</I_DO>之间嵌套。
假定进程302B需要一种服务,其中,期望子进程P0与另一子进程P2并行地执行。该需求由语句“P0|P2”捕捉,如以语言400书写的规范302D中所指示的。语句“P0|P2”位于标签<I_NEED>和其对应的结束标签</I_NEED>之间。还假定进程302B包含来自发现组件328的规范602A,以确定程序602是否适合进程302B希望完成的任务。使用结构等效性分析,进程302B可快速地确定程序602A不能提供规范302D指定的请求服务。情况如此是因为程序602并行地执行子进程P0、P1,而进程302B相反需要子进程P0、P2并行地运行。
来自语言400的等效法则组的一个等效法则允许单独的队列被无缝地融合,使得在操作中一个队列可代替另一队列。这在附录的2.2节中被称为替代等效性。如图7A所示,进程302B使用队列310(队列X)来发送和接收消息(或写和读查询)。作为使用队列310的替代,进程304B与队列702(队列X′)进行通信来发送和接收消息(或写和读查询)。假定查询位于队列702中,其中,名字X被绑定到名字X′(名字X:=:名字X′),在语言400的习惯用语中,操作符:=:是绑定操作符。这表明队列310本质上与队列702融合,因此允许进程302B-304B在同一队列,如队列310上操作或通信。见图7B。使用语言400的等效法则,进程302B、304B可发现一种访问队列(或数据库、或通道等其它结构化存储)的新方法。
现有π演算的变异的输入/数据机制(I/O)是非对称的。考虑以下数学示例:UX.P|U(Y).Q,其中,
U和U指同一链接,但是
U表示该链接正在输出某些东西,如X,而U表示该链接正在输入一些东西,如Y;X是输出数据;Y是输入数据;P、Q是进程,它们在执行了表达式
UX和|U(Y)之后继续。非对称性由作为输出数据的X未绑定到通道U,而作为输入数据的Y被绑定到通道U的事实引起。术语“绑定”指Y的操作范围被局限于绑定Y的链接。换言之,在web服务116(
U)向web服务108传递了要使用其来调用web服务108的API之后,web服务116丢失了其API的知识。非对称I/O抑制了诸如系统300等分布式网络拓扑的形成、本发明通过提供对称I/O克服或减少了上述问题。
图8示出了依照本发明形成的系统300的对称I/O方面。假定进程302B被数学地定义为T=
X.
Y.
W.S,其中,T是进程302B;
X指正在输出一些东西时的队列310;
Y指正在输出一些东西时的队列312;
W指正在输出一些东西时的队列316;S指进程306B。还假定进程304B被数学地定义如下:P=X.Y.Z.R,其中P是进程304B;X指正在输入一些东西时的队列310;Y指正在输入一些东西时的队列312;Z指正在输入一些东西时的队列314;R指进程308B。假定进程T与进程P并行地执行,即在数学上为T|P。在执行时,过程
X.
Y.
W.S被展开到队列310(X),过程X.Y.Z.R被展开到队列310。在这两个过程
X.
Y.
W.S和X.Y.Z.R在队列310上反应之后,过程
Y.
W.S、Y.Z.R被展开到队列312(Y)。假定在这一点上,在队列312上,与运行进程并行地发出查询,将队列316绑定到314,即数学上为<>(W:=:Z)。当发出这一查询时,将队列316(W)与队列314(Z)融合。W的任何输入或输出将被传递到Z,对应地,Z的任何输入或输出将被传递到W,因此形成了一种分布式网络拓扑。从通道312,另一分过程W.S被展开到队列316(W),另一分过程Z.R被展开到队列314(Z)。从队列316,进程306B(进程S)被展开为一延续点并被执行。从队列314,进程308B(进程R)也被展开为另一延续点并被执行。
除句法之外,语言400具有用于描述进程的进展的一组规则。换言之,这些规则定义了语言400的可操作语义。语言400的可操作语义描述了句法元素402-406及其预期意义之间的关系。由此,以语言400书写的程序语句在句法上是正确的,但是在语义上可能不正确。换言之,以语言400书写的语句可以是可接受的形式,但是仍传达错误的意义。语言400的可操作语义的一个示例是通信简化规则,它由图9A-9B图示(在反应虚拟机器302C2、304C2中实现)。查询902A(Q0)准备好被进程302B(T)提交到数据库904(V)。
为便于讨论,示出查询902A为数据库表单。表单包含数据,以及当由数据库904计算数据时可能被填充的“洞”。例如,查询可以被比作具有要答复的问题的信息的问题。由此,信息是表单中的数据,答复是填充表单中的洞的数据。作为另一示例,表单可被比作,如果有足够的信息可用则可在代数上获得解的线性联立方程。在向数据库904提交了查询902A之后,该过程随着进程306B(S)的执行而继续。数学上,向数据库904提交表单902A并在进程306B继续的过程可被描述如下:V[Q0].S,其中,V表示数据库904,Q0表示表单902A,S表示进程306B。
假定并非向数据库904提交表单902A并在进程306B处继续,而是由过程向数据库904提交表单902C并之后在进程308B处继续。数学上,这可被描述如下:V[Q1].R,其中,V表示数据库904,Q1表示表单902C,T表示进程308B。
在执行过程V[Q0].S和执行过程V[Q1].R之间的选择的面前,这一选择可被简化成向数据库904提交表单906A(Q),并之后进程306B、308B都将并行运行。见图9B。数学上,这一结果被表达为V[Q].(S|R)。表单906A的形成由以使查询906A以正则形式(下文描述)的方式联合表单902A、904A引起。尽管之前在两个替换方案(V[Q0].X或V[Q1].R)之间只能作出一个选择,然而采用从两个单独且相异的表单902A、902C形成查询906A,可向数据库904提供单个表单906A,并且进程306B和308B都变为活跃且并行地执行。理解这一概念的一种方法是将表单902A比作具有三项的第一线性联立方程,将表单902C比作具有三项的第二线性联立方程。根据线性代数,可总结出,还没有对两个线性联立方程的解,但是可将这这两个线性联立方程计算成一种形式,使得当给予额外的数据时(另一线性联立方程),所有的项都得到解。表单906A表示两个表单902A、902C的计算,在没有更多数据的情况下对其无法作出进一步的计算。
图10A-10C图示出了用于进程的进展的另一可操作语义规则-提升规则(参考图11U和附录的3.2节更详细讨论)。如图10A所示,进程302B单独与数据库1006、904进行通信来发送并接受消息(或查询)。数据库1006被命名为“U”,数据库904被命名为“V”。假定进程306B向数据库904提交查询1002A,它包含表达名字“U”和名字“V”之间的关系的绑定。当提交查询1002A时,进程302B将认识到名字“U”、“V”指同一数据库。换言之,由进程302B在数据库1006存入的消息将被转发到数据库904,并且对应地,由进程302B在数据库904存入的消息将被转发到数据库1006。在进程302B可从查询1002A解释名字“U”、“V”指同一数据库,或有两个单独的数据库将彼此转发由进程302B发送的消息之前,必须满足某些条件(后文参考图11U详细讨论)。
10C中示出了系统1010,示出多个计算设备在多个地理区域上分散。进程302B在旧金山地理区域1012中的计算设备302上执行。进程304B在西雅图地理区域1016中的计算设备304上执行,进程308B在波特兰地理区域1014的计算设备308上执行。进程302获得进程304B的帮助来执行某些任务。由于对进程302B未知,进程304B无法完成进程302B指定的所有任务。由此,进程304B订约了进程308B的帮助来执行进程304B范围之外的任务。当向数据库1006发出诸如查询1002A等查询时,诸如消息1020等从进程302B到数据库1006的消息将被自动转发到数据库904,使得进程308B可执行需要的任务。可选地,进程302B可直接与数据库904进行通信以交换消息。然而,进程302B不必如此,并可继续与数据库1006进行通信。
图11A-11V示出了用于由诸如进程内核302C等进程内核编译或执行,如web服务302A(后文称为“程序302A”)的程序的方法1100。程序302A以语言400书写。在对程序的分析中,方法1100将执行支配查询表达式和进程表达式的结构和内容的一组句法规则。支配查询表达式和进程表达式的结构等效性的等效法则组也由进程内核302C执行。语言400也包括支配依照语言400的句法规则组正确形成的查询表达式和进程表达式的意义的可操作语义规则组。这些可操作语义规则组由进程内核302C执行。为清晰目的,以下方法1100的描述参考结合图3A-3C所示的系统300中所示的各种元素。
从开始块,方法1100前进到在延续终端(“终端A”)和退出终端(“终端B”)之间定义的一组方法步骤1102。该组方法步骤1102对照支配根据队列句法402形成的查询语句的结构和内容的句法规则来运行程序。从终端A(图11C),方法1100前进到块1114,进程内核302C从程序302A获取查询表达式(Q)。下一步,在判别块1116,进程内核302C判断,查询表达式Q是否具有句法形式<T*>(C*)。
以语言400书写的每一查询具有句法形式<T*>(C*),其中,句法元素<T*>表示查询的头部,句法元素(C*)表示查询的正文。以语言400书写的每一查询具有头部和正文。头部声明参数的数量及其相应的类型。正文包含一组绑定。查询可被比作传统的编程过程,其中,查询是具有关联的常量、数据类型和变量的语句的命名序列(尽管可使用语言400来表达非命名查询),它通常执行单个任务。例如,查询的头部类似于过程的签名,而查询的正文类似于过程内包含的语句的序列。头部定界符<>中包含的是符号T*,它表示零个或多个查询项(下文定义)。正文定界符()中包含的是符号C*,它表示零个或多个约束(下文描述)。
如果对判别块1116的测试的答复是“否”,它意味着查询Q未以可由语言400识别的句法形式书写,则方法1100完成执行并终止。如果答复是“是”,则方法1100前进到另一判别块1118,进程内核302C确定查询正文中的每一约束C是否具有句法形式T:=:T,其中,如上文描述并在下文进一步描述的T是查询项,符号:=:表示定义两个查询项之间的关系的绑定。如果答复是“否”,它意味着查询正文的一个约束未以语言400可接受的形式书写,则方法1100完成执行并终止。否则,判别块1118的答复是“是”,方法前进到另一判别块1120。
在判别块1120,进程内核302C确定查询项T是否为文字(后文称为“顶部”)。文字是在程序中使用的值,它被表达为其本身而非变量或表达式的结果。文字的示例包括数字“25”和“32.1”、字符“a”、串“Hello”以及布尔值“TRUE”。如果判别块1120的答复是“是”,则方法1110前进到另一延续终端(“终端A5”)。从终端A5,方法1100前进到判别块1146,进程内核302C确定是否有另一查询表达式需要分析。如果答复是“否”,则方法1100前进到另一延续终端(“终端B”)。否则,判别块1146的答复是“是”,方法1100循环返回到块1114来从程序302A获取另一查询表达式用于分析。
在判别块1120,如果答复是“否”,则方法1100前进到另一判别块1122,进程内核302C确定查询项T是否为互补文字(后文称为“底部”)。互补文字是文字的反意。如果判别块1122的答复是“是”,则方法1100前进到终端A5(上文描述)。如果相反,判别块1122的答复是“否”,则方法1100前进到另一判别块1124。此处,进程内核302C确定查询项T是否为放弃(discarder)(由符号“_”定界)。放弃是仅包含输入参数而不提供输出参数的查询。如果判别块1124的答复是“是”,则方法1100前进到上述终端A5。在判别块1124,如果答复是“否”,则方法1100前进到另一延续终端(“终端A1”)。
从终端A1(图11D),如果答复是“否”,则方法1100前进到判别块1126,进程内核302C核实查询项T是否为名字(或文字串,如“hello”)。较佳地,字母在句法上由语言400处理为变量,它是能够包含在程序执行过程中能被修改的数据的命名存储位置。如果在语言400中“名字”在字母前面,则由语言400将字母处理为文字串而非变量。如果判别块1126的答复是“是”,则方法1100前进到终端A5(上文描述)。在判别块1126,如果答复是“否”,则方法1100前进到另一判别块1128,进程内核302C确定查询项T是否为变量(如X)。如果答复是“是”,则方法1100前进到终端A5(上文描述)。
在判别块1128,如果答复是“否”,则方法前进到判别块1159,进程内核302C确定查询项T是否为具有形式“X^”的局部变量。形式X^包含项X,它表示以语言400书写的程序中的变量;脱字符号是通常在小型计算机键盘的顶行“6”键上方的指向上方的小符号(^),它表示变量X是局部变量(在计算机科学的习惯用语中,局部变量指其范围限于给定的代码块,通常为子例程的变量,但是在本发明中,局部变量的范围限于一个进程);项X^表示进程中局部变量X的创建,它能够导出在延续进程中使用的信息。如果判别块1159的答复是“是”,则方法1100前进到终端A5(上文描述)。
在判别块1159,如果答复是“否”,则方法前进到判别块1157,进程内核302C确定查询项T是否为具有形式“^X”的局部变量。形式^X包含项X,它表示一个变量;项^是脱字符号;项^X表示进程中能够从进程所进展的计算环境中导入信息(要被使用)的局部变量X。如果判别块1157的答复是“是”,则方法1100前进到终端A5(上文描述)。否则,判别是“否”,方法1100前进到另一延续终端(“终端A2”)。
从终端A2,方法流前进到判别块1130,进程内核302C检查查询项T是否为倒置(由~符号定界)。如果判别是“是”,则方法流前进到终端A5(上文描述)。否则,判别是“否”,方法1100进入判别块1132。在判别块1132,进程内核302C确定查询项T是否为元组,它是一组排序的元素。语言400中有两个符号用于表示元组:句法符号“★”和句法符号“#”。如果判别块1132的答复是“是”,则方法流前进到终端A5(上文描述)。否则,如果判别是“否”,则方法1100前进到判别块1134。此处,进程内核302C检查查询项T是否为<X*>(Q,Q)的形式,其中X*表示一个或多个变量,Q表示查询。由此,进程表达式<X*>(Q,Q)表示查询的头部的零个或多个变量,以及该查询正文中由逗号分隔的两个其它的查询。如果在判别块1134判别是“是”,则方法流前进到终端A5(上文描述)。如果判别是“否”,则方法1100前进到判别块1136。此处,进程内核302C检查查询项T是否为左注入的(left injection)(INR(X))。传统地,左注入操作符“inl()”用于表明两个集合的并中元素的来源。例如,假定集合A与集合B相加(表示为A+B)。实际上,集合A+B的每一元素以标签inl来标记,以表明元素起源于集合A(这是可见的,因为字母A在集合A+B的左侧)。在本发明中,构造函数inl较佳地用于表明在查询表达式<X*>(Q,Q)的正文的左侧Q上的操作(下文描述)。如果判别块1136的答复是“是”,则方法流前进到终端A5(上文描述)。否则,方法1100进入另一延续终端(“终端A3”)。
从终端A3,方法1100前进到判别块1138,进程内核302C确定查询项T是否为右注入的(right injection)(INR(X))。如上文简要描述的,在<X*>(Q,Q)形式的查询面前,左注入构造函数(INL(X))允许变量X绑定到约束QL,右注入构造函数(INR(X))允许变量X绑定到约束QR。如果判别块1138的答复是“是”,则方法1100前进到终端A5(如上述)。否则,方法流前进到判别块1140,进程内核302C确定查询项T是否为<X*>(Q)的形式。如果判别块1140的答复是“是”,则方法1100前进到终端A5。否则,方法流进入另一判别块1142。此处,进程内核302C确定查询项T是否为?T的形式。见判别块1142。操作符“?”可被认为是将项T绑定到包含在查询<X*>(Q)的正文内的查询Q的头部中的第一项的读操作符。如果判别块1142的答复是“是”,则方法流前进到终端A5(上文描述)。如果答复是“否”,则方法确定查询项T是否为复制操作(如,“T@T”)。如果判别块1144的答复是“是”,则方法1100进入终端A5(上文描述)。如果相反,答复是“否”,它意味着查询Q未以可由语言400识别的句法形式书写,方法1100完成执行并终止。
从终端B(如11A),方法1100前进到在延续终端(“终端C”)和退出终端(“终端D”)之间定义的一组处理步骤。该组处理步骤1104对照支配进程语句的结构和内容的句法来运行程序302A。从终端C(图11G),进程内核302C从程序302A获取进程表达式(∏)。见块1148。下一步,在判别块1150,进程内核302C确定进程表达式∏是否为“0”,它指示进程停止或进程的不活动。如果答复是“是”,则方法流前进到另一延续终端(“终端C3”)。否则,方法流前进到另一判别块1152。进程内核302C判断进程表达式∏是否具有X[Q].P的形式,其中,X是表示通道、队列、数据库或其它结构化存储的变量;Q表示具有上文描述并在图11C-11F中示出的句法的查询;X[Q]表示查询Q被提交或被存入X中;句点“.”表示从进程X[Q]到另一进程P的序列,或表示从进程的一部分X[Q]到同一进程的另一部分P的序列。如果判别块1152的答复是“是”,则方法1100前进到终端C3。否则,如果答复是“否”,则方法1100前进到判别块1154。进程内核302C确定进程表达式∏是否为若干X[Qi].Pi的总和,如X[Q0].P0+X[Q1].P1。该总和指示由进程表达式∏表示的进程可以执行多个选择之一。例如,对于X[Q0].P0+X[Q1].P1的总和,由∏表示的进程可执行X[Q0].P0或X[Q1].P1。如果判别块1154的答复是“是”,则方法1100前进到终端C3。否则,如果答复是“否”,则方法流前进到另一延续终端(“终端C1”)。
从终端C1(图11H),方法1100前进到判别块1156,进程内核302C确定进程表达式∏是否为(NEW X)P的形式,其中,NEW表示语言400中用于创建绑定到某一进程的新名字的操作符;(NEW X)表示在某一进程中创建新名字X;(NEWX)P表示创建了新变量X,并绑定到进程P。如果判别块1156的判别是“是”,则方法1100在终端C3继续。如果答复是“否”,则方法1100进入判别块1158。此处,进程内核302C确定进程表达式∏是否为P|P的形式,它表示一个进程与另一进程并行地执行。如果判别块1158的答复是“是”,则方法流前进到终端C3。否则,方法1100前进到判别块1160。进程内核302C在判别块1160确定进程表达式∏是否为!P的形式,其中,惊叹号“!”表示重复操作符,!P表示无穷组合P|P|…。重复操作符!允许开发者使用语言400来表达进程的无穷行为。如果判别块1160的判别是“是”,则方法1100前进到终端C3。否则,方法1100进入另一延续终端(“终端C2”)。
从终端C2(图11I),方法1100前进到判别块1162,进程内核302C确定进程表达式∏是否为X[P]的形式。句法形式X[P]指示使用语言400的开发者可在诸如上文所描述的包括通道、队列和数据库等其它结构化存储的X处存入或提交进程P。如果判别块1162的答复是“是”,则方法1100前进到终端C3。否则,答复是“否”,方法流前进到判别块1164。进程内核302C确定进程表达式∏是否为<Q>的形式,它是提升查询(后文更详细描述)。如果判别块1164的判别是“是”,则方法1100进入终端C3。否则,答复是“否”,方法1100完成执行并终止。方法1100在这一点上终止的原因是因为进程表达式∏是以与语言400的语法不兼容的方式形成的。
从终端C3(图11I),方法1100前进到判别块1166,进程内核302C确定程序302A是否包含要检查的其它进程表达式。如果答复是“否”,则方法流前进到另一延续终端(“终端D”)。否则,答复是“是”,方法1100前进到另一延续终端(“终端C4”),它循环返回到块1148,重复上文描述的方法步骤。
从终端D(图11A),方法1100前进到一组处理步骤1106,该方法使用支配查询表达式的结构等效性的一组等效法则来运行程序(见图11J)。处理步骤1106被定义在延续终端(“终端E”)和退出终端(“终端F”)之间。
从终端E(图11J),方法1100前进到块1168,进程内核302C获取两个或多个查询表达式用于结构等效性比较目的。下一步,方法确定查询上下文(K)是否为K[T:=:U]的形式。查询上下文K表示具有适用于用一个或多个约束来填充的洞的多个查询。如果判别块1178的答复是“是”,则查询上下文K在结构上与另一查询上下文K[U:=:T]等效。见块1170B。然后,方法流前进到另一延续终端(“终端E1”)。否则,如果判别块1170A的判别是“否”,则方法1100进入另一判别块1172A。此处,进程内核302C确定查询上下文K是否具有K[T0:=:U0,T1:=:U1]的形式。如果判别块1172A的答复是“是”,则查询上下文K在结构上与另一查询上下文K[T1:=:U1,T0:=:U0]等效。见块1172B。下一步,方法流前进到终端E1。如果相反,判别块1172A的答复是“否”,则方法1100前进到终端E1,从而前进到另一判别块1174。进程内核302C确定程序中是否有更多的查询表达式要分析结构等效性。见块1174。如果答复是“否”,则方法1100前进到退出终端F。否则,答复是“是”,方法1100循环返回到块1168,重复上文描述的方法步骤。
从终端F(图11A),方法1100前进到另一延续终端(“终端G”)。从终端G(图11B),方法1100前进到一组在延续终端(“终端H”)和退出终端(“终端I”)之间定义的处理步骤1108。在这些处理步骤1108中,方法使用支配被处理的语句的结构等效性的一组等效法则来运行程序。
从终端H(图11K),方法1100前进到块1176,进程内核302C从程序302A获取若干进程表达式(∏1和∏2)用于结构等效性分析。下一步,方法确定进程表达式∏1是否为P0|P1的形式。见判别块1178A。如果判别是“是”,则如果∏2具有P0|P1的形式,进程表达式∏1在结构上与进程表达式∏2等效。见块1178B。下一步,方法1100前进到另一延续终端(“终端H7”)。如果判别块1178A的答复是“否”,则方法1100前进到另一判别块1180A,进程内核302C确定进程表达式∏1是否具有P|0的形式。如果判别块1180A的答复是“是”,则如果进程表达式∏2具有P的形式,进程表达式∏1在结构上与进程表达式∏2等效。见块1180B。下一步,方法流前进到终端H7。如果判别块1180A的答复是“否”,则方法1100前进到另一判别块1182A。此处,进程内核302C确定进程表达式∏1是否具有!P的形式。如果答复是“否”,则方法1100前进到另一延续终端(“终端H2”)。如果判别块1182A的答复是“是”,则方法1100前进到再一延续终端(“终端H1”)。
从终端H1(图11L),方法1100前进到块1182B,如果进程表达式∏2具有P|!P的形式,则确定进程表达式∏1在结构上与进程表达式∏2等效。下一步,方法1100前进到终端H7。
从终端H2(图11L),方法1100前进到判别块1184A,进程内核302c确定进程表达式∏1是否具有P0+P1的形式。如果判别块1184A的答复是“是”,则如果进程表达式∏2具有P1+P0的形式,进程内核302C确定进程表达式∏1在结构上与进程表达式∏2等效。见块1184B。下一步,方法流前进到终端H7。如果相反,判别块1184A的答复是“否”,则方法1100前进到另一判别块1186A。此处,进程内核302C确定进程表达式∏1是否具有P0+0的形式。如果答复是“是”,则方法1100流向块1186B,如果进程表达式∏2具有形式P,则进程内核302C确定进程表达式∏1在结构上与进程表达式∏2等效。下一步,方法1100流向终端H7。如果答复是“否”,则方法流前进到另一判别块1188A。此处,进程内核302C确定进程表达式∏1是否具有(NEW X)(NEW Y)P的形式。如果答复是“是”,则方法1100前进到另一延续终端(“终端H3”)。否则,如果答复是“否”,则方法1100前进到另一延续终端(“终端H4”)。
从终端H3(图11M),方法1100前进到块1188B,如果进程表达式∏2具有(NEW X)(NEW Y)P的形式,则确定进程表达式∏1在结构上与进程表达式∏2等效。从终端H4(图11M),方法1100前进到另一块1190A,进程内核302c确定进程表达式∏1是否具有(NEW X)(NEW Y)P的形式。如果判别块1190A的答复是“是”,则如果进程表达式∏2具有(NEW X)P的形式,进程表达式∏1在结构上与进程表达式∏2等效。见块1190B。下一步,方法1100前进到终端H7。如果判别块1190A的答复是“否”,则方法1100前进到另一判别块1192A。此处,进程内核302C确定进程表达式∏1是否具有(NEW X)P|Q的形式。如果判别块1192A的答复是“是”,则过程前进到块1192B,如果进程表达式∏2具有(NEW X)(P|Q)的形式,进程内核302C确定进程表达式∏1在结构上与进程表达式∏2等效。名字X较佳地为进程Q中的自由名字。换言之,名字X不被绑定到进程Q。下一步,方法1100前进到终端H7。
如果判别块1192A的答复是“否”,则方法1100进入判别块1194A。此处,进程内核302C确定进程表达式∏1是否具有<>(,名字X:=:名字X′)|P的形式,其中<>表示不包含任何东西的查询的头部;表示约束的列表或一组绑定;名字X:=:名字X′表示文字X被绑定到文字X′,或者文字X具有对文字X′的等效关系;<>(,名字X:=:名字X′)|P表示查询<>(,名字X:=:名字X′)的头部是与进程P并行运行的查询。如果判别块1194的测试的答复是“否”,则方法1100前进到终端H7。如果相反,判别块1194A的答复是“是”,则方法1100前进到另一延续终端(“终端H6”)。
从终端H5(图11N),方法1100前进到另一判别块1194B。在判别块1194B,进程内核302C确定查询<>(,名字X:=:名字X′)是否是正则的。当且仅当查询的所有约束(查询正文中的绑定)是不可简化的,且查询不失败,则可以说查询是正则的,或者可选地说它是正则的形式。当且仅当有第二查询使得该查询映射或简化成该第二查询,并且约束是该第二查询的元素时,查询中的约束是不可简化的。当且仅当查询映射或简化成另一查询,且该另一查询包含失败时,可以说查询失败。如果L0不等效于L1的互补,则L0:=:L1形式的约束是失败的,其中,L0、L1是文字。
如果判别块1194B的答复是“是”,则方法1100前进到块1194C。此处,如果进程表达式∏2具有<>(,名字X:=:名字X′)|P{X′/X}的形式,则进程内核302C确定进程表达式∏1在结构上与进程表达式∏2等效。进程表达式P{X′/X}表示只要在进程P中出现名字X,这一出现可用名字X′来替换。在这一点上,可以回忆处理步骤1194A-1184C程序地描述替换等效物,这已在上文结合图7A-7B讨论。下一步,方法1100前进到终端H7。
如果判别块1194B的答复是“否”,则方法1100前进到终端H7。从终端H7,方法1100前进到另一判别块1196,进程内核302C检查是否有更多的进程表达式用于结构等效性分析。如果判别块1196的答复是“否”,则方法流前进到退出终端I。否则,方法1100前进到延续终端(“终端H8”)。从终端H8(图11K),方法1100循环返回到块1176,重复上述方法步骤。
从退出终端I(图11B),方法1100前进到一组处理步骤1110,该方法对照支配程序302A中的查询语句的意义的可操作语义规则来运行程序302A。该组处理步骤1110在延续终端(“终端J”)和退出终端(“终端K”)之间定义。在语言400中,可操作语义规则基本上是进程的一系列进展关系。进程本质上是动态的,使得从时间中的一点到下一点,进程在连续地变化或进展。语言400的可操作语义规则提供了以语言400表达的进程的仔细引导的进展。正是通过上文在图11C-11I中描述的语义规则,开发者能通过语言400的可操作语义表达进程进展中的细微差别。
从终端J(图11O),方法1100前进到块1198,进程内核302C从程序中的查询表达式获取绑定。下一步,在判别块1199A,进程内核302C确定绑定B是否包含绑定“顶部:=:底部”。如果答复是“是”,则进程内核302C将绑定B简化成什么都没有。见块1199B。下一步,方法流前进到延续终端“终端J4”)。如果相反答复是“否”,则方法流前进到判别块1197A,进程内核302C确定绑定B是否包含绑定X:=:T,U:=:X。如果答复是“是”,则进程内核302C将绑定B简化成绑定T:=:U。见块1197B。下一步,方法流前进到终端J4。如果答复是“否”,则方法1100前进到另一延续终端(“终端J1”)。
从终端J1(图11P),方法1100前进到另一判别块1193A,进程内核302C确定绑定B是否包含T0★T1:=:U0#U1。如果答复是“是”,则进程内核302C将绑定B简化成T0:=:U0,T1:=:U1。见块1193B。下一步,方法流前进到终端J4。如果判别块1193A的答复是“否”,则方法1100前进到另一判别块1191A。进程内核302C确定绑定B是否包含绑定
如果判别块1191A的答复是“是”,则进程内核302C将绑定B简化成 见块1191B。下一步,方法1100前进到终端J4。如果判别块1191A的答复是“否”,则方法1100前进到另一判别块1189A。
如果判别块1191A的答复是“否”,则方法1100前进到另一判别块1189A。进程内核302C确定绑定B是否包含
如果判别块1189A的答复是“是”,则方法1100前进到块1189B,进程内核302c将绑定B简化成
下一步,方法流前进到终端J4。如果判别块1189A的答复是“否”,则方法1100前进到另一延续终端(“终端J2”)。
从终端J2,方法1100前进到另一判别块1187A。此处,进程内核302C确定绑定B是否包含
如果答复是“是”,则进程内核302C将绑定B简化成T:=:U,
见块1187B。下一步,方法1100前进到终端J4。如果判别块1187A的答复是“否”,则方法1100前进到另一判别块1185A。进程内核302C确定绑定B是否包含
如果判别块1185A的答复是“是”,则进程内核302C将绑定B简化成
见块1185B。下一步,方法1100前进到终端J4。如果判别块1185A的答复是“否”,则方法1100前进到另一判别块1183A。进程内核302C确定绑定B是否包含
换言之,查询
用放弃操作符来绑定。如果判别块1183A的答复是“是”,则进程内核302C将绑定B简化成以下绑定:X
0:=:_,…,X
n:=:_。换言之,查询
的头部中列表
的每一项被绑定到放弃操作符。下一步,方法1100前进到终端J4。如果判别块1183A的答复是“否”,则方法流进入另一延续终端(“终端J3”)。
从终端J3(图11R),方法1100前进到另一判别块1181A,进程内核302C确定绑定B是否具有
的形式。换言之,进程内核302C确定绑定B是否以在头部具有列表
并在正文中具有三个约束列表(包括
0,,
1)的查询的形式。如果判别块1181A的答复是“是”,则进程内核302C进一步确定列表是否可被简化成
见判别块1181B。如果判别块1181B的答复是“是”,则绑定被简化成查询
见块1181C。方法流前进到终端J4。
如果判别块1181A、1181B的答复是“否”,则方法1100前进到另一判别块1179A。进程内核302C确定绑定B是否包含以下查询
如果判别块1179A的答复是“是”,则绑定B被简化成查询
见块1179B。换言之,如果名字U被绑定到查询的正文中的名字X,则在列表
中具有名字X的每一处,名字X可由名字U来替换。下一步,方法流前进到终端J4。否则,判别块1179A的答复是“否”,则方法流前进到终端J4,从而前进到另一判别块1177。此处,进程内核302C确定是否有另一查询表达式要应用语言400的语义规则。如果答复是“否”,则方法1100前进到退出终端K。如果判别块1177的答复是“是”,则方法1100前进到另一延续终端(“终端J5”)。从终端J5,方法1100循环返回到块1198,重复上述方法步骤。
从退出终端K(图11B),方法1100前进到一组处理步骤1112,该方法对照支配进程表达式的意义的可操作语义规则来运行程序302A。该组处理步骤1112在延续终端(“终端L”)和退出终端(“终端M”)之间定义。
从终端L(图11S),方法1100前进到块1175,进程内核302C获取程序302A的进程表达式(∏)。下一步,在判别块1173A,进程内核302C确定进程表达式∏是否包含总和X[Q0].P0+…+X[Q1].P1+…。如果判别块1173A的答复是“是”,则方法1100前进到另一判别块1173B。此处,进程内核302C确定是否有σ0(Q0):=:σ1(Q1)形式的绑定,它可被正则地简化为另一查询Q。σ0、σ1都定义了映射或简化项的置换(见附录的3.2节的定义3.2.1)。σ0、σ1都较佳地被解释为数据库联合。如果判别块1173B的答复是“是”,则进程内核302C将进程表达式∏简化成进程X[Q].(P0|P1),它表示了经简化的查询Q被提交到结构化存储X,并且随后进程P0、P1都并行地执行。见块1173C。处理步骤1173A-1173C在上文结合图9A-9B讨论。下一步,从块1173C,方法1100前进到另一延续终端(“终端L6”)。
如果判别块1173A、1173B的答复是“否”,则方法1100前进到另一判别块1171A。进程内核302C确定进程表达式∏是否包含P|P″。如果答复是“是”,则方法1100前进到另一判别块1171B,进程内核302C确定进程P是否可被简化成进程P′。如果判别块1171B的答复是“是”,则方法1100前进到另一延续终端(“终端L1”)。如果判别块1171A、1171B的答复是“否”,则方法1100前进到另一延续终端(“终端L2”)。
从终端L1(图11T),方法1100前进到块1171C,进程内核302C将进程表达式∏简化成P|P′。下一步,方法流前进到终端L6。从终端L2(图11T),方法1100前进到另一判别块1169A,进程内核302C确定进程表达式∏是否包含(NEWX)P。如果答复是“是”,则方法流前进到判别块1169B,进程内核302C确定进程P是否可被简化成P′。如果判别块1169B的答复是“是”,则进程内核302C将进程表达式∏简化成(NEW X)P′。见块1169C。下一步,方法1100前进到终端L6。如果判别块1169A、1169B的答复是“否”,则方法流前进到另一判别块1167A。此处,进程内核302C确定进程表达式∏是否包含X[P]。如果答复是“是”,则方法1100前进到另一判别块1167B。进程内核302C确定进程P是否可被简化成另一进程P′。见判别块1167B。如果判别块1167B的答复是“是”,则方法流前进到另一延续终端(“终端L3”)。如果判别块1167A、1167B的答复是“否”,则方法1100前进到另一延续终端(“终端L4”)。
从终端L3,方法1100前进到块1167C,进程内核302C将进程表达式∏简化成X[P′]。下一步,方法流前进到终端L6。从终端L4(图11U),方法流前进到另一判别块1165A,进程内核302C确定进程表达式∏是否包含进程X[Q].P。如果判别块1165A的答复是“是”,则进程内核302C在判别块1165B确定查询Q是否具有与
形式的另一查询的等效关系。项
指在头部没有任何东西的查询(查询的头部不包含任何项)。其正文包含项,它指示约束或绑定关系的列表(如将端口绑定到端口的条件),或者包含项
它指示局部变量列表到与局部变量列表项关联的值的列表的绑定关系。
如果判别块1165B的答复是“是”,则进程内核302C还确定查询Q是否为正则形式。见判别块1165C。如果判别块1165C的测试是“是”,则进程内核302C将进程表达式∏简化成
形式的进程。见块1165D。项<Q′>是提升查询,它等效于
并且先前在图10A-10C中讨论。提升查询
是头部不包含任何东西,且正文包含在约束列表中描述的全局已知的绑定关系的查询。项
是一进程,它在提升约束列表中的约束项的过程中用值列表
中对应的值替换局部变量列表
中每一局部变量。总言之,如果进程X[Q].P中的查询Q等效于
并且另外查询Q是正则形式,则进程X[Q].P可被进展到形式
的进程。下一步,方法1100前进到终端L6。
如果判别块1165A-1165C的答复是“否”,则方法1100进入另一判别块1163A。进程内核302C确定进程表达式∏是否包含P0,它具有到P0′的等效关系。见判别块1163A。如果答复是“是”,则方法1100前进到另一延续终端(“终端L5”)。如果判别块1163A的答复是“否”,则方法1100前进到终端L6。
从终端L5(图11V),方法1100前进到判别块1163B,进程内核302C确定P0′是否可被简化成P1′。如果答复是“是”,则进程内核302C确定进程P1′是否具有与进程P1的等效关系。见判别块1163C。如果判别块1163C的测试是“是”,则进程内核302C将进程P0简化成进程P1。见块1163D。下一步,方法1100前进到终端L6。如果判别块1163B、1163C的答复是“否”,则方法1100也前进到终端L6。
从终端L6(图11V),方法1100前进到另一判别块1161,进程内核302C检查是否由更多的进程表达式要在语言400的可操作语义规则下分析。如果答复是“否”,则方法流前进到退出终端M。如果判别块1161的答复是“是”,则方法1100前进到另一延续终端(“终端L7”)。从终端L7,方法1100循环返回到块1175,重复上述方法步骤。
尽管示出并描述了本发明的较佳实施例,然而可以理解,可以在不脱离本发明的精神和范围的情况下作出各种变化。
附录
语义
语言的语义以简化规则的SOS风格组来呈现。为简明目的,引入句法的一种更间接、完全中缀版本,通常称为演算。在该句法上应用一组等效规则,因为该句法在太细的进程之间作出区分。在此等效性上这些简化规则是紧密的。
演算风格的句法
P::=0
|x[Q].P
|(new x)P
|P|P
||!P
|<Q>
程序员看见的句法(程序级句法)和中缀(模型级)句法之间的对应性应当是明显的,但是为完整性在下表中给出。注意,前缀句法试图通过提供类似块形式的句法“糖块”以在其冗余度上起作用。该形式允许程序员在延续之前指定拟顺序地执行的若干行动的前缀。与写出这些形式的完整编译相反,下表简单地提供了最少信息来推导该编译。选择相当于令左侧的列成为右侧列的翻译。
注意:提升查询形式当前在用户级的前缀句法中不可用。但是在随后的版本中可用。
Q::=<T★>(C★)
C::=T:=:T
T::=顶部|底部|_|名字y
|x
|x^
|^x
|~T
|T★T
|T#T
|<x★>(Q,Q)
|inl(x)
|inr(x)
|<x★>(Q)
|?T
|T@T
程序级句法 |
模型级句法 |
(T★){C★} |
<T★>(C★) |
T:=:T; |
T:=:T |
x |
x |
x^ |
x^ |
^x |
^x |
~T |
~T |
T★T |
T★T |
T#T |
T#T |
(x★)[左:Q|右:Q] |
<x★>(Q,Q) |
入(左,x)入(右,x) |
inl(x)inr(x) |
(x★)[Q] |
<x★>(Q) |
?T |
?T |
T@T |
T@T |
结构等效性
如上所述,句法作出了太多的区别。例如,在“:=:”的哪一侧出现项是没有区别的。我们引入结构等效性来消除这些不必要的区别。
对于查询,使用查询上下文来完成这一过程,查询上下文只是在其中有可插入条件的位置的查询。对于进程,明确地实现这一过程。
K[t:=:u]≡k[u:=t]
K[t0:=:u0,t1:=:u1]≡K[t1:=:u1,t0:=:u0]
P0|P1≡P1|P0
P|0≡P
!P≡P|!P
P0+P1≡P1+P0
P+0≡P
(new x)(new y)P≡(new y)(new x)P
(new x)(new y)P≡(new x)P
(new x)P|Q≡(new x)(P|Q),xFN(Q)
对于熟悉进程代数的读者,这些公式是普通的推测。一个令人感兴趣的情况如下。当查询是正则形式时,且其正文中有条件,则情况是那些条件是端口之间的等式,或局部变量及其值之间的等式。在提升时,用值替换局部变量以延续。当在提升查询中呈现时,端口之间的等式担当实现一种明确替换的过程。
简化规则
(匹配) 顶部:=:底部→
(剪切) x:=:t,u:=:x→t:=:u
(平均张量)
(左加)
(右加)
(读)
(复制)
(放弃)
(上下文)
(清除)
x不被
约束
讨论
匹配
匹配规则确实是一种规则模式。每当文字及其对偶共同到来,它们会消失。当不再需要检查时这被解释为是成功的。
剪切
标识符在直观上可以被认为是如线。当两个项在线的每一端点上出现时,可以消除该线,并将两个项直接插在一起。在这一点上,可以说线性类型确保在较佳类型的项中,标识符的确出现了两次。
平均张力
当元组提供的满足对元组的[sic]需求时,对应的位置被连线在一起。
加
当菜单(“具有声称(withClaim)”形式)提供的满足对选择(“注入(injectClaim)声称”形式)的需求时,作出选择。这促使选择的选项被连线到该需求的约束。
读
当记录(“当然声称(ofCourseClaim)”)提供的满足对回复(“为什么不声称(whyNotClaim)”)的需求时,记录上的数据被连线到该需求的约束。
复制
当记录提供的满足对复制(“合约声称(contractClaim)”)的需求时,分别的副本被连线到该需求的分别的约束。
放弃
当记录提供的满足对放弃记录(“_”)的需求时,该记录被放弃。
上下文
当条件的集合以某种方式进展时,它们可在查询正文的上下文中以该方式进展。
清除
当线的一端,即[sic]标识符的一个出现,在查询的头部出现时(具有某项),且另一端在正文中出现时,则在正文中绑定该标识符的项可被替代到头部中。
定义3.2.1设σ:n→n是置换,
是查询。取
定义3.2.2设
且
取
定义3.2.3在文字l0,l1上形式l0:=:l1的约束,如果l0≠~l1,则失败。
定义3.2.4当且仅当Q→*Q′,且Q′包含失败,则Q失败。
定义3.2.5当且仅当Q′.Q→*Q′.c∈Q′,则查询Q中约束c是不可简化的。
定义3.2.6当且仅当查询Q的所有约束都是不可简化,且Q不失败时,查询Q是正则的(可选地,以正则形式)。
(同等)
(新)
(等效)
常用
如果两个查询分别具有在头部中的某一位置匹配的项,且对应的剪切查询进展到不能再继续进展的查询,但是尚未失败,则将这些查询放入同一队列的两个进程将进行通信。其相应的延续将等候简化的查询的完成。
同等
如果进程可自己进展,则它可能仍与另一进程组合并行地进展。
新
如果进程可自己进展,则如果其端口之一不再对外部交互可用,它可能仍继续进展。
提升
如果在正文中具有任何绑定,则头部没有项的查询仅具有将端口绑定到端口或将局部变量绑定到值的条件。这一查询可被提升。在提升时,局部变量被替换出延续的正文。
在局部变量被替换出去之后,等式的剩余部分在端口之间。这一查询然后变成一进程,它担当一种明确替换,或换算的端口之间的线。
等效
在等效性关系上进展是紧密的。