事前
コンパイラ(Ahead-Of-Time
コンパイラ、AOT
コンパイラ)は、プログラムの実行前に、
ソースコードや中間言語を
機械語に変換する
コンパイラです。この方式は、実行時にコンパイルを行うJIT
コンパイラ(Just-In-Time
コンパイラ)とは対照的です。
JIT
コンパイラは、プログラムの実行直前や実行中に中間言語を
機械語に変換します。このため、
インタプリタ方式よりも高速に動作しますが、初期段階では必要なコードが全て変換されるまで時間がかかり、パフォーマンスが低下することがあります。特に、起動と終了を繰り返すアプリケーションでは、このウォームアップ時間が問題となります。
AOT
コンパイラは、実行時コンパイルの必要性を排除し、事前に
機械語を生成するため、起動時のパフォーマンス低下を回避できます。
C言語や
C++などではAOT
コンパイラが主流であり、単に
コンパイラと呼ばれることが多いです。
AOTコンパイルの特徴
AOT
コンパイラは、開発環境で実行され、JIT
コンパイラよりも多くの時間とリソースをかけて最適化を行います。これにより、プログラムの性能を最大限に引き出すことが可能になります。開発者は、
コンパイラのオプションを調整することで、最適化のレベルを制御できます。
ただし、AOTコンパイルされたコードが常にJITコンパイルされたコードよりも高速であるとは限りません。AOT
コンパイラは、特定の命令セットを想定してコードを生成するため、ターゲット環境がその命令セットをサポートしていない場合は、最適化の制約を受けることがあります。また、
SIMDのような拡張命令を利用する場合、拡張命令をサポートしない環境でも動作するように複数のコードを生成する必要があるため、
実行ファイルのサイズが大きくなることがあります。
一方、JIT
コンパイラは、実行環境に特化したコードを生成できるため、より効率的なコードを生成しやすいという利点があります。
.NETにおけるAOTサポート
.NET言語(C#、Visual Basic
.NETなど)では、JITコンパイルが基本ですが、以前から
.NET Frameworkには、マネージアセンブリからネイティブコードを生成する「Ngen.exe」が提供されていました。これは、サーバーアプリケーションなど、起動と終了を繰り返すことでオーバーヘッドが問題となるケース向けのソリューションでしたが、手軽に利用できるものではなく、動的な機能が制限されるなどの欠点がありました。
Windows 8.xのWindowsストアアプリでは、Ngen.exeがJIT
コンパイラと共に使用されていましたが、Windows 10のUWPアプリケーションでは、より進化したAOT技術である「
.NET Native」が採用されました。
.NET Coreでは、バージョン3.0からAOTコンパイルの一種であるReadyToRun形式が導入されました。さらに、
.NET 7ではネイティブAOTがサポートされましたが、ネイティブAOTと完全に互換性のあるライブラリはまだ限られています。
まとめ
AOT
コンパイラは、プログラムのパフォーマンスを向上させるための重要な技術です。特に、起動時間の短縮が求められるアプリケーションにおいては、その効果を発揮します。しかし、JIT
コンパイラにも独自の利点があり、両者の特性を理解し、アプリケーションの要件に応じて最適なコンパイル方式を選択することが重要です。
関連用語
実行時コンパイラ(JITコンパイラ)
GNU Compiler for Java
JRuby
レトロニム
外部リンク
.NET
Speed: NGen Revs Up Your Performance with Powerful New Features -- MSDN Magazine, April 2005
Mono AOT
Java
Excelsior JET -- Java SE 6 Implementation with AOT compiler
GNU Compiler for Java
Aonix PERC Ultra
Real-time Java, Part 2: Comparing compilation techniques -- IBM developerWorks, April 2007
Improving Swing Performance: JIT vs AOT Compilation -- LinuxWorld Magazine, November 2004
manta