Boost.MSM (1)

公開:2013-01-08 21:42
更新:2020-02-15 04:37
カテゴリ:boost,windows,c++

Boost.MSMというのはそもそも何なのかと言うと、UMLのステートチャートをC++言語で書けるようにするためのライブラリである。いや、ステートチャート図をコードに落としやすくするライブラリというべきなのかもしれない。

私はUML自体あんまりよくわからないが、状態を管理しながらの動作というのはよくあることなので、そういうのには使えるわけだ。

MSMは状態マシンの定義を行うフロントエンドと、それをもとに状態マシンを生成するバックエンドという2つの大きな部分に分かれている。フロントエンドはさらに3つのパート、Basic/Functor/eUMLに分かれている。

MSMでは状態は「型」で持つ。ふつうは状態は変数で持つよね。このへんが「メタ」なライブラリらしいところ。もちろん型だけだと実行時に状態を判定できないので、それを数値に変換する機構も持っている。

MSMではある状態の状態マシンにイベントを渡すとどういう状態に遷移し、その際どのような動作をするか、その遷移を行う条件(ガード条件)を遷移テーブルで定義する。このテーブルはmpl::vectorで定義するのだ。いやーメタだなこれは。このテーブルに従って状態マシンはいろいろな動きをしてくれるわけだ。こういうのを事前に定義しておくと、状態に関するコードをあんまり、というかほとんど書かなくてもよくなるのだ。状態遷移をテーブルで定義するのだから書かなくてもよくなるのは当たり前なのだが、同じ処理を書くためのコード量に違いが出てくる。もちろんMSMのほうが少なくなるということだけど。

このテーブルの書き方が先ほどのBasic/Functor/eUMLの3種類あるのだ。Basicはアクションやガード条件をメンバ関数で定義する。FunctorはFunctorで定義する。最後のeUMLというのはこれがまたメタなやつで、UMLの数式風にアクションやガード条件を定義できるというものである。eUMLは実験的な実装らしく実用的ではなさそうだが、これはメタ中のメタ、略してメタメタな書き方(もうなんというかこれってC++なの?的な書き方)ができるので非常に興味深かったりするが、私は深入りしないことにする。