去年の春からずっとコツコツと作っているmrubyでiOSアプリが書けるMobiRubyが久々に動く様になったので、1年近くmrubyを触ってきて気になった所を少し書いてみます。
以下、mrubyと区別しやすくするために、普段みなさんがお使いのRubyをCRubyと書いています。
mrubyって?
mrubyはMatzが去年発表した省メモリ版のRuby実装です。CRubyの機能を全て実装している訳ではなく、JIS/ISOの規格をベースに設計・実装されたものです。JIS/ISOの規格書は有料なのですが、最終ドラフトがIPAのサイトから確認できます。
mrubyの経緯や概要は、日経ITProによるMatzへのインタビューが分かりやすく、内部などについては、IIJさんや東芝情報システムさんがまとめている記事が参考になります。
現在の所リリース版はなく、GitHubのmruby/mubyで開発が進められています。報告・議論などはメーリングリストやIRCではなく、IssuesやTwitterが使われています。
色々な所に組み込めるmruby
mrubyは省メモリ以外にも「組み込みやすい」という大きな特徴があります。これは一般的な組み込みシステムにmrubyを使うというだけでなく、各種アプリケーションにも組み込みやすくなっています。
たとえば、エディタのマクロ言語としてmrubyを組み込んだり、データベースのトランザクション言語としてmrubyを組み込む方法があります。多くのソフトでは”設定ファイル”を持っていますが、その代わりにmrubyを使うことも簡単です。mrubyで設定ファイルを実装すれば、DSLを使って一般的な設定ファイルのフォーマットのようにもみえるが実はプログラムも可能、という柔軟性の高い設定ファイルをアプリに組み込むことができます。
mrubyは単体で使われることはあまりなく、ほとんどの場合何かのアプリやボードに組み込んで使われることになります。
matsumoto-rさんは、Apacheへmrubyを組み込むmod_mrubyを開発しています。このmod_mrubyはmrubyを使ってWebアプリを作れるだけではなく、Apacheそのもののコントロールを行う事もできるようになっています。たとえはこの記事では、サーバへのアクセス数を見てエラーを返す様なサンプルが提示されています。これを応用すればアクセスが増えた場合は別サーバへリダイレクトさせたり、重い画像を表示させないなどの処理も可能です。
このようにRubyでApacheを制御することが可能なのもmrubyの特徴を生かした例だとおもいます。
クラスとメソッドが少ない
まだmrubyの仕様がまとまっている物はありませんが、ISO/JISの仕様書を見て一番始めに気がつくのはクラスとメソッドの少なさです。
mrubyには、CRubyの標準添付ライブラリは全く入っていませんし、組み込みライブラリの中でもThreadやRandom、IO/Fileクラスなどは実装されていません。ArrayやStringなどのクラスでも実装されていないメソッドがあったりします。
CRubyはPOSIXというUNIX規格の上で動く様に設計されていましたが、mrubyはUNIXなどのプラットフォームに依存しないように設計されています。そのため、ファイルやスレッド、ネットワークなどのクラスが含まれていません。
ファイルが無い環境があるということは、requireやloadもありません。これについてはmrbgemsの所で解説します。
Fixnum / Fixnum = Float
mrubyでは、1 / 2 = 0.5であり、4 / 2 = 2.0になります。CRubyでは、1 / 2 = 0、4 / 2 = 2です。mrubyで除算の結果は必ずFloatになります。
またBignumが無いのでFixnumを範囲を超えるとFloatになります。そのためFixnumの範囲を超えると誤差が生じます。Fixnumの値は標準では32bit signed integerですが、コンパイル時のbuild_config.rbで設定を変更すれば64bitに変更できます。
精度の問題以外に、”(x / 2).times{…}”が出来ないなど、ちょっとしたところで引っかかります。
RubyGemsの代わりにmrbgems
mrubyはRubyGemsに似たmrbgemsという仕組みを標準で持っています。CRubyでいう拡張ライブラリとRubyGemsの両方の仕様を合わせてmrbgemsと呼んでいます。
mrbgemsはRubyGemsと違い、requireで読み込むのではなく一緒にコンパイルして起動時に全て読み込まれます。mrubyのビルドの設定ファイルである、build_config.rbにconfig.gemを設定すると、そのmrbgemsが本体と一緒にコンパイルされリンクされます。
Related ProjectsのページをみるとhttpのアクセスライブラリやBASE64、pack/unpackなど、CRubyにあってmrubyに無い機能がmrbgemsとして公開されています。このリストにはありませんが、requireを提供しているmrbgemsもあります。私もlibffiバインディングであるmruby-cfuncなどを公開してます。これを使えばmrubyから直接Cの関数を呼び出すことができます。
12月〜1月の個人的な時間は、このmrbgemsとmrubyのビルドシステムの構築に費やしていました。その期間は全然MobiRubyには全然触れられなかった・・・。iPad miniで書いてたコードもほとんどこのコードですw
MobiRuby
で、肝心のMobiRubyですが、もう少し安定したらまとめて書きます。2/4に京都の勉強会、2/14には東京のデブサミでMobiRubyの話をさせていただく事になっているので、ご参加お待ちしています。
一応、動いたり壊れたりしているものが、GitHubで公開されています。興味のある方は触ってみてください。
MobiRubyで作った”さめがめ”がMobiRuby Gameという名前でAppStoreに上がっているでの、「本当にMobiRubyなんて動くのか?」と思っているひとはぜひ試してみてくださいw
p.s
要望があれば、アプリへの組み込み方とか簡単な例を書きますので@masuidriveやはてブの方にコメントください。もちろんこのページのコメントでもOK!
通りすがり
記事とは関係なくて恐縮ですが、
RSSのリンクのリダイレクト先の
http://feeds.feedburner.jp/masuidrive
が存在しません。
http://feeds.feedburner.com/masuidrive
が正しいリンク先のようです。
masuidrive
ありがとうございます。早速直しました!