SMC(The State Machine Compiler)を試す その1

デビッドハレルが1987年に状態遷移図を提唱してから四半世紀。
今でも状態遷移設計、状態遷移プログラミングが
廃れることなく、当たり前のように開発の現場で利用されています。

今日は状態遷移設計プログラミングの味方となる
SMC (The State Machine Compiler)というツールを試してみました。

SMCはテキストで書いた状態機械定義から、
ステートパターンのコードを生成してくれるツールです。


プロジェクトページ

http://smc.sourceforge.net/

バージョン

2012/3/24現在のバージョンは 6.1.0 です。

対応言語

なんと15もの言語に対応してくれます。
個人的にはC,C++,Rubyだけでも十分なのですが、
対応言語が多いのは嬉しいですね。

ついでにHTMLテーブルやGraphVizのDOTファイルまで
出力してくれるようです。

ダウンロード

SmcSrc_6_1_0.zip

インストール

SmcSrc_6_1_0.zip を伸張します。

Cygwin上のディレクトリに置きました。

 ~/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言語のサンプルを実行してみました。
次回は実際に生成されたコードを読んでみたいと思います。