Java アプリケーションの AOT コンパイルに関する誤解と事実

開発者コミュニティでは、Java アプリケーションのネイティブ コードへの ahed-of-time (AOT) コンパイルに関していくつかの誤解があるようです。ここでは、それらの誤解と事実を説明します。

 

誤解 1: AOT コンパイルされた Java アプリケーションは、リフレクション、ダイナミック クラス ローディングなどのダイナミック機能を利用できない。

事実: Excelsior JET は、Java SE 5.0 仕様に準拠しており、完全にライセンスされた Java SE 5.0 API 実装が含まれています。これは、仕様に沿ってコード化されているすべての Java アプリケーションを最適化できることを意味します。

特に、Excelsior JET は、Java リフレクションおよびシリアライゼーション、RMI などのリフレクション ベースの API をサポートしています。これは、JET でコンパイルされたアプリケーションは任意の JVM で作成されたファイルをデシリアライズでき、JET でコンパイルされた RMI サーバーは別の JVM で実行している RMI クライアントと通信できることを意味します。samples/RMI サブディレクトリにあるサンプルを確認してください。

Excelsior JET ランタイムは、カスタム クラスローダーのメカニズムと、プリコンパイルされていないクラスのダイナミック ローディングを完全にサポートします。このために、アプリケーションのプリコンパイル部分とともに配布可能な JIT コンパイラを特長としています。プロフェッショナル エディションには、後で起動できるように JIT コンパイルの結果をディスクに格納する JIT キャッシング エンジンも含まれています。samples/Classloaders サブディレクトリにあるサンプル プログラムを確認してください。

詳細は、Excelsior JET ユーザーズ ガイドの「Mixed Compilation Model」を参照してください。

 

誤解 2: AOT コンパイラを使用すると、Java アプリケーションの可搬性が直ちに失われる。

事実: 確かに、Excelsior JET はプラットフォーム固有の実行ファイルを生成しますが、クラス ファイルを破棄したり変更したりしないため、その可搬性は失われません。また、ソース コードに変更を加える必要もありません。このため、他のプラットフォームのバイトコードとしてアプリケーションの配布を続けることができます。

 

誤解 3: AOT コンパイラは、ダイナミックにコードを最適化する実行プロファイルに依存する JIT コンパイラよりも性能が劣る。

事実: すべてのケースでどちらかが優れているということはありません。両方のアプローチにはそれぞれ長所があります。あるアプリケーションでは AOT コンパイラの方がよい結果になり、それ以外のアプリケーションではダイナミック コンパイルの方がよい結果になります。これらを前もって判断することは非常に難しいため、使用する Java アプリケーションでどちらのアプローチがよいか実際に確認するとよいでしょう。

 

誤解 4: AOT コンパイラを使用すると、Java アプリケーションの実行速度は常に速くなる。

事実: たとえば、ネイティブ メソッドが大部分 CPU 時間を使用する場合、実行速度はほとんど変わりません。しかし、AOT コンパイルには、実行速度を速くすることよりもアプリケーションにとってより重要となる他の長所があります。

 

誤解 5: AOT コンパイラを使用すると、開発サイクルを変更しなければならない。

事実: ほとんどの開発サイクルでは全く影響はありません。開発サイクルを変更することなく、これまでと同じツールを使用して、設計、コーディング、デバッグ、およびテストを行うことができます。アプリケーションが安定して動作するようになったら、アプリケーションを Excelsior JET でコンパイルしてパッケージを作成し、QA テストを行った後でエンドユーザーに配布してください。

 

ページトップへ