什么时候进行提前 (AOT) 编译?

When does ahead-of-time (AOT) compilation happen?

我正在为 Web 应用程序使用 C#.NET。我读到 JIT 编译发生在 运行 时间,这意味着(如果我错了请纠正我)编译将在请求命中 IIS 时发生。

在解决方案的构建阶段使用 csc.exe 进行另一次编译,使用 MSBuild 将高级代码转换为 CIL。

如果没有 JIT 而我们想使用 AOT,那么 AOT 适合所有这些吗?

我的问题是,在从构建代码到第一个请求的整个阶段中,AOT 编译发生在什么时候? (platform/framework无所谓)

经过大量的谷歌搜索和研究,我发现我对编译器的基本理解是错误的。

编译器是一种将语言 X 的程序转换为语言 Y 的程序的程序。语言 Y 可以是任何东西(本机机器代码、中间 code/bytecode、某种其他语言 Z 或同一语言本身)。

编译器不一定是将 X 语言程序转换为 m 代码的程序。

例如,使用编译器 csc.exe 从高级 C# 代码编译为 CIL。 (我怎么能错过呢?呃!)

此外,时间提前Just-In-Time编译器指的是运行time。因此,在 Ahead-Of-Time 编译器中,编译发生在程序 运行 之前,通常作为构建步骤添加。在即时编译器中,编译会在程序 运行.

期间继续进行

从 C#.NET 的角度来看并回答我的问题,CIL 是由 MSBuild 使用 csc.exe[=46= 生成的] 没有考虑CLR是使用JIT还是AOT编译器。 JIT 或 AOT 编译器在 运行ning 程序时起作用。 AOT 编译器将整个程序集(in CIL,或语言X)编译成本地机器代码(语言Y )之前的程序是运行。 JIT 编译器将各个方法和 类(CIL 或语言 X) 编译成本机机器码(语言Y) 调用方法时。

CLR 默认提供 JIT 编译器,但它也支持使用 Native Image Generator(Ngen.exe) 的 AOT 编译。