Jeandle JDK ― なぜ開発者はLLVMをJava仮想マシンに組み込むのか
HotSpot JVMのC2コンパイラの内部を覗き込むのは、気概のある人だけができることです。C2のC++コードは何十年にもわたって書かれてきました。特定の最適化が多数蓄積されていますが、年々その保守が困難になっています。ある時点で、OracleのエンジニアリングチームはGraalプロジェクトで жизньを楽 にしようとし、JITコンパイラをJava自体で書き直す取り組みを行いました。Jeandleプロジェクトの開発者たちは別のアプローチを取りました:既存のLLVMフレームワークを採用し、OpenJDKのコンパイルエンジンとして機能させることを決めたのです。

Jeandleとは何か、なぜLLVMが必要なのか
Jeandleは、OpenJDKの上に直接構築されたJava用の実験的なJITコンパイラです。組み込みのC1やC2コンパイラに依存するのではなく、ホットなバイトコードの実行を傍受し、LLVMのコードジェネレータに渡します。
なぜLLVMをJava仮想マシンに持ち込むのでしょうか?
LLVMの主な利点は、C、C++、Rust向けにグローバルコミュニティが作成した低レベル最適化の膨大なコレクションです。自動的な命令ベクトル化、深層ループ解析、特定のプロセッサ機能に合わせた最適化,这些都是LLVMに既に存在し、定期的なアップデートを受けています。
従来のC2では、すべての新しい最適化や新しいプロセッサアーキテクチャ(RISC-Vなど)のサポートを手動で実装する必要があります。OpenJDKとLLVMを組み合わせることで、Jeandleの作者たちは、オプティマイザを一から書き直すことなく強力な機械コードジェネレータを得ることを目標としています。
内部でどのように動作するか
Jeandleでのコード処理は、いくつかのステージに分かれています:
- 仮想マシンが頻繁に呼び出されるアプリケーションメソッドを追跡します。
- メソッドのバイトコードが十分にホットであると判断された場合、JeandleはそれをLLVM IRに変換します。
- LLVMの最適化パスを結果のIRコードに適用します。
- LLVMはIRをターゲットプラットフォーム(x86_64、AArch64など)のネイティブ機械語にコンパイルします。
- JVMはメソッド参照を交換し、実行はコンパイルされた機械語で続行されます。
プロジェクトのリポジトリには詳細なドキュメントが含まれています。guidesディレクトリにはシステムアーキテクチャの説明、ビルド手順、および個別のデバッグ設定ドキュメントが含まれています。
開発者は専用のJVMフラグを通じてコンパイラ動作の制御を公開しています。これらのフラグにより、最適化レベルの調整やアプリケーション実行中の中間表現ダンプ(LLVM IR)のリクエストが可能になります。
LLVMベースのJITの主な課題
JITコンパイラでLLVMを使用するというアイデアは新しいものではありません。OpenJDK用のSharkプロジェクトやAzulのFalconプロジェクトなど、以前にも同様の試みがなされました。この道における主な障害は、コンパイル速度自体です。
LLVMは本来、AOT(Ahead-of-Time)コンパイル向けに設計されました。Clangのような静的コンパイラでは、プロセスが数分かかることもあります—優先されるのは、最終的なバイナリができるだけ高速に実行されることです。JITモードでは、コンパイル時間が重要です。LLVMが各メソッドを длительноかつ丁寧に最適化enski начинает проводить длительную и тщательную оптимизацию каждого метода, приложение просто зависнет в процессе разогрева.
さらに、Jeandleの作者たちはJavaランタイムとの統合という複雑な課題に直面しています。コンパイラは、ガベージコレクションのセーフポイントを正しく処理し、メモリバリアを扱い、動的なクラスロードをサポートする必要があります。
現在の状況と今後の展望
現在、Jeandleはアクティブなプロトタイピング段階にあります。リポジトリには約460個のスターと60以上の未解決イシューが蓄積されています。コードはまだ本番環境での使用 준비되어 있지 않으며、作者们也并不隐瞒这一点。
それにもかかわらず、このプロジェクトは複数のカテゴリのエンジニアにとって興味深いものになるでしょう:
- JVMの内部を勉強していて、JITが実際の例でどのように動作するかを理解したい人。
- 実践的なLLVM IR統合のユースケースを探しているコンパイラ開発者。
- 特定のプロセッサアーキテクチャ向けのカスタム最適化プロファイルを作成している研究者。
ソースコードはGPL v2.0ライセンスの下でオープンソース化されています。Java仮想マシンとネイティブコンパイラを組み合わせる方法を理解したい場合は、プロジェクトのドキュメントを確認してください—ビルドプロセスとアーキテクチャ上の決定事項について詳しく説明されています。
関連プロジェクト