田中和明さんインタビュー
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 でも動くと伺った気がします。
田中 はい。メモリ消費量を削減しています。まず、組込みクラスを減らしています。例えば、String
や Float
をオプショナルにしています。整数の計算だけしたい、というケースも結構あるので。
笹田 どれくらい削減されたんでしょうか。
田中 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 が並行に動くこと、それからその裏の排他制御について話をしようと思います。
笹田 楽しみですね。本日は、お忙しいところ、ありがとうございました。