【エーオーティーコンパイル】

AOTコンパイル とは?

最終更新:
💡 実行より前に、コードを準備する

実行より前にコードをコンパイルしておく方式。ネイティブコードへの事前変換では、実行時のコンパイル負荷を減らせます。起動・容量・互換性などの効果は実装や用途によります。

📌 このページのポイント
AOTとJIT:変換する時期が違うAOT:実行より前入力ソースやIL等事前に変換出力ネイティブJIT:プログラムの実行中入力ソースやIL等実行中に変換出力ネイティブ速さ・容量・対応機能は、実装や用途で確認
ネイティブコードへ変換する場合の比較例。AOTとJITを組み合わせる実装もあり、入力や効果は処理系によって異なります。
ひよこ ひよこ
AOTコンパイルって何?
ペンギン先生 ペンギン先生
プログラムを実行するより前に、コードをコンパイルしておく方式だよ。ネイティブコードへ変換しておけば、その部分を実行時にコンパイルする必要がなくなるんだ。
ひよこ ひよこ
JITとどちらが速い?
ペンギン先生 ペンギン先生
コンパイル時期が違うんだ。AOTは起動の負荷を減らせるけど、JITにはその実行で得た情報を使って最適化する利点がある。起動時間と処理全体の性能を分けて測ろう。
ひよこ ひよこ
Androidは全部AOT?
ペンギン先生 ペンギン先生
ARTではAOT・JIT・解釈実行を組み合わせる。実行の記録であるプロファイルを使って、後から事前コンパイルする部分を選ぶこともある。AOTなら動的な最適化が一切ない、と決めつけないでね。
ひよこ ひよこ
.NETではどう使うの?
ペンギン先生 ペンギン先生
Native AOTは公開時にILをネイティブコードへ変換し、実行時にはJITを使わない。対象環境ごとに生成し、必要なランタイムの機能もアプリに含む。AOTならランタイムの役割が全て消えるわけではないよ。
ひよこ ひよこ
採用する前に何を確認する?
ペンギン先生 ペンギン先生
起動やメモリだけでなく、ビルド時間・配布サイズ・対応環境と機能を確認しよう。.NET Native AOTでは動的なアセンブリ読み込みや実行時コード生成に制限があり、依存先の警告も点検するんだ。
もっと詳しく知りたい人へ

AOTならアプリのサイズも必ず小さい?

比較対象によります。.NET Native AOTでは必要なランタイムのライブラリも含めます。未使用部分の削除で小さくなる面もありますが、必要なコードや型の特殊化などで容量が増える面もあるため、実際の成果物を比較します。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「AOTコンパイル」って出てきたら「実行前にコンパイルする方式」と思えばだいたいOK!
📖 おまけ:英語の意味
「Ahead-Of-Time Compilation」 = 事前コンパイル
💬 Ahead of timeは「前もって」。実行前のコンパイルを指し、全プログラムを一度に変換することや高速化を保証する言葉ではありません。

参考資料

← 用語集にもどる