我正在使用C#.NET开发一个web应用程序。我读到过JIT编译发生在运行时,这意味着(如果我错了,请纠正我)编译将在请求命中IIS时发生。
另一种编译是在解决方案的构建阶段使用csc.exe进行的,使用MSBuild将高级代码转换为CIL。
如果没有JIT,而我们想要使用AOT,那么AOT在这一切中的位置在哪里呢?
我的问题是,在从构建代码到第一次请求的整个阶段中,AOT编译发生在什么时候?(平台/框架无关紧要)
发布于 2015-09-19 02:02:24
经过大量的Googling搜索和研究,我发现我对编译器的基本理解是错误的。
编译器是将language X中的程序转换为language Y中的程序的程序。language Y可以是任何东西(本机代码、中间代码/字节码、某种其他语言Z或相同的语言本身)。
编译器不一定是将X语言的程序转换为m代码的程序。
例如,使用编译器csc.exe进行从高级C#代码到CIL的编译。(我怎么会错过呢?(啊!)
此外,预编译器和即时编译器中的time指的是运行时。因此,在预编译器中,编译是在程序运行之前进行的,通常作为构建步骤添加。而在实时编译器中,当程序正在运行时,编译一直在进行。
从C#.NET的角度来看,并回答我的问题,CIL是由MSBuild使用csc.exe生成的,而不需要考虑它使用的是即时编译器还是C#.NET编译器。正是在程序运行时,JIT或AOT编译器开始起作用。在程序运行之前,AOT编译器将整个程序集(在CIL或language X中)编译成本机代码(language Y)。调用方法时,JIT编译器将单个方法和类(在CIL或language X中)编译为本机代码(language Y)。
默认情况下,CLR提供了JIT编译器,但它也支持使用Native Image Generator(Ngen.exe)的AOT编译。
https://stackoverflow.com/questions/32653951
复制相似问题