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

cha*_*ryp 13 c# jit compilation

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

csc.exe在解决方案的构建阶段使用MSBuild将高级代码转换为CIL 时会发生另一次编译.

如果没有JIT并且我们想要使用AOT,AOT在哪里适合所有这些?

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

cha*_*ryp 22

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

编译器是将语言X中的程序转换为语言Y的程序的程序.语言Y可以是任何东西(本机机器代码,中间代码/字节代码,某些其他语言Z或相同语言本身).

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

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

此外,时间名列前茅的时间刚刚在时间的编译器是指运行.因此,在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编译.

  • 很好的研究。请注意,术语 AOT 通常在安装时进行编译时使用。一个很好的例子是 Android 5.0+ 中的新 Android 运行时 (ART),它在安装应用程序时编译应用程序,而不是 JITing。@shashi 对您有关 Windows 应用商店应用程序的原始帖子发表了评论。MS 一直在 AOT 编译 .NET Windows Phone 应用程序,但不是在安装时在手机上进行编译,而是在用户下载和安装之前在 Windows Store 服务器上进行编译。苹果在 Apple Watch 应用上做了类似的事情。 (2认同)