けいぞうのメモ帳

言語設計のお勉強

mrbgemの話それから標準ライブラリの話

少なかった

 mrubyコードリーディングをする際、mruby周りを調べました。
その時、よくmrbgemなるものがある事をよく耳にしました。
なんじゃろほいと謎に思いながら放置していたのですが、
mruby advent calendar を漁っていた時に
断片的な情報を拾っていって把握したのです。
というか主にこれ
mruby で C 言語の構造体をラップしたオブジェクトを作る正しい方法 - Qiita
しかし、意外にmrbgem周りの説明をした記事が少なかったので
コードリーディングの記事を書く準備のついでつらつらとまとめておきます。
見つけた他の方のまとめ
mrbgemsの使い方 - shercoの日記

Rubyrubygemsに対してmrubyのmrbgems

 名前からしてそんな感じだと思っています。
もともとmrubyは最小の処理系に必要な機能をmrbgemでくっつけていく使い方を
押しているようで、それをbuild_config.rbで指定して
build出来るようになっています。
mrubyのビルド方法 - Qiita

経緯も含めてこちらにありました。詳しいconfigの設定方法も書いてあります。

外部ライブラリ、advent calendarでは外部モジュールとの
言い回しが多用されていました。
mruby では、単純にLibraryとだけ書かれています。
mrbgem自体の実装は、C拡張とRuby拡張、C&Ruby拡張の3つがあります。
書き方としてはRubyで出来ないところはCでやるのが良いとされているようです。
mrbgemsがなければioもrequireも出来なかったり、
逆にあればhttp2やmysql、ロードバランシングとかもできたりとっても楽しい感じです。
#18 mruby-ipvs を実装し卒業論文を書きました - rrreeeyyy.com
人間とウェブの未来 - Trusterd: HTTP/2 Web Server scripting with mruby v0.0.1 リリースしました
しかし、コミッタの皆さんは、Rubyで出来る事すべてをmrubyで実現させるつもりも
なかったりするのでどうなっていくのかは私にはわかりません。なるようになると思います

特徴

 またmrbgemsの特徴として、処理系と静的リンクをすることがあります。
先に書いたちょろっと書いた"必要な機能をmrbgemでくっつけていく使い方"です。
この辺がRubygemsとの違いですね。(requre で動的にリンクする)
mattn/mruby-require · GitHub があるにはあるのですが
これも外部モジュール、つまりmrbgemです。

build_config.rbに

conf.gem  => "mruby-*" 

のように書き加えるとmakeの際に含まれます。

conf.gem :github => "誰かさん/mruby-*"
conf.gem :git => "git@URL"

のように指定するとDLからしてくれる素敵機能もあります。
この辺の機能のためにmrbgemsは名前に

mruby-*

であることが強いられているらしい。

 また、mrubyの開発はガンガン行こうぜ!が基本なので
処理系内部の変更によって動かなくなっているmrbgemsが割と存在しています。
matsumotoryさんがLinux系でこけるものをコメントアウトしたもののCI。
mrbgem_test_ci/.travis_build_config.rb at master · matsumoto-r/mrbgem_test_ci · GitHub
ほかにこけるのがあるかは観測してみないと分からない。

標準ライブラリの話

 mrubyはRubyとしての最小の処理系です。けれど普通にmakeするときに
用意されているmrbgemsが存在しています。標準ライブラリと言えばよいのかな。
mruby/mrbgems/* にあります。

default.gembox
full-core.gembox
mruby-array-ext/
mruby-bin-mirb/
mruby-bin-mruby/
mruby-bin-mruby-config/
mruby-bin-strip/
mruby-enum-ext/
mruby-enumerator/
mruby-eval/
mruby-exit/
mruby-fiber/
mruby-hash-ext/
mruby-math/
mruby-numeric-ext/
mruby-object-ext/
mruby-objectspace/
mruby-print/
mruby-proc-ext/
mruby-random/
mruby-range-ext/
mruby-sprintf/
mruby-string-ext/
mruby-string-utf8/
mruby-struct/
mruby-symbol-ext/
mruby-time/
mruby-toplevel-ext/

default.gembox というのがbuidl_config.rbで指定されていてその時
これら "mruby-*" をbuild時にリンクするようです。
gemboxってのはmrbgemを纏めて指定する仕組みで、
依存関係の解消なんかに使われるようです。
これとは別に
mruby/mrblib/*

array.rb
class.rb
compar.rb
enum.rb
error.rb
hash.rb
init_mrblib.c
kernel.rb
mrblib.rake
numeric.rb
print.rb
range.rb
string.rb

といった感じでメソッドが定義されていました。
== や collect, include? などです。
使えるメソッドが知りたかったらこれらのファイルを覗くとよいでしょう。

まとめ

mrbgemsはmrubyを使うときに要になるものだと思います。
PHPパーサがなかったりXMLパーサがなかったり、
適当に考えて思いつくものはmattn_jp さんが実装していたり
これも漁っていると楽しいのです。


 コードリーディングするときはファイル構造を知るのがいいって
ソースコードを読むための技術
が言ってた。
mrbgemについて書きながら思ったのは
minirakeやRakefile,makefileにbuild_config.rbのことをちゃんと
知ってからmrubyコードリーディングするのも一つの近道な気がする。
ドキュメントまだないから言っていることがあっているのか不安