GoogleAnalytics

SyntaxHighlighter

2010年9月21日火曜日

LabVIEWでオレオレ言語処理系

LabVIEW で計測・制御するVIとか書いてると、解析手法なんかが変わるたびに、いちいちVI 書き換えるのは億劫です。

こういう場合には、「スクリプト言語によるマクロ機能」を持たせるのが常道らしいですよ、奥さん。

「あぁ、~の機能だったらマクロ書いたら簡単にできるよ」とか、言ってみたいですよねw …例えそれが同僚数人しか使わないようなアプリであってもw

とはいうものの、スクリプト言語『で』書くのは楽チンでも、スクリプト言語『(の処理系)を』書くのは面倒です。なんてったって、LabVIEW には yacc がありませんからね(lex っぽいのはある)。

でも、dllで書かれた既存の言語処理系をLabVIEWから呼び出すとか、VBScriptOCXを叩く、ってのはなんか、勝ち負けで言ったら「負け」な気がします。

で、漢らしくLabVIEW自体でスクリプト言語の処理系を作ってみました。




出来上がった処理系のllbこちら。開発にはLabVIEW2009を用いています。
実装したオレオレ言語の名前はBScript」言語としています。名前に深い意味はありません。

(2010-09-28修正)
名前を「ScriBL」言語に変更しました。
冗談抜きで、今まで元言語名でググったことなかったんですが、既存の言語だったんですね。
…まるでどこかの小学校の校長みたいですねorz


処理系の使い方は、同梱の「名称未設定 1.vi」 および「名称未設定 2.vi」を参照してください。

標準入出力付き実行器.vi」 の
[プログラム]文字列にスクリプトプログラムを、
[標準入力]文字列にスクリプトへ与える標準入力を配線すれば、








こんな感じで[標準出力]文字列に出力されます。














上記スクリプトを見ればお分かりかと思いますが、この言語はCっぽいというか古いPHPっぽい感じに仕上げてあります。詳しい言語仕様は、同梱したヘルプファイルを参照してください。

言語文法は基本的にはLL(1)文法で、それを再帰降下で構文解析して、Pコードを吐かせています。でも、LabVIEWはリスト構造を扱いにくいので、構文木は作成しないで、字句解析後にいきなりスタック使って構文解析しながらPコード生成させてますw なので構文解析中に、割と簡単に無限ループに落ちてしまいます。「なかなか実行が始まらないなぁ…」という場合には、諦めて強制終了かけてくださいw また構文木作らないので、構文エラー検出能力はほとんどありません。

生成したPコードは、スタックマシンで実行しています。Pコードの詳細を知りたい酔狂な人は、実行器「プログラム構造実行器.vi」の中を覗いてください。

言うまでもありませんが、コンパイラ最適化とかガベージ・コレクションとかはありません。そんなのが必要なことをこの言語でしちゃイケません。

また、「どう考えても遅いだろうなぁ」という予想通り、えらく遅いです。
 「名称未設定 1.vi」は、再帰関数を使って1~100までの総和を求めさせるプログラムですが、Core 2 Duo E4300 / 1.80GHz の計算機で約2秒もかかります。


上記「標準入出力付き実行器.vi」では、スクリプトが実行終了するまで、制御が戻ってきません。実行経過を制御したい場合には、「標準入出力付き実行器.vi」内を参考にVIを作成してください。


この言語処理系はLabVIEWで拡張することが可能となっています。具体的には、言語で呼び出せる関数をLabVIEWで記述し、アドオンのように追加することができます。
処理系と同階層に[extras]というフォルダを作成すると、その中にあるVIを組込み関数のように利用することができます。引数の渡され方や返り値の返し方は、[extras]下の「__demo_extras.vi」を、実際の使用例は「名称未設定 2.vi」を参考にしてください。



LabVIEWで自作したグラフ描画アプリに、このオレオレ言語処理系を組み込んで、微分やピーク解析をマクロで使えるようにして、自分ではナカナカ便利に使ってますが、言語設計者本人以外の人にも使えるもんなんでしょうか?

0 件のコメント: