C++ Boost状态图与Samek的比较';s";“量子状态图”;

C++ Boost状态图与Samek的比较';s";“量子状态图”;,c++,boost,comparison,state-machine,C++,Boost,Comparison,State Machine,我对米罗·萨梅克(Miro Samek)的“量子层次状态机”(Quantum Hierarchical State Machine)有过大量接触,但我想知道它与Boost状态图相比如何——正如与这两种状态图都有过合作的人所说。有人接受吗?我不熟悉Boost状态图,但我觉得Samek搞错的是,他将转换操作与状态上下文关联起来。过渡操作应在状态之间进行 要理解我为什么不喜欢这种风格,需要举个例子: 如果一个状态有两个不同的转换,该怎么办?那么事件是不同的,但是源状态是相同的 在Samek的形式主义中

我对米罗·萨梅克(Miro Samek)的“量子层次状态机”(Quantum Hierarchical State Machine)有过大量接触,但我想知道它与Boost状态图相比如何——正如与这两种状态图都有过合作的人所说。有人接受吗?

我不熟悉Boost状态图,但我觉得Samek搞错的是,他将转换操作与状态上下文关联起来。过渡操作应在状态之间进行

要理解我为什么不喜欢这种风格,需要举个例子:

如果一个状态有两个不同的转换,该怎么办?那么事件是不同的,但是源状态是相同的

在Samek的形式主义中,转换操作与状态上下文相关联,因此在两个转换上必须有相同的操作。通过这种方式,Samek不允许您表达纯Mealy模型


虽然我没有提供与Boost StateCharts的比较,但我提供了一些关于如何评价StateCharts实现的详细信息:通过分析构成实现的各个组件之间的耦合。

我对它们都很了解,尽管细节程度不同。但我们可以从我遇到的差异开始,也许还有更多:-)

范围 首先,Quantum平台为UML状态机提供了完整的执行框架,而boost::statechart只帮助状态机实现。因此,boost::statechart提供了与Quantum平台(QEP)的事件处理器相同的机制

UML一致性 这两种方法都设计为符合UML。然而,Quantum平台在各自状态的退出动作之前执行转换动作。这与UML相矛盾,但在实践中,这很少是一个问题(如果开发人员知道的话)

statechart是根据UML1.4设计的,但据我所知,执行语义在UML2.0中没有以不兼容的方式改变(如果我错了,请纠正我),所以这也不应该是一个问题

支持的UML特性 这两种实现都不支持完整的UML状态机特性集。例如,QP中不直接支持并行状态(aka和states)。它们必须由用户手动实现。statechart不支持内部转换,因为它们是在UML2.0中引入的

我认为每种技术支持的确切特性都很容易在文档中找到,所以我不在这里列出它们

事实上,两者都支持最重要的状态图特性

其他差异 另一个区别是QP适合嵌入式应用程序,而boost::statechart可能适合,也可能不适合。FAQ上说“视情况而定”(参见),但对我来说,这已经是一个很大的警告信号

此外,您还必须进行特殊测量,以使boost::statechart具有实时功能(请参阅常见问题)


我知道的差异太多了,告诉我如果你发现更多,我会感兴趣的

我也与这两位合作过,让我详细说明一下theDmi的伟大答案:

跟踪能力: QP还实现了一个强大的跟踪功能,称为QSpy,它支持具有过滤功能的非常细粒度的跟踪。有了boost,你必须自己滚动,而且永远不会超过某个粒度

现代C++风格和编译时错误检查: 虽然Boost MSM和Statecharts在您出错时会给出可怕且非常长的错误消息(我很羡慕模板天才编写的所有代码),但这比运行时错误检测要好得多。QP使用Q_ASSERT()和类似的宏来执行一些错误检查,但一般来说,使用QP时必须多加注意,代码的持久性较差。 我还发现在QP中广泛使用预处理器需要一些时间来适应。可能需要使用预处理器而不是模板、虚拟函数等,因为在嵌入式系统中使用QPS,其中C++编译器常常更差,硬件也不那么虚拟功能友好,但有时我希望Samek先生能制作C、C++和现代C++版本;谣传我不是唯一一个讨厌预处理器的人

可扩展性: Boost MSM不适用于20个以上的状态,状态图对状态几乎没有限制,但一个状态可以具有的转换量受到mpl::vector/list约束的限制。QP可扩展到疯狂的程度,几乎无限的状态和转换是可能的。还应该注意的是,QP状态机可以分布在许多文件上,并且依赖性很小

模型驱动开发: 由于其极强的可扩展性和灵活性,QP更适合模型驱动的开发,请参阅本文以获得详细的比较:

嵌入式设计:
在我看来,QP是任何嵌入式设计的唯一解决方案。它的文档记录到最底层,因此它易于移植,端口可用于许多常见处理器,并且它带来了状态机功能之外的许多东西。我特别喜欢原始线程安全队列和内存管理。我从未见过我喜欢的嵌入式内核,直到我在QP中尝试了RTC内核(尽管应该注意的是,我还没有在生产代码中使用它)

我只知道一件事,在使用了boost之后,代码变得非常笨拙,并且很快就很难管理。状态的声明性语法一点也不自然。至少我没发现是这样。@Noah:有趣的评论。萨梅克的方法可以很好地扩展;大的状态图和小的一样容易处理。这个答案是错误的。我的实现技术支持转换操作(Mealy自动机)和与状态相关的进入/退出操作(Moore自动机)。例如,Dobbs博士的文章“UML at$10.99”(UML at$10.99)展示了一个行人过街状态机,该状态机同时使用内部转换操作和入口/出口操作--米罗Samek@use