boostライブラリによるSEMIスタンダードの実装

Boost.Statechart(旧boost::fsm)とBoost.FSM

次のBoostライブラリのリリースではboost::fsmはBoost.Statechartというプログラム名になります。それとは別にBoost.FSMと いう名称で新しいFSMが提案されました。レビュー用のソースとドキュメントがここに有ります。
Boost.FSMは単純で実行時のパフォーマンスを目指した実装とのことのようです。以下に有限状態マシンの実装にBoost.Statechartと Boost.FSMのどちらを選択したら良いかを記述したBoost.FSMの文章を載せておきます。

Boost.FSMを利用すべき場合

  •   実装する状態機械がBoost.FSMがサポートしている階層で十分な程、複雑ではない状態を開発する場合。
  •   状態機械はスレッドに分割して実行する必要がない場合。
  •   状態機械が値を返したい場合。
  •   状態機械がテンプレートを使用したイベントハンドラーで作成したい場合。
  •   実行時の性能を最優先にする場合。

Boost.Statechartを利用すべき場合

  •   実装する状態機械が階層化した状態と直交する(orthogonal)状態で構成される場合。
  •   状態機械の開発がいくつかのチームにわかれる場合。
  •   状態機械が別スレッド間で動作する場合。
  •   状態機械がそれ自身に対してイベントを発行したい場合。
  •   UMLのサポートが必要な場合。

※単純な有限状態機械の実装を素早く行いたい場合はBoost.FSMを、より実践的な有限状態機械の実装には Boost.Statechart(旧boost::fsm)を使いましょうといったところですか。


boost-1.31のインストール/ビルド

boost-1.31の利用を始めたので、簡単なインストールの方法を記載しておきます。
より詳しくは、正式なドキュメントや手引きがBoostライブラリドキュメント翻訳プロジェクトLet's boostでいずれ公開されるでしょう。 それまでのツナギです。

先ず次のファイルをダウンロードしてください。
boost_1_31_0.zip

○ActivePythonのダウンロードとインストール
Boost.PythonのためにActiveStateのサイトからインストール形式のファイルをダウンロードし、インストールしてください。
ActivePython (私は2.3を使っています。)

○環境変数 PYTHON_ROOT へActivePythonのインストール先を設定

「スタート」→「設定」→「コントロール パネル」→「システム」→「詳細」→「環境変数」→ ・・・以下省略

○DOS窓を開き、VSVARS32.BATを実行
setコマンドにより環境変数の設定状況を出力すると、VS71COMNTOOLSまたはVSCOMNTOOLSにVSVARS32.BATの存在ディレクトリが設定されているはず です。そこで、

%VSCOMMTOOLS%\VSVARS32

と入力することで、VC++コンパイラ・コマンドの実行環境が設定されます。

○bjamによるライブラリファイルの作成
bjamは以下のサイトから実行ファイルをダウンロードできます。
sourceforge.net/projects/boost

bjam-3.1.7-1-ntx86.zip (これを解凍するとbjam.exeが得られます)

カレントディレクトリを、展開したboost-1.31.0の先頭ディレクトリへ移し、以下のコマンドを入力します。

bjam "-sTOOLS=vc7.1" stage

問題がなければ、./stage下にDLLとLIBが作成されているはずです。 環境変数PATHにstageをフルパスで登録するか、PATHに登録されているディレクトリの いずれかに*.DLLをコピーしてください。 これで、boostライブラリを利用できる環境が整いました。

stage下には同じ様な名前のLIB関数が幾つか作成されますが、コンパイルパラメータ (静的/動的、デバック/ノーデバッグ、マルチスレッド/シングルスレッドなど)が 異なる毎に異なるDLL/LIBが作成されるためです。詳しくは、boostのドキュメントを見てください。

boost-*-*.lib は静的ライブラリ
libboost-*-*.lib は動的ライブラリ

※コンパイル時にマクロ宣言が必要なライブラリもありますので注意して下さい。少し鬱陶しいですがデバックレベルを上げてやるとコンパイル時のコマンドを出力させることが出来ます。 例えば、「bjam "-sTOOLS=vc7.1" -d2」などとします。

※Python2.3を利用する場合は、bjamを実行する前に「tools/build/v1/python.jam」で定義されている「PYTHON_VERSION」を「2.2」から「2.3」へ変更してください。 「PYTHON_ROOT」と同じように環境変数として宣言しておくのも良いかと思います。


boost::fsm

boost::fsm は有限状態モデルをサポートするGENERICクラスライブラリです。 標準のBoostライブラリではなく、たたき台のためのディレクトリ(sandbox)にあります。 最終的に、標準ライブラリに組み込まれないかもしれないし、もし組み込まれるとしても 少し先になると思います。しかしながら、技術・理論的な基本はしっかりと押さえていますので、 状態遷移モデルに興味ある方は評価ならびに実装にトライしてみることをお勧めします。

boost::fsmの入手先はhttp://boost-sandbox.sf.net/fsm.zipです。

boost::fsmのドキュメントの日本語化

今のところチュートリアルだけですが、日本語化しました。ダウンロードはこちら(fsm-tutorial-jp.pdf)からお願いします。 英語は苦手な上に始めて翻訳らしきことをしたので、訳自体が非常に怪しいです。間違い等のご指摘を期待しています。 意味不明な箇所は原文を当たってください。念のため、原文に日本語訳をマージした文書も公開しておきます。

boost::fsmによるハレルステートモデルの実装

一応、SEMIスタンダードで定義されている主な遷移図に関しては、動作の確認が出来 ましたのでJYUGEMへ組み込みを始めます。GEM300に関連する状態遷移モデルのサンプルは、 ControlJobとProcessJob、Carrier、LoadPort、CIDRWを最新のboost::fsmに対応しました。

入手先はhttp://sourceforge.jp/projects/jyugemのboost-semi-*.zipです。

キャリアのように2値状態まで状態遷移クラスとして宣言することは、 やりすぎのような気もしましたが、状態変化に伴うイベント発行があるため、 処理を個々に力ずくで記述するよりは、コードの見透しと拡張性の点で優れている と考えてクラスとしました。なにより、boost::fsmの直交状態(orthogonal state)処理の 負荷が軽いことが、クラスとして実装してた最も大きな要因であります。

Boost.Pythonによるフロント処理

プログラムのフロントにPython-2.3を使っていきます。とりあえず、ControlJobとProcessJobを ラップしてみました。リフレクション機能にPythonが利用できるかの調査も兼ねています。
インタープリタ(Python)とC++のマッピングがこんなに簡単にできるとは、何とも「凄い」としか言い様がありませんデス。


boost::spiritによるVFEI構文解析

boost::spiritの評価のためにVFEI(Virtual Factory Equipment Interface)コマンド解析プログラム(sourceforge.jpのboost-semi-*.zip)を作成してみました。

K.INABA 氏いわく、「変態的(褒め言葉)・・・」と表現されていますが、 「変態」という言葉に惑わされないようにしましょう。boost::spiritを利用すると簡単にオーソドックスな字句解析プログラムが構築できます。
yacc/lexと違い作成した字句解析処理は、入力フィールドのチェックなど、部品としての使い回しが可能です。 もう、yacc/lexには戻れませんです。
VFEIコマンド解析プログラムの方は、とりあえず解析できるというレベルです。また、SECSメッセージ生成を少し意識したので、BNF構文はSEMATECHの仕様書を少しアレンジしています。

※データ型の解析部分をboost::spirit::symbolsから継承する方法へ変更すると共にboost-1.31.0(開発版)でコンパイルしました。


単位付き量取り扱いライブラリ(pqs)

boostには含まれていませんが、pqsを評価してみましたのでサンプルプログラムを掲載しておきます。
※boostライブラリに組み込まれるレビュー対象となりましたが残念ながら却下(取り下げ?)されてしまいました。 違うユニットプログラムが提案されるようです。

○pqsのダウンロード
http://www.servocomm.freeserve.co.uk/Cpp/physical_quantity

○サンプルプログラム
単位付き量取り扱いライブラリ(pqs)を使い、半導体製造装置ではおなじみの圧力(PascalとTorr)の変換処理を作成してみました。
いたって簡単ですね。これで、単位変換処理についてあれこれ悩むことも少なくなります。


#include "physical-quantities/pqs.hpp"
using namespace physical_quantities;

template
ValueT torr2pa(ValueT v)
{
  q_pressure::torr  torr(v);
  ValueT pas_val = static_cast(floor(q_pressure::Pa(torr)() + 0.5));

  return  pas_val;
}

template<>
double torr2pa(double v)
{
  q_pressure::torr  torr(v);
  return  q_pressure::Pa(torr)();
}


template
ValueT pa2torr(ValueT v)
{
  q_pressure::Pa    pa(v);
  ValueT torr_val = static_cast(floor(q_pressure::torr(pa)() + 0.5));
  return torr_val;
}

template<>
double pa2torr(double v)
{
  q_pressure::Pa    pa(v);
  return q_pressure::torr(pa)();
}

ソースファイルは、これ(boost-semi-*.zip)です。


  HOME