最初の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
ビルド方法は後で書きます。ビルドしても何もできませんが。