JIT コンパイルまとめ
Mosh のパフォーマンスを向上させたいので JIT コンパイル周りを調べてみました。誤りや不足がありましたらご指摘いただけると助かります。
何か?
Just in time コンパイルの略。実行時に必要になった時点で動的にコードを生成する仕組み。
VM 型のインタプリタにおいて、実行時に bytecode を native code にコンパイルすることを指すことが多い。
JIT が AOT (Ahead of time)と比較して有利な点
- 実行時の統計情報を利用できる
- 実行ホストに最適化されたコードを利用できる
JIT コンパイル手法
- 実行時に良く実行される関数を native code にコンパイル
- Tracing JIT
- trace したコードには種々の最適化が施される(AOT コンパイラで行われるような最適化)
- Context Threaded JIT
- Direct Threaded のダメな点を改善
- パイプラインストール
- 間接分岐が原因の分岐予測ミス
- vPC(仮想プログラムカウンタ)と PC が一致するように
- 基本的には op code 単位の変換
- 複雑な opcode body は runtime の関数呼び出しに変換
- 単純な opcode や分岐は inlined nativecode に。
- メリット
- VM インストラクションのリストが保持する分岐コンテキストが CPU から見える形になる
- opcode dispatch による間接分岐が減り分岐予測しやすくなる。
- SquirrelFish で採用
- 他の JIT に比べて実装が簡単らしい
- Direct Threaded のダメな点を改善
- V8(JS->AST->native code)
- Superinstruction selective inlining
所感
Tracing JIT は型安全を保証できる trace の詳細が分からなかったので調べる必要がありそう。
Context Threaded は今の CPU には合わないかもしれない。
などを考えていかないとまずそうだ。JIT コンパイラは Scheme で書くので意外とメンテナンスは簡単かもしれないけど。
研究レベルでは Tracing JIT の次は何が来ているんだろう。
参考資料
- Just-in-time compilation - Wikipedia, the free encyclopedia
- HotSpot - Wikipedia, the free encyclopedia
- Bluish Coder: A Quick Introduction to Tamarin Tracing
- LuaJIT roadmap 2008
- lucille development blog » Blog Archive » V8 benchmarked
- Introducing SquirrelFish Extreme.ja – WebKit
- http://www.cs.toronto.edu/syslab/pubs/demkea_context.ps
- steps to phantasien t(2008-05-06)
- 良く読むと Forth -> Scheme に読み替えると似たようなことやっていることが分かる。