技术领域
[0001] 本发明涉及系统设计,尤其涉及使用状态机的系统设计。
相关背景技术
[0002] 状态机是用于设计实时系统和硬件的一种机制。虽然没有在软件中的多,但已经在硬件中开发并广泛地采用状态机理论和优化。
具体实施方式
[0010] 可以一般化关系数据库的概念并将其用来实现状态机。一般化的关系数据库概念可以允许来自关系数据库应用程序的增强的表达能力,以及允许使用状态机来实现关系数据库。
[0011] 标准关系数据库可以由行的集合以及行的元组来表示,我们可以将行的集合定义为‘集合’,我们可以将行的元组定义为‘类’。
[0012] 贯穿本文,使用符号M来讨论集合,其中M表示集合而T表示存储在集合中的项的数据类型。为了使集合工作,存在若干公理:
[0013] ::M-空集
[0014] U::M>x M→M-两个集合的并集产生另一集合。
[0015] {_}::T→M-将值注入到集合中。在这种情况下,可以创建单个元素或单元素集合。
[0016] 在关系代数中使用若干公共运算符来对数据库执行操作:
[0017] σ::Mx(T→bool)→M-从关系代数的过滤或选择操作。
[0018] 函数(T→bool)是过滤函数。
[0019] π::Mx(T→S)→M-投影或变换操作将集合从类型T变为类型S。
[0020] X::Mx M→M-一对集合可被变成对的集合。
[0021] 定义了又一个运算符:
[0022] SelectMany(选择许多)::Mx(T→M)→M-来自关系代数的相关子查询。函数(T→M)定义了如何将M的元素分成S型元素的集合,随后被展平成S元素的集合。
[0023] 可以使用SelectMany运算符来表达以上定义的以上关系代数操作中的任一个。
[0024] σ(as)=as.SelectMany(λa→P(a)?{a}:0)-使用函数P(a)从集合‘as’中过滤项‘a’。P(a)处理每一项λa,并创建单元素集合{a}或创建空集。随后将各项展平成带有与原始集合相同类型的新的集合或将其加入到新的集合中。
[0025] π(as)=as.SelectMany(λa→{F(a)})-通过应用函数F(a)来投影各项并创建单元素集合。随后将单元素集展平成带有与原始集合相同类型的新的集合或将其加入到新的集合中。
[0026] as X bs=as.SelectMany(λa→σλb→(a,b)(bs))-结合一对集合‘as’和‘bs’。
[0027] SelectMany中使用的函数可以是代码的任意表示。在某些情况下,函数可以是对象或在某些情况下可以是描述以及可执行函数。
[0028] 通过使用以上的SelectMany符号,出现了多个一元体(monad):
[0029] 集合M<_>对应于算符
[0030] 运算符SelectMany对应于绑定
[0031] 单元素集合{_}对应于返回或η
[0032] 结合一元体取各集合的集合(a collection of collections)并将结果展平为单个集合。
[0033] μ::M>→M
[0034] 结合一元体可以使用SelectMany来表示。
[0035] μtss=tss.SelectMany(λts→ts)
[0036] 因此,数据库描述符和运算符可以被一般化为一元体。可以将数据库查询引擎的技术应用于更一般化的一元体概念。
[0037] Mealy机是有限状态机,它可以被一般化为一元体的概念。
[0038] Mealy机是由以下各项组成的6-元组(S,S0,∑,Λ,T,G):
[0039] 状态的有限集(S)
[0040] 开始状态或初始状态(S0),它是S的一个元素
[0041] 被称为输入字母表的有限集(∑)
[0042] 被称为输出字母表的有限集(Λ)
[0043] 将状态和输入字母表映射到下一状态的转移函数(T:S x∑→S)
[0044] 将每一状态和输入字母表映射到输出字母表的输出函数(G:S x∑→Λ)[0045] Mealy机的函数可以如下表达,其中*指示各项的集合:
[0046] Next(下一个)::状态x输入→状态
[0047] Out(输出)::状态x输入→输出
[0048] Run(运行)::状态x输入*x((状态x输入→状态)x(状态x输入→输出))→(输出x状态)*
[0049] Run的表达式指示输入和状态的集合得到输出和状态的集合。
[0050] 可以进一步一般化这些表达式,其中可以组合状态x输入→状态函数以及状态x输入→输出函数来创建产生输出对的单个函数:
[0051] 状态x输入→输出x状态
[0052] 输出可以是输出的集合。
[0053] 状态x输入→输出*x状态
[0054] Mealy机Run表达式可以被重写为:
[0055] 状态x输入*x(状态x输入→输出*x状态)→(输出x状态)*
[0056] 在编程语言中,全局状态是隐式的,将以上表达式简化为:
[0057] 输入*x(输入→输出*)→输出*
[0058] 输入序列的集合,将输入转换为输出序列的函数得到输出序列。
[0059] 该表达式可以使用.NET框架中的SelectMany来定义为:
[0060] IEnumerable(可枚举)SelectMany(该IEnumerablesrc(源),Func(函数)>选择器)
[0061] 当选择器函数产生副效应时,可以使用该表达式来实现状态机。以上所述的Mealy机被示为有限状态机,但该表达式还可用于实现无限状态机。副效应函数可以是改变输入和输出参数以外(即,环境中的)的状态的任何函数。
[0062] 可以在常规数据库语言系统中使用副效应函数来表达状态机。状态机的输入可以被认为是状态机可以处理的‘事件’。在处理事件时,可以更新状态并生成输出。
[0063] 可以使用数据库查询语言处理器通过将查询输入定义为状态序列来表达状态机。可以使用变换函数将状态序列绑定到序列输入以创建输出事件流。当变换函数具有副效应时,那些副效应在对输入事件流作出响应时可以定义状态机的状态。
[0064] 在某些情况下,输入类型可以与输出类型不同。当且仅当N→M时以下语句保持为真:
[0065] Mx(I→N)→M
[0066] 类似地,当且仅当M>→N时以下语句保持为真:
[0067] Mx(I→N)→N
[0068] 在某些实施例中,输入可以被创建为推或拉输入。拉输入可以请求输入并在处理输入之前可以等待直到接收到输入。在推输入中,状态机可以在任意时刻接收输入并且在其到达后处理输入。
[0069] 本说明书通篇中,在所有附图的描述中,相似的附图标记表示相同的元素。
[0070] 在将元素称为被“连接”或“耦合”时,这些元素可以直接连接或耦合在一起,或者也可以存在一个或多个中间元素。相反,在将元素称为被“直接连接”或“直接耦合”时,不存在中间元素。
[0071] 本发明主题可被具体化为设备、系统、方法、和/或计算机程序产品。因此,本发明的部分或全部能以硬件和/或软件(包括固件、常驻软件、微码、状态机、门阵列等)来具体化。此外,本发明可以采用其上包含有供指令执行系统使用或结合其使用的计算机可使用或计算机可读程序代码的计算机可使用或计算机可读存储介质上的计算机程序产品的形式。在本文的上下文中,计算机可使用或计算机可读介质可以是可包含、存储、通信、传播、或传输程序以供指令执行系统、装置或设备使用或结合其使用的任何介质。
[0072] 计算机可使用或计算机可读介质可以是,例如,但不限于,电、磁、光、电磁、红外、或半导体系统、装置、设备或传播介质。作为示例而非限制,计算机可读介质可以包括计算机存储介质和通信介质。
[0073] 计算机存储介质包括以用于存储诸如计算机可读指令、数据结构、程序模块或其它数据这样的信息的任意方法或技术来实现的易失性和非易失性、可移动和不可移动介质。计算机存储介质包括,但不限于,RAM、ROM、EEPROM、闪存或其它存储器技术、CD-ROM、数字多功能盘(DVD)或其它光盘存储、磁带盒、磁带、磁盘存储或其它磁性存储设备、或能用于存储所需信息且可以由指令执行系统访问的任何其它介质。注意,计算机可使用或计算机可读介质可以是其上打印有程序的纸张或其它合适的介质,因为程序可以经由例如对纸张或其它介质的光学扫描而电子地捕获,随后如有必要被编译、解释,或以其它合适的方式处理,并随后存储在计算机存储器中。
[0074] 通信介质通常以诸如载波或其它传输机制等已调制数据信号来体现计算机可读指令、数据结构、程序模块或其它数据,并包括任一信息传送介质。术语“已调制数据信号”可以被定义为其一个或多个特征以在信号中编码信息的方式被设定或更改的信号。作为示例而非限制,通信介质包括有线介质,如有线网络或直接线连接,以及诸如声学、RF、红外及其它无线介质之类的无线介质。上述的任意组合也应包含在计算机可读介质的范围内。
[0075] 当本发明主题在计算机可执行指令的一般上下文中具体化时,该实施例可以包括由一个或多个系统、计算机、或其它设备执行的程序模块。一般而言,程序模块包括执行特定任务或实现特定抽象数据类型的例程、程序、对象、组件、数据结构等等。通常,程序模块的功能可以在各个实施例中按需进行组合或分布。
[0076] 图1是示出可用于开发和执行实现状态机的计算机程序的设备的实施例100的图。实施例100是其上可以创建和调试状态机的通用计算机的简化示例。所得可执行文件可以在同一设备或另一设备上执行。
[0077] 图1的示图示出系统的各个功能组件。在某些情况下,组件可以是硬件组件、软件组件、或硬件和软件的组合。某些组件可以是应用层软件,而其他组件可以是操作系统层组件。在某些情况下,一个组件到另一个组件的连接可以是紧密连接,其中两个或更多个组件在单个硬件平台上操作。在其它情况下,连接可以通过跨长距离的网络连接来形成。各实施例可以使用不同的硬件、软件、以及互连体系结构来实现所描述的功能。
[0078] 设备102可以是可用于开发、编辑、测试和执行计算机程序的常规计算机设备。设备102示出其上可以创建和执行可执行计算机程序的开发平台。其他设备可以在不能够编辑或改变计算机程序的情况下执行在设备102上开发的计算机程序。
[0079] 设备102可具有一组硬件组件104和软件组件106。各个组件表示通用计算设备,该通用计算设备可以是服务器计算机、台式计算机、游戏控制台或其他计算机设备。在某些情况下,计算设备可以是便携式设备,例如膝上型计算机、上网本计算机、手持式移动电话或其他设备。
[0080] 设备102所创建的计算机程序可以在任何类型的硬件或软件平台上执行,这些平台包括以上所述的设备,以及诸如路由器、交换机、存储设备和其他网络基础结构等的网络设备,诸如手持式诊断仪或远程传感仪等数据收集设备,诸如移动电话和手持式游戏设备等的便携式设备,或任何其他类型的计算设备。所列设备的类型不旨在穷举可能选项,只是说明可以使用设备102来执行所开发的程序的设备类型的宽度。
[0081] 硬件组件104可包括可以使用随机存取存储器110和非易失性存储112的处理器108。硬件组件104还可以包括网络接口114和用户接口116。
[0082] 软件组件106可包括开发环境120可在其上执行的操作系统118。开发环境120可具有编辑器121和编译器130,并且可以由程序员使用来创建源代码122。在某些实施例中,编译器130可以将源代码122编译成中间代码132,可以使用运行时执行器134来执行中间代码以处理输入136并生成输出138。在其他实施例中,源代码122可以在不使用解释器进行编译的情况下来解释。
[0083] 贯穿本说明书,计算机代码的示例使用C#和部分.NET框架来说明。其他语言可具有执行类似功能的不同句法和不同命令。
[0084] 源代码122可以使用数据库查询语言126来表示状态机124。在某些情况下,数据库查询语言126可以与数据库128交互。这些状态机的示例在本说明书的后文中说明。
[0085] 图2是示出用于使用数据库查询语言来表达状态机的方法的实施例200的流程图示。实施例200是用于使用数据库查询语言和状态机技术来创建、编译和优化程序的过程的简化示例。
[0086] 其它实施例可以使用不同顺序的、附加的或更少的步骤以及不同的名称或术语来实现类似的功能。在一些实施方式中,各种操作或一组操作可以按同步或异步的方式与其它操作并行执行。在此选择的这些步骤被挑选来以简化的形式示出操作的一些原理。
[0087] 在框202中,可以定义状态机状态,并且可以在框204中定义状态机的转移函数。可以在框206中定义输出函数。
[0088] 框202到206的操作示出在定义状态机时程序员可以采用的步骤。在本说明书的后文中示出了简单状态机的两个示例,尽管状态机技术已经广泛实施。
[0089] 在框208中,可以使用数据库查询语言来定义状态机。如本说明以上所示,许多数据库查询语言运算符可以被一般化为一元体,还将这些一元体示为状态机的一般化形式。具体地,可以使用许多数据库查询语言中使用的绑定运算符来表达常规地用于函数型编程和用于表达状态机的所有一元体运算符。在C#语言和.NET框架中,等价的绑定运算符是SelectMany。
[0090] 在框210中,可以编译状态机。在编译期间,如果在框212中检测到副效应函数,则编译器可以在框214中标识副效应函数。
[0091] 在许多编程环境中,数据库查询语言中的副效应函数可以是用于执行数据库查询的非常规机制。某些数据库系统可以执行以变换函数不产生副效应的假定为基础的某些查询优化。这些优化可以包括例如重定序输入序列来优化搜索。可能无法对定义状态机的副效应函数执行这些优化,因为状态机使用定序的一组输入来创建定序的一组输出。
[0092] 可以在框214中标识副效应函数从而使得程序员可以识别或批准副效应函数的使用。如果在框216中程序员不打算使用副效应函数,则过程可以返回至框208,在那里程序员可以编辑源代码。
[0093] 如果在框216中程序员选择忽略标识消息并且在框218中不执行优化,则在框220中可以存储经编译代码,在框224中执行经编译代码,并且在框226中操作状态机。
[0094] 在在框212中未发现副效应函数的某些实施例中,可以在框220中存储程序并且在框222中执行程序。在该实施例中,所执行的程序可能不操作状态机。
[0095] 在框218中选择时,某些实施例可以执行各种优化例程。在框226中,编译器可以标识有限状态机并且可以在框228中将各种有限状态机优化应用于代码。
[0096] 可以将若干不同的有限状态机优化应用于代码来优化有限状态机的性能。这些优化包括Hopcrof最小化算法、使用隐含表以及Moore简化过程。也可以将其他优化机制应用于状态机并且可以最小化存储器消耗,提升响应事件,减少代码大小以及其他性能增强。
[0097] 图3是示出可以使用数据库查询语言来实现的状态机的示例实施例300的图示。
[0098] 实施例300的状态机示出简单的反馈循环。输入302进入存储器304,存储器可以存储当前状态。变换函数306可以产生输出308和新的状态310。新的状态310被反馈回到存储器304中。
[0099] 可以定义实施例300的状态机的反馈循环,其中输入302被定义为集合,而函数306的结果可以被定义为(输出和状态)对的集合。以上定义的函数可以将实施例300表达为:
[0100] 状态x输入*x(状态x输入→输出*x状态)→(输出x状态)*
[0101] 输入302可以被定义为输入的推集合。输入的推集合在启动函数306之前可以等待直到接收到新的输入。存储器304可以将状态310的改变与输入302的改变同步。
[0102] 图4是示出简单状态机的示例实施例400的图示。实施例400是可以仅使用数据库查询语言来实现的双态状态机的简单示例。
[0103] 实施例400的状态机是可以分析数据库表和移除表的奇数行的状态机。该状态机具有两个状态。第一状态404是‘偶’而第二状态406是‘奇’。从状态402到状态404的转移函数具有‘值’的输入406和‘返回(值)’的输出408。从状态404到状态402的转移函数具有‘值’的输入410和‘空()’的输出412。
[0104] 实施例400的状态机可以用C#表示为:
[0105]
[0106] 以上的类OnlyEvenElements(仅偶元素)使用由IEnumerable定义的输入集合并产生IEnumerable中的项的偶数元素的输出。状态机的状态是布尔表达式:非偶即奇,其中奇数被定义为Even=false(偶=假)。
[0107] 对象‘IEnumerable’可以表示来自集合T的单个值,而运算符‘Next’可以将集合递增至该集合中的下一对象。集合具有数据类型T。
[0108] 随后执行状态机,保留数据类型T的偶数编号元素而丢弃奇数编号元素。
[0109] 由OnlyEvenElements表示的状态机将难以使用其他方法来编写,但当数据库查询语言用来表达状态机时得到单个且优雅的解决方法
[0110] 以上对本发明主题的描述是出于说明和描述的目的而提出的。它不旨在穷举本主题或将本主题限于所公开的精确形式,且鉴于以上教导其它修改和变形都是可能的。选择并描述实施方式来最好地解释本发明的原理及其实践应用,从而使本领域的其它技术人员能够在各种实施方式和各种适于所构想的特定用途的修改中最好地利用本发明。所附权利要求书旨在包括除受现有技术所限的范围之外的其它替换实施方式。