ごあいさつ
このブログは、RubyにJITコンパイラを実装する個人的なプロジェクトの情報を発信するブログです。ちなみにまだコードは1行も書いていません。
プロジェクトの目標は次の通りです。
- 本家より高速に動作するRubyエンジンを実装する。
- 本家との100%互換性を維持する。
具体的には、MRIにJITコンパイラを追加します。現在のMRIで使われているいわゆるyarv実行エンジンと共存し、アプリケーションのホットスポットだけJITコンパイルするイメージです。JITコンパイラ以外の部分はMRIにそのまま乗っかることで、外部ライブラリを含めた互換性を維持します。本家と互換性がないと、いくら速くても限定的な用途にしか使われないのはpypyをみれば明らかで、互換性維持は至上命題です。
以前、個人的にスクラッチからRuby実装を書いたことがあり、JITコンパイラも実装していましたが、MRIよりも遅い性能しか出ませんでした。どうも単にネイティブコードにするだけではだめなようです。今回は積極的な最適化を行って、MRIの性能を超えるのが目標です。
コード生成にはLLVMを使う予定です。スクラッチから書いたときは一通り動かすだけで力尽きてしまい、最適化までたどり着かなかった経験がありますので、MRIのコードベースに加えてLLVMのインフラも利用することで、最適化の工夫にパワーを集中させようという考えです。
LLVMを使う問題点は、そもそもあまりJIT向きではないということで、コンパイル速度も速くありませんし、動的言語へのサポートも乏しく、トレーシングJITもできません(計画はあるらしい)。とはいえ、実行エンジンはMRIのものを利用しますし、スタックを複雑に使うMRIの実行エンジンを使いながらトレーシングJITを実装するのはいずれにしろ困難なように思われますので、LLVMでとりあえず十分かと思います。コンパイル速度についても、Rubiniusでそれなりの性能が出ていたようですので、大きな問題にはならないと思います。
最適化はハイレベルIRにおける型推論、specialization、inliningが重要になるでしょう。ここで可能な限りプリミティブな処理に落とし込んだ上でLLVMに渡し、優秀なコード生成能力に期待することになります。
なお、Windowsで開発します。
ブログには、オチとかネタとか考えずに、近況報告風にこまめに記事を上げていこうと思っています。