代码之家  ›  专栏  ›  技术社区  ›  Richard Pennington

向类C++语言添加状态机支持的建议

  •  1
  • Richard Pennington  · 技术社区  · 16 年前

    最近,作为我的一天工作的一部分,我一直在学习IBM RHAPSODY,并使用它从UML中生成C++代码。

    昨天我突然想到,如果想把状态机支持添加到C++编译器中,那就太酷了,所以我在这里记下了一些注释: http://ellcc.org/wiki/index.php/State_machines_and_Active_Classes

    我这样做的动机是:

    1. 编译器可以比当前的RHAPSODY/普通C++编译器做更好的语义检查(更好的错误检查)。
    2. 当编译器本身理解状态机结构时,有许多优化的可能性。

    你对这个建议有什么看法?它看起来可读吗?看起来值得吗?


    编辑:

    谢谢你的回答,建议使用特定的库来实现状态机,但这不是我的问题。我已经使用我编写的库和代码实现了许多状态机。

    我真的在寻找一个关于C++语言的状态机扩展的设计、想法等,而不是这个改变是否适合添加到标准C++。可以将其视为特定于域的扩展,其中我的域是实时控制应用程序。

    我已经开始在编译器中实现扩展,如下所述: http://ellcc.org/wiki/index.php/State%5Fmachines%5Fand%5FActive%5FClasses

    到目前为止,这个概念从提出到实现都没有太大的变化,但在细节上有一些变化,我正在完善我对问题语义的理解。

    然而,时间会告诉我们整个概念是否有价值

    6 回复  |  直到 16 年前
        1
  •  9
  •   anon anon    16 年前

    除了少数例外,C++传统上是使用类库扩展的,而不是新的关键字。使用这样的库可以很容易地实现状态机,所以我认为你的建议没有太多机会。

    我在你的提案中看到的一个问题是使用“goto”去另一个州。如果我想在状态转换中在自己的代码中使用goto,会发生什么?

        2
  •  2
  •   Scott Langham    16 年前

    在发展你所做的方面做得很好。你可能已经完成了一些事情,但我怀疑它是否会进入C++。大多数使其成为语言本身的更改只是为了允许人们编写更有用、功能更强大的库。

    这里有一个为状态机提供支持的库。我还没有尝试过,但你可能会感兴趣,你可以将你的想法与这样的图书馆结合起来,让其他人利用它。

    http://www.boost.org/doc/libs/1_34_1/libs/statechart/doc/index.html

    让新想法不断涌现。

        3
  •  2
  •   Frank Krueger    16 年前

    您应该看看另一位智能开发人员是如何将状态机支持添加到类C语言的: UnrealScript Language Reference . 见“国家”一节。

    UnrealScript支持当前位置的状态 世界上的演员总是在其中 而且只有一个州。它的状态反映了 像“StandOpenTimed”和 “定时”。典当有好几种 “死亡”、“攻击”等状态, 和“流浪”。在UnrealScript中,您可以 演员处于那种状态

        4
  •  1
  •   Charles Salvia    16 年前

    这是一个有趣的想法,但我认为你最好有机会创建自己的特定于域的语言,而不是正式扩展C++的状态机。C++是一种非常通用的编程语言。我认为Boost已经证明C++足够灵活,可以使用库来很好地实现大多数功能。它也发展得非常缓慢,以至于标准C++仍然没有内置线程支持,如2009,(计划在0x)。所以委员会不太可能考虑这一附加时间。

        5
  •  1
  •   Frunsi    16 年前

    我也不确定如何提供更好的语义检查。我怀疑您是否可以应用许多有用的代码优化。

    然而,为了允许更好的优化和语义检查,您还应该用一个新的关键字(例如。 __change__ newState ),并禁止状态更改的转到!像往常一样允许本地跳转。

    然后编译器可以提取可能的转换列表。

        6
  •  1
  •   MSalters    16 年前

    1. 实际上没有关键字来声明和定义实际的状态机!您是否假设一个单一的全局状态机(从而假设一个单一的全局状态)?这与什么有关系 __active__ ?

    2. 定义的事件和状态之间似乎有某种联系,但我看不出它是如何实现的。

    3. 为什么需要线程和计时器?状态机的一些用例可能会从中受益,但是一个好的建议应该将它们分开。最重要的是,这应该允许使用标准的C++0x线程。

    就我个人而言,我将扩展枚举语法:

    enum Foo {
      red, blue, green; /* Standard C++ so far - defines states. State list ends with a ; not a , */ 
      Foo() { *this = red; } // Reuse ctor syntax, instead of __initial__
      ~Foo() { } // reuse dtor syntax, instead of __onexit__
    
      void Bar() {/**/} // Defines an event, no return value. Doesn't need keyword __event__
    };
    

    很自然,现在可以在头文件中声明事件,并在.cpp文件中定义它们。我甚至不需要在这里提出语法,任何C++程序员都可以在这里猜到。为组合状态添加一点继承语法:

    enum DrawingObject : public Shape, public Color { /** } // allows (red && circle)
    

    您的提案几乎已经到了这个地步,没有任何新的关键字,所有这些都是通过重用已经熟悉的语法实现的。

    推荐文章