組み込みC言語プログラマのためのmruby入門(後編) ―― mrubyの組み込み方とJavaとの違い
本連載では,主にC言語で開発している組み込みプログラマを対象に,Rubyおよびmrubyについて解説している.今回は,mrubyをアプリケーションに組み込む方法について概要を説明する.また,組み込みJavaなどの類似技術との違いについても述べる.(編集部)
技術解説・連載「組み込みC言語プログラマのためのmruby入門」 バック・ナンバ
前編 Rubyとmruby,何が違う? どう違う?
中編 mrubyをお手軽に体験する!
3.mrubyの組み込み方
mrubyのコアはバイトコード処理系です.前回は,対話的にmrubyのプログラミングができるアプリケーションmirb.exeを使いましたが,mirbは文を入力するたびに内部でバイトコード・コンパイラが実行され,バイトコード・インタプリタにより実行されています.mruby.exeも同様の機能を持っていますが,同時に事前コンパイルされたバイトコードを入力とすることもできます.また,バイトコードを生成する機能だけを切り出したコンパイラがmrbc.exeです.
本稿執筆時点では,mrubyのコアのAPI仕様はまだ流動的です.そこで本稿では,将来においても変更が行われないであろうと予測できるところを中心に,mrubyの組み込み方について紹介します.具体的には,mrbcによるバイトコードの生成と,実行環境である構造体mrb_stateへの組み込み方を説明します.
それでも,関数の引き数の変更などは起こる可能性があります.後述するように,mrubyバイトコードの代表的な利用例はmruby自身です.mirb,mruby,mrbcといったツールのソース・コードも参考にしてください.
●mrbcからバイトコードを出力する
mrbcが出力するバイトコードの形式は2通りあります.一つはRiteというオリジナルの形式,もう一つはC言語形式です.C言語形式は,さらに配列形式と関数形式の2種類に分かれます.
mrbcは,表1に示すコマンド・ライン・オプションを持っています.-Bオプションや-Cオプションを与えないでmrbcを呼び出すと,Rite形式のバイトコードが得られます.Rite形式の場合,-oオプションを付けないと,ソース・コードの拡張子をmrbに替えたファイル名が出力先となります.
表1 mrbc.exeのコマンド・ライン・オプション
オプション名 | 機能 |
-c | 文法チェックのみ |
-o<outfile> | コンパイル結果の出力ファイル名を<outfile> |
-v | バージョンを表示し,冗長モードにする注1 |
-B<symbol> | C言語の配列として扱えるソース・コード形式で出力する.<symbol> |
-C<func> | C言語の関数として扱えるソース・コード形式で出力する.<func> |
--verbose | 冗長モードにする注1 |
--version | バージョンを表示する |
--copyright | 著作権情報を表示する |
注1:冗長モードにすると,実行(ファイル出力)時に構文解析木や出力結果のアセンブリ表記など,詳細な情報を表示する.
例として,リスト1のようなRubyのプログラムを取り扱います.aに1を代入し,aに5を加えて表示するものです.
リスト1 例として用いるRubyのプログラム(mrbc_test.rb)
p a + 5
コマンド・プロンプトでmrbc.exeの入っているフォルダに移動するか,mrbc のあるディレクトリを Path 環境変数に追加しておき,
$ mrbc mrbc_test.rb
を実行すると,mrbc_test.mrbが生成されます.このファイルの中身は,Intel HEXフォーマットやMotorola S-recordフォーマットのように,ASCII文字列で表記されています(リスト2).
リスト2 Rite形式のバイトコード(mrbc_test.mrb)
10000A00000004A82E1000000000000000000020001p0001+7AC100000000