我使用C#.NET作为Web应用程序。我已经读过JIT编译在运行时发生,这意味着(如果我错了,请纠正我)当请求到达IIS时编译将会发生。
使用csc.exe
在解决方案的构建阶段使用MSBuild
进行另一次编译,以将高级代码转换为CIL。
如果没有JIT并且我们想要使用AOT,AOT在哪里可以适应所有这些?
我的问题是在从构建代码到第一个请求的整个阶段中,AOT编译发生了什么? (平台/框架无关紧要)
答案 0 :(得分:17)
经过大量的谷歌搜索和研究,我发现我对编译器的基本理解是错误的。
编译器是将语言 X 的程序转换为语言 Y 的程序的程序。语言 Y 可以是任何内容(本机代码,中间代码/字节码,其他语言Z或相同语言本身)。
编译器不一定是将语言X中的程序转换为m代码的程序。
例如,使用编译器csc.exe从高级C#代码到CIL进行编译。 (我怎么能错过这个?呃!)
此外, Ahead-Of-Time 和 Just-In-Time 编译器中的 时间 是指 运行时 。因此,在Ahead-Of-Time编译器中,编译在程序运行之前发生,通常作为构建步骤添加。在Just-In-Time编译器中,编译在程序运行时不断发生。
要将它放在C#.NET透视图中并回答我的问题,CIL由 MSBuild 使用 csc.exe 生成,无需考虑CLR是使用JIT还是AOT编译器。在运行程序时,JIT或AOT编译器开始运行。 AOT编译器将整个程序集(在CIL中,或语言 X )编译为本机机器代码(语言 Y )之前程序运行。 JIT编译器将各个方法和类(在CIL中,或语言 X )编译为本机机器代码(语言 Y )当调用方法时。
CLR默认提供JIT编译器,但它也支持使用Native Image Generator(Ngen.exe)进行AOT编译。