msumimz's diary

RubyにJITコンパイラを実装する個人プロジェクトの情報発信ブログです。

最初のJITコンパイラを実装しました

JITコンパイラの最初のバージョンが動くようになりました。

このバージョンのminirubyには、Object#precompileというメソッドが追加されています。これは

precompile <クラス>, <メソッド名(シンボル)>

という書式で呼び出すことで、<メソッド名>で指定されたメソッドの中身をコンパイルし、既存のメソッド定義を上書きします。既存のメソッド定義は<メソッド名>_origというエイリアスで残されます。

といっても今のところFixnumリテラルにしか対応していませんので、メソッドに書けるのはFixnumの範囲に収まる整数だけです。ひどい。

例えば

def m
  1
end

precompile Object, :m

puts m # => 1

この例を見ても何がなんだかわかりませんが、デバッガでステップ実行すると、メソッドmがネイティブコードとして実行されていることがわかります。生成されたコードは以下のようなものでした。

mov eax, 3
ret

そのまんまですね。

いずれはJITコンパイルすべきメソッドをヒューリスティックに判定して自動コンパイルする機能をつけることになりますが、それをするにはコンパイルできる文法範囲が狭すぎますので、しばらくは上記の方法で指定することになります。

githubのURLは以下の通りです。10ファイル以上を一度にコミットしてます。
https://www.github/msumimz/ruby/tree/rbjit

ビルド方法は後で書きます。ビルドしても何もできませんが。