web-dev-qa-db-ja.com

事前(AOT)コンパイルはいつ行われますか?

WebアプリケーションにC#.NETを使用しています。 JITコンパイルは実行時に行われることを読みました。つまり、(間違っている場合は訂正してください)リクエストがIISにヒットしたときにコンパイルが行われることを意味します。

ソリューションのビルドフェーズでMSBuildを使用して高レベルコードをCILに変換する際に、csc.exeを使用して別のコンパイルが行われます。

JITがなく、AOTを使用したい場合、AOTはこれらすべてにどのように適合しますか?

私の質問は、コードの構築から最初のリクエストまでのフェーズ全体のどの時点で、AOTコンパイルが発生するかということです。 (プラットフォーム/フレームワークは関係ありません)

15
chaudharyp

たくさんのグーグルと調査の結果、コンパイラーの基本的な理解が間違っていることがわかりました。

コンパイラは、言語のプログラム[〜#〜] x [〜#〜]を言語のプログラムに変換するプログラムです[〜#〜] y [〜#〜]。言語[〜#〜] y [〜#〜]は何でもかまいません(ネイティブマシンコード、中間コード/バイトコード、他の言語Z、または同じ言語自体)。

コンパイラは必ずしも言語Xのプログラムをmコードに変換するプログラムではありません。

たとえば、コンパイルは、コンパイラcsc.exeを使用して高レベルのC#コードからCILに行われます。 (どうして私はそれを見逃すことができますか?当たり前です!)

また、 time in Ahead-Of-Time および Just-In- Time コンパイラは runtime を参照します。したがって、Ahead-Of-Timeコンパイラでは、コンパイルはプログラムが実行される前に行われ、通常はビルドステップとして追加されます。 Just-In-Timeコンパイラでは、プログラムの実行中にコンパイルが実行され続けます。

それをC#.NETの観点に置き、私の質問に答えるために、CILは、CLRがJITまたはAOTコンパイラを使用するかどうかを考慮せずに、MSBuild using csc.exeによって生成されます。 JITまたはAOTコンパイラが動作するのは、プログラムの実行時です。 AOTコンパイラは、アセンブリ全体( CIL、または言語[〜#〜] x [〜#〜])をネイティブマシンコード( language [〜#〜] y [〜#〜])プログラムが実行される前。 JITコンパイラは、個々のメソッドとクラス( CIL、または言語[〜#〜] x [〜#〜])をネイティブマシンコード(言語[〜#〜] y [〜#〜])メソッドが呼び出されたとき。

CLRはデフォルトでJITコンパイラを提供しますが、 Native Image Generator(Ngen.exe) を使用したAOTコンパイルもサポートします。

25
chaudharyp