追記: リポジトリ名を変えました。
https://github.com/ksss/mruby-research
名前は仮だけどmruby-mrubyというライブラリを書きはじめた。
https://github.com/ksss/mruby-mruby
mrubyにとって得意なことの一つにCのAPIをいい感じの言語(すなわちRubyの文法)で呼び出せることがある。
カーネルのシステムコールを呼べばmruby-ioやmruby-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をあらわすフラグが立っているかチェック
と、要するにネタライブラリなので、名前とともに皆様のおもしろアイデアをお待ちしております。