mrubyのmrubyバインディングmruby-mruby

追記: リポジトリ名を変えました。

https://github.com/ksss/mruby-research


名前は仮だけどmruby-mrubyというライブラリを書きはじめた。

https://github.com/ksss/mruby-mruby

mrubyにとって得意なことの一つにCのAPIをいい感じの言語(すなわちRubyの文法)で呼び出せることがある。

カーネルシステムコールを呼べばmruby-iomruby-processになり、 ApacheのC-APIを呼べばmod_mrubyになる。

他に何かいいC-APIを提供するライブラリは無いだろうかと思ったら灯台下暗し、なんだmrubyがあるじゃんということでmrubyのC-APIをmrubyで呼んでみたのがmruby-mrubyだ。

「それってただのmrubyじゃないの?」というのもその通り、ただのmrubyである。だがしかし、「C-APIでは公開しているけどRuby側からは呼べないし呼べるようにする意義もない」というような隠れデータはたくさんある。

例えばmrubyのコンパイルオプションとしてMRB_NAN_BOXINGや、MRB_INT64などがある。

これらのオプションが「あれ?今どういうオプションでコンパイルしたんだっけ?」と思ったら、残念ながらmrubyのコードを見るしか無い。もしコードが手元に無く実行バイナリだけだったら……考えたくもないが知る術は永遠に失われている。人類の危機。

mruby-mrubyではRubyコード上でどのオプションでコンパイルしたのかすぐに確認できるしそれによって分岐も書ける。便利。

MrbState.mrbconf #=> {"MRB_USE_FLOAT"=>false, "MRB_INT16"=>false, "MRB_INT64"=>false, "MRB_NAN_BOXING"=>false, "MRB_ENDIAN_BIG"=>false, "MRB_WORD_BOXING"=>false, "MRB_FUNCALL_ARGC_MAX"=>16, "MRB_HEAP_PAGE_SIZE"=>1024, "MRB_USE_IV_SEGLIST"=>false, "MRB_IVHASH_INIT_SIZE"=>8, "MRB_GC_TURN_OFF_GENERATIONAL"=>false, "KHASH_DEFAULT_SIZE"=>32, "POOL_ALIGNMENT"=>4, "POOL_PAGE_SIZE"=>1600, "MRB_STR_BUF_MIN_SIZE"=>128, "MRB_GC_ARENA_SIZE"=>100, "MRB_GC_FIXED_ARENA"=>false, "ENABLE_STDIO"=>true, "DISABLE_STDIO"=>false, "ENABLE_DEBUG"=>false, "DISABLE_DEBUG"=>true}

mrubyの内部実装の学習・デバッグ用にも力を発揮する。

例を幾つか上げるとこんな感じ。

MrbState::MrbValue.size
#=> sizeof(mrb_value)の結果

123.to_RBasic.tt
#=> 現在のオブジェクトのC内でのタイプ表現

"foo".to_RString.embed?
#=> 構造体に直接文字列を組み込むEmbed-Stringをあらわすフラグが立っているかチェック

と、要するにネタライブラリなので、名前とともに皆様のおもしろアイデアをお待ちしております。

https://github.com/ksss/mruby-mruby