我很好奇是否有一种编程语言将状态机(类似于boost :: statechart)作为主要语言构造.
类比 - c#有委托,其中java使用观察者模式,C有回调.Perl和python有内置哈希,而C++和java需要一个库.
更新:
这应该是C++,C#,Java,Lisp等意义上的通用编程语言......
我的意思是"成熟"的状态机,在Harel形式主义或UML状态图或boost :: statechart的层面上都有所有的铃声和口哨声.
Ragel是一种状态机语言.IOW,它不是一种也支持状态机的语言,它是一种只支持状态机的语言.这显然意味着它不是图灵完整的,但谁需要呢?
更准确地说,Ragel是一个状态机编译器,它以类似regexp的语言描述状态机,并用C,C++,Objective-C,D,Java或Ruby生成该状态机的实现.(想想yacc
但是对于状态机而不是LALR(1)表解析器.)Ragel的主要目的是解析二进制协议(例如网络协议或磁盘文件格式),但它也可以用于文本.
使用Ragel的一个着名例子是用于Ruby的Mongrel webserver:它的HTTP内核是用Ragel编写的,这使得它非常快速和安全.事实上,HTTP内核非常好用,它在不同的应用程序中被重复使用了很多次:Thin,Unicorn和Rainbows也是网络服务器,实际上是Mongrel的直接竞争对手.Ebb是反向HTTP代理.RFuzz是一种用于Web应用程序的模糊测试工具.此外,一些安全工具使用它.
Ragel还允许将主机语言中的代码嵌入到状态机中,从而使其成为图灵完备的,并且不仅能识别而且能够解释协议.
通常,通过协程(例如Lua)或continuation(例如Scala)或(例如PHP)或适当的尾调用(例如Scheme)支持高级用户定义控制流的每种语言GOTO
都可用于轻松实现状态机.(Generators(Python)aka iterators(C#),它们基本上是"糟糕的协同程序",可能会也可能不会工作,这取决于你对"工作"的定义.)以及任何具有灵活语法(例如Ruby)或支持metasyntactic抽象的语言(例如Clojure)可用于描述状态机.(对非ASCII标识符的支持也有帮助,因此您可以使用状态机的实际箭头.)
这意味着如果你结合两个,并使用支持语言都尾调用和 metasyntactic抽象,你会得到非常好的状态机,而不需要本地语言支持.Shriram Krishnamurthi在首届轻量级语言会议上发表了一篇名为"Perl之前的猪"的着名演讲,其中他演示了在计划中实施FSM.(这是幻灯片,录音和解释代码的纸张).代码本身是26行(实际上很短的行)宏,它允许你编写这样的代码:
(define my-regex (automaton init [init : (c ? more)] [more : (a ? more) (d ? more) (r ? end)] [end : accept]))
这是与正则表达式对应的状态机的规范c(a|d)*r
.它不仅是一个规范,而且是一个实现该状态机的可运行程序.
我可以这样称呼它:
(my-regex '(c a d a d d r))
在这种情况下得到结果#t
(这是方案说的true
).
基于David Harel的StateChart形式主义(支持分层和并行状态机),有一种新的基于W3C XML的状态机语言SCXML.
Apache Commons有一个基于Java的SCXML实现:
Commons SCXML是一个旨在创建和维护Java SCXML引擎的实现,该引擎能够执行使用SCXML文档定义的状态机,同时抽象出环境接口.