mruby/ruby: mruby VMをRubyで実装してみた
2024-12-01
Techこのエントリはmrubyファミリ (組み込み向け軽量Ruby) Advent Calendar 2024の1日目の記事です。
近年、mruby bytecodeを利用していろんな環境でRubyを動かす試みがみられます。ふつうRuby処理系を自分で実装するとすれば
ソースコードのパース→命令列への変換→VMでの実行
という3段階になるわけですが、mruby bytecodeを使えば前段はmrbcコマンドがやってくれるので、後段であるVM+ランタイムの実装だけでRubyプログラムを動かすことができ、だいぶ楽になります。
とはいえ…
言語処理系実装の経験がなければ、後段だけでもけっこうな歯ごたえがあるでしょう。特にmruby本体はC言語で書かれているため、Rubyistにとってはとっつきづらいかもしれません。
ということで、Rubyで書かれたmruby VM、mruby/rubyをご用意しました。
https://github.com/yhara/mruby-ruby/
みどころ
- mrb/parser.rb
- .mrbファイルのバイナリを読み込む部分です。
- VM#eval_iseq
- 読み込んだ命令一つを実行する部分です。
- runtime.rb
- mrubyのオブジェクトや組み込みクラスの実装です。
- オブジェクト指向でない言語で実装することも考え、あまりOOPを使わずに書いています。
- いまのところGCは実装していません(RubyのGCに任せている)。
※まだmrubyのすべての機能を実装しているわけではありません。(特に例外処理、組み込みメソッド等)
おわりに
自分の勉強のために作ったプロジェクトですが、誰かの参考になれば幸いです。