東京 Ruby 会議 11 直前特集号

mruby/c

OSS版のmrubyよりも小さな資源で動作するVMの実装です.40KB程度のメモリで動作しています.ワンチップマイコンを想定した実装になっていて,多くのクラスを削減しています.そのため,一般的なRubyプログラムには向きませんが,組込みシステムでの機器制御やIoT分野への適用を目指しています.

必要となる知識

mruby

田中 和明
九州工業大学

mruby, mruby/c開発者, 大学では組込みソフトウェアの研究に従事している.


5/10 Skypeにて伺いました(話し手:田中さん、聞き手:笹田)。

笹田 お忙しいところ、ありがとうございます。今回は、mruby/c の話をして頂ける、ということで。

mruby の話

田中 まず、mruby についてですが、Ruby のコンパイラと VM、インタプリタを切り離し、コンパイル済みバイナリはポータブルなので、色々なデバイスにデプロイしやすくなっています。そして、VM は十分小さいので、いろいろなデバイスへの移植が容易です。

笹田 なるほど。

田中 VM がハードウェアに依存するのですが、そのレイヤを mrubygems ということで抽象化することで、簡単に更新しやすくなっています。

笹田 require ができなくて、mrubygems で VM 生成時に埋め込まれる、ということですよね。

田中 詳しくは、http://mruby.org/ を読むのが良いと思います。

笹田 海外のカンファレンスでも、mruby についてよく聞かれます。例えば、どこまで進んでるの、とか、どうやって使うの、とか。

田中 我々がよく言う話なのですが、VM のコードが1万行程度なので、それを読んでもらいたいと思っています。読んでもらえると、mruby の構造や、mruby をどのように拡張すれば良いか、ということがわかってもらえると思っています。ちょっと乱暴ではあるんですが。

笹田 ハードルはちょっと上がりますね。それくらいしないと、製品に使うのは難しい、ということですかね。

田中 そうですね。組込み製品を対象に考えているので、むしろそれをしやすいように、読みやすいようにコードを整理しています。ドキュメントは、まだちょっとこれから、というところです。

笹田 組込みというのは、組込み機器への組込みと、アプリケーション組込みがあると思います。先ほどの話は組込み機器向けの話だと思うのですが、アプリケーション組込みというのはどうでしょうか。

田中 そちらのほうが、進んでいると思います。mrubygems で、いろんな機能が使えますので、不便がないと思います。

笹田 RubyKaigi 2015 でも、mruby-cli の話がありましたね。Ruby スクリプトを単体のバイナリにまとめる、あの機能がとても良い、という話をよく聞きます。あと海外では、英語のドキュメントがない、という話は聞きますね。

田中 実は、まだ日本語のドキュメントも十分じゃないので、今後ですね。ただ、mrubygems の説明などは、英語で書かれていると思います。他のドキュメントは、NPO 法人軽量 Rubyフォーラムで進めて行ければと思っています。なかなかリソースが割けないのですが。

笹田 どれくらいの会社が参加されているんですか?

田中 10 社くらいですね。今は、ドキュメントの前に、どのバージョンでどの mrubygems が動くか、などの検証を先に行なっています。

mruby/c

笹田 今、田中先生は mruby ではなく、mruby/c のほうに移られている。

田中 はい、今はそちらがメインですね。

笹田 ざっくりとしたイメージですが、mruby を更に小さくしたもの、なのですが、そういう理解でいいでしょうか。16 bit CPU でも動くと伺った気がします。

田中 はい。メモリ消費量を削減しています。まず、組込みクラスを減らしています。例えば、StringFloat をオプショナルにしています。整数の計算だけしたい、というケースも結構あるので。

笹田 どれくらい削減されたんでしょうか。

田中 mruby は、実行時に 400 KB 程度必要です。mruby/c では 40 KB 程度で動かすことができます。

笹田 なるほど。

田中 それから、GC がありません。その代わり、VM の起動を速くしています。VM が、1 メソッドで完結するようなイメージです。あるイベント、例えばスイッチが押されたら、そこで VM が起動し、あるメソッドを実行し、VM が終了する、というようなモデルを考えています。

笹田 つまり、VM 実行中は GC は行なわないが、VM のライフタイムが十分短いのでリソースを解放しなくても問題無い、ということでしょうか。

田中 そうです。もちろん、対応できない状況もありますが、なくても良い場合もあると思っています。

笹田 手作業で解放する、みたいなことは出来るんでしょうか。

田中 そのために、VM を複数動かせるようにしています。つまり、リソース管理は VM 単位で行ない、長時間動くプログラムは、VM を作っては消して、というようにしています。

笹田 VM の起動時間はどうでしょうか。

田中 研究でそのあたりを見ていまして、やはりオーバヘッドが大きいです。mruby/c は、それをほぼ 0 にしています。

笹田 オーバヘッドは、動的にメソッドを定義する、とか、そういうところですかね。

田中 はい。mruby/c では、そのあたりをデータ構造を工夫していて、ハッシュ表を索引付きの連結リストにしています.

笹田 あ、でも動的には作るんですね。コンパイル時に全部決めてしまう、という手もあると思うんですが。

田中 それも可能だと思うんですが、既存の mruby のバイトコードとの互換性がなくなってしまうので、まだやっていません。

笹田 そこ、互換性いるんでしょうか。

田中 コンパイラを弄るのが面倒で(笑)。

笹田 わかります! ちなみに、CRuby でも、今そういうのをやりたいな、とは思っています。CRuby だと使わないメソッド大量にあるので。

田中 起動時間は、もう少し速くしたいですね。割り込み時に起動する、みたいにしたいので。現状は 100 ms 程度にしたいですね。やはり、動的にメソッドを定義するところがオーバヘッドなので、最終的にコンパイラを弄らないといけない気がします。

笹田 凄く楽しそうですね。

田中 あと、mruby/c には組込みライブラリが足りないので、なんとかしたいと思っています。

笹田 mruby との互換性はどの程度なんでしょうか。

田中 よく使うメソッドはサポートしていますが、まだかなり不足しています。また、GC がないなど、違いがあって、mrubyのコードをそのまま持ってくるのは難しいですね。

笹田 なるほど。

田中 今回の発表では、起動の時間が短く、複数の VM が並行に動くこと、それからその裏の排他制御について話をしようと思います。

笹田 楽しみですね。本日は、お忙しいところ、ありがとうございました。