SMC(The State Machine Compiler)を試す その1
デビッドハレルが1987年に状態遷移図を提唱してから四半世紀。
今でも状態遷移設計、状態遷移プログラミングが
廃れることなく、当たり前のように開発の現場で利用されています。
今日は状態遷移設計プログラミングの味方となる
SMC (The State Machine Compiler)というツールを試してみました。
SMCはテキストで書いた状態機械定義から、
ステートパターンのコードを生成してくれるツールです。
プロジェクトページ
バージョン
2012/3/24現在のバージョンは 6.1.0 です。
対応言語
なんと15もの言語に対応してくれます。
個人的にはC,C++,Rubyだけでも十分なのですが、
対応言語が多いのは嬉しいですね。
ついでにHTMLテーブルやGraphVizのDOTファイルまで
出力してくれるようです。
ダウンロード
SmcSrc_6_1_0.zip
インストール
SmcSrc_6_1_0.zip を伸張します。
~/work/smc
どうやって使うの?
README.txtを読んでみるとJavaが必要なようです。
JRE (Standard Edition) 1.6.0 or better.
SMC自体のビルド等は要らなそうです。
実行ファイルはどれ?
~/work/smc/bin/Smc.jar
JAR = Java Archiveなんだけどなんでbinにあるのかな
と思ったら、JARは圧縮ファイルなんだけど
そのまま実行できるとか。ふむふむ。
サンプル
Cのサンプルを実行してみます。
% cd ~/work/smc/exsamples/C/EX1 % make java -jar ../../../bin/Smc.jar -c -g AppClass.sm gcc -g -I../../../lib/C -o checkstring AppClass_sm.c AppClass.c main.c
Smc.jarにAppClass.smを食わせて、AppClass_sm.c を生成し、
gcc でコンパイルされました。
実行してみましょう。
% ./checkstring 00000 The string "00000" is acceptable
動きました。
で、何のサンプルでしょう?
README.txtを見てみると...
This state machine "recognizes" the string 0*1*
(which includes the empty string).
とあるので文字列が 0個以上の0に続き、0個以上の1であれば
真となる状態遷移機械のようです。
% ./checkstring 0 The string "0" is acceptable % ./checkstring 1 The string "1" is acceptable % ./checkstring 000111 The string "000111" is acceptable % ./checkstring 010 The string "010" is not acceptable
しっかり動いています。
テキストで定義した状態遷移マップを見てみましょう。
Start { Zero Zeros {} One Ones {} Unknown Error {} EOS OK {Acceptable();} } Zeros { Zero Zeros {} One Ones {} Unknown Error {} EOS OK {Acceptable();} } ...(以下略)
状態名
{
イベント 遷移先状態 {アクション();}
イベント 遷移先状態 {アクション();}
イベント 遷移先状態 {アクション();}
}
というルールです。わかりやすい。
遷移図を出力することもできます。
% make png
状態遷移マップから、状態遷移のコードが生成されるのは
わかりますが、状態遷移条件や、アクションの内容については
自動生成されるはずがありません。
なので、プログラマがどこかに記述しているはずです。
と言うわけで今回は、SMCのインストールと、
C言語のサンプルを実行してみました。
次回は実際に生成されたコードを読んでみたいと思います。