事前コンパイラ

事前コンパイラ(AOTコンパイラ)とは



事前コンパイラ(Ahead-Of-Timeコンパイラ、AOTコンパイラ)は、プログラムの実行前に、ソースコードや中間言語を機械語に変換するコンパイラです。この方式は、実行時にコンパイルを行うJITコンパイラ(Just-In-Timeコンパイラ)とは対照的です。

AOTコンパイラの概要



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

もう一度検索

【記事の利用について】

タイトルと記事文章は、記事のあるページにリンクを張っていただければ、無料で利用できます。
※画像は、利用できませんのでご注意ください。

【リンクついて】

リンクフリーです。