シミュレーション、CAD、画像処理、エディタなどのアプリで Tcl, Scheme, Lua, Python, LISPなどが domain-specific language (DSL) として採用されていて、 パラメーターサーチ、 繰り返し処理、 機能拡張、 カスタマイズ、 自動化など 複雑な処理をしたい時に便利なことがあります。 このgistではC言語でmrubyを組み込んだ 超簡単な等速直線運動をするだけのシミュレーションのプログラムを例示してみます。 マイコンに「組み込む」のではなく、パソコンのプログラムに「組み込む」かんじです。
シミュレーターの入力ファイルはこんなかんじです:
v10 = Constantv.new(10.0, 25.0)
v10.print()
(0..3).each{|i|
v10.evolve(time_step: 2.0*0.5**i).print()
}
v10.evolve( time_step: 0.125, temperature: 30.0).print()
このgist文書の著者は週末に Fortranで強誘電体のシミュレーターを書いたりしています。 ユーザさんはわがままで外部電場や外部応力や温度を時間の関数として自由に設定したがります。 そんな時にRubyでコントロールできたら便利だと思っています。
mrubyを利用するのは初めてなのでアドバイスなどをいただけないかと思い mrubyファミリ (組み込み向け軽量Ruby) Advent Calendar 2024 に挑戦してみます。
シミュレーターにDSLを導入するにあたって次のような要件があると思います。
- 独自の文法でなく、よく知られたスクリプト言語にして説明を大幅に削減する。
- スクリプト言語のバージョンアップなどで混乱を招かないために、スクリプト言語はプログラムに組み込まれていること。
- キーワード引数を使ってパラメーターを簡単に与えられる。
- キーワード引数の綴り間違いを含め、文法エラーを適切に指摘してくれる。
これらの要件を満たすにはmrubyがうってつけだと思います。
たぶん以下を読んで見よう見まねでプログラミングすればmrubyをCのプログラムに組み込むことができます。
- まつもとゆきひろ直伝 組込Ruby「mruby」のすべて 総集編 Kindle版
- mrubyのドキュメント、特に mruby/doc/capi/html/mruby_8h.html 。mruby.org にあるものは古いことがあるので、手元で
rake doc
したものを参照すること。 - mruby/mrbgems/mruby-bin-mruby/tools/mruby/mruby.c
- mruby/examples/mrbgems/cdata_extension_example/src/example.c
LinuxでもWindowsのCygwinでもmacOSでも
- gcc(Cコンパイラ)
- rake(RubyといっしょにインストールされるRuby版make)
- doxygen(ソースコードのコメントからドキュメントを生成するツール)
- graphviz(グラフ構造の画像を描いてくれるツール)
があれば
git clone https://github.com/mruby/mruby.git
cd mruby
CC=gcc rake
rake doc
build/host/bin/mruby --version #動作確認
build/host/bin/mruby-config --cc #後にMakefileに書き込むCコンパイラ
build/host/bin/mruby-config --cflags #後にMakefileに書き込むFLAGSを確認
build/host/bin/mruby-config --libmruby-path #後にMakefileでリンクするアーカイブファイルを確認
で簡単にコンパイルできます。
等速直線運動をするだけのCのプログラムとMakefileとシミュレーターの入力スクリプトが本gistに置いてあります。
クラスConstantvのインスタンスを生成する時に定速度と初期温度を与えて、
evolveメソッドで時間発展させます。
タイムステップと温度をそのキーワード引数で任意に変更できます。
キーワード引数temperature:
を与えなければ前回のイテレーションから温度を変更しません。
ただし、本シミュレーションでは温度は飾りです。
温度は等速直線運動になんら影響を与えません。
!mruby.md
このgist文章Makefile
constantv.c
メインプログラムconstantvclass.c
クラスの定義constantvclass.h
そのヘッダファイルv10.constantv
シミュレーターのインプットファイル
mruby内の例を組み合わせたコードなので、コードのライセンスはmrubyと同じMIT licenseです。
コマンドライン引数の有無やfoepn()の成否などはチェックしていません。
LinuxでもWindowsのCygwinでもmacOSでも以下のようにコンパイルと実行ができます。
Gnuplotで結果をプロットもしています。
入力のv10.constantv
に故意に文法エラーやキーワード引数のスペルミスを入れると
エラーメッセージとともに止まることも試してみてください。
$ git clone https://gist.github.com/8b0ebccab3fe41ada28ea0e7fb0b6c23.git constantv
$ cd constantv
### 自分の環境に合わせてMakefileの中のCC, CFLAGS, CPPFLAGS, LDFLAGSを編集 ###
$ make clean
$ make
$ ./constantv v10.constantv | tee v10.data
#BEGIN v10.constantv
#i t x T
0 0.000 0.00 25.00
1 2.000 20.00 25.00
2 3.000 30.00 25.00
3 3.500 35.00 25.00
4 3.750 37.50 25.00
5 3.875 38.75 30.00
#END v10.constantv
$ gnuplot
gnuplot> plot 'v10.data' using 2:3 with lp, '' u 2:4 w lp
gnuplot> quit
$
C++のクラスやメソッドを半自動的にmrubyに変換(bind)してくれるmrubybindが便利そうなので 別のgist文章で調査しました。
C言語でmrubyを組み込んだ 超簡単な等速直線運動をするだけのシミュレーションのプログラムを書いてみました。 mrubyを利用するのは初めてなのでアドバイスをいただけたら幸いです。 Rubyで制御できるシミュレーション、CAD、画像処理、エディタなどさまざまなアプリができてくるとよいですね。