AOTコンパイル (英: AOT Compile) は、プログラムのコードやILをコンパイル時に機械語へ変換するコンパイルの方法のこと。対義語はJITコンパイルである。
AOTは、Ahead-Of-Timeの頭文字をとったものであり、事前コンパイルとも呼ばれる。
概要
JITコンパイルでは、アプリケーションの実行直前または実行中に、ILを実行環境に合わせた機械語にコンパイルするため、インタプリタ言語よりは高速ではあるが、ILからの実行時コンパイルが挟まるため最初に低速になることが多い。これは、ゲームなどではほとんど問題になることはないが、頻繁に実行と停止が繰り返す、コマンドラインツールなどで問題になりやすい。
それに対比して、AOTコンパイルは、比較的性能の高い、開発環境やビルド環境で行われるように、JITコンパイルよりもコンパイルに時間を割くことができる。また、コンパイラに渡すオプションによって最適化レベルを開発者が操作しやすい。
しかしながら、AOTコンパイルしたアプリケーションが常にJITコンパイルしたコードよりも高速であるとは限らない。なぜなら、AOTコンパイルは特定のOSなどで共通した命令セットを用いて行われるからだ。一方でJITコンパイル先は実行環境に対してネイティブであるため、AOTよりも根強くコードが実行できる可能性がある。
例を出すと、Rustのターゲットアーキテクチャは、Linuxの64ビットCPUに対してx86_64-unknown-linux-gnu
を使用できる。しかし、Linuxでx86_64の中でもDebian系、Arch系、RedHat系などといった種類もあるため、そこに合わせてコンパイルできるというのがJITの1つの魅力だといる。
.NETのAOTサポート
もともとC#をはじめとした.NETでは、JITコンパイル形式が基本だった。だが、.NET Frameworkでは、アセンブリからネイティブコードを生成できるツール「Ngen.exe」がサポートされていた。しかし、これは主に起動と終了を繰り返す、サーバー向けのものであり、また手軽に利用できるようなものではなかった。
そこで、.NET Core 3ではAOTコンパイルの1つとしてReadyToRunがサポートされた。また、.NET 7からはネイティブAOTがサポートされるようになったが、互換性のあるライブラリはまだ限定されている。
言語
AOTコンパイルが主に使用される主要な言語は以下。
- C/C++
- Rust
- Go
- D言語
- Zig
- Nim
- Haskell
- Fortran
一部でAOTコンパイルをサポートする主要な言語は以下。
- Java
- .NET C#
- Python