こういう場合には、「スクリプト言語によるマクロ機能」を持たせるのが常道らしいですよ、奥さん。
「あぁ、~の機能だったらマクロ書いたら簡単にできるよ」とか、言ってみたいですよねw …例えそれが同僚数人しか使わないようなアプリであってもw
とはいうものの、スクリプト言語『で』書くのは楽チンでも、スクリプト言語『(の処理系)を』書くのは面倒です。なんてったって、LabVIEW には yacc がありませんからね(lex っぽいのはある)。
でも、dllで書かれた既存の言語処理系をLabVIEWから呼び出すとか、VBScriptのOCXを叩く、ってのはなんか、勝ち負けで言ったら「負け」な気がします。
で、漢らしくLabVIEW自体でスクリプト言語の処理系を作ってみました。
出来上がった処理系のllbはこちら。開発にはLabVIEW2009を用いています。
実装したオレオレ言語の名前は
(2010-09-28修正)
名前を「ScriBL」言語に変更しました。
冗談抜きで、今まで元言語名でググったことなかったんですが、既存の言語だったんですね。
…まるでどこかの小学校の校長みたいですねorz
処理系の使い方は、同梱の「名称未設定 1.vi」 および「名称未設定 2.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 件のコメント:
コメントを投稿