WebアプリケーションにC#.NETを使用しています。 JITコンパイルは実行時に行われることを読みました。つまり、(間違っている場合は訂正してください)リクエストがIISにヒットしたときにコンパイルが行われることを意味します。
ソリューションのビルドフェーズでMSBuild
を使用して高レベルコードをCILに変換する際に、csc.exe
を使用して別のコンパイルが行われます。
JITがなく、AOTを使用したい場合、AOTはこれらすべてにどのように適合しますか?
私の質問は、コードの構築から最初のリクエストまでのフェーズ全体のどの時点で、AOTコンパイルが発生するかということです。 (プラットフォーム/フレームワークは関係ありません)
たくさんのグーグルと調査の結果、コンパイラーの基本的な理解が間違っていることがわかりました。
コンパイラは、言語のプログラム[〜#〜] 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コンパイルもサポートします。