【问题标题】:When does ahead-of-time (AOT) compilation happen?提前 (AOT) 编译何时发生?
【发布时间】:2015-12-15 17:12:38
【问题描述】:

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

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

如果没有 JIT 并且我们想使用 AOT,那么 AOT 将适合所有这一切吗?

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

【问题讨论】:

  • “构建”是指 AOT 编译就像 C、C++ 应用程序一样发生时,C# 代码将直接编译为“构建”期间指定的特定平台的机器代码。
  • 好吧,平台/框架确实很重要。 .NET 中唯一完整的纯 AOT 发生在典型用户运行程序之前的几周。在 Redmond 的 Store 服务器上,使用 .NET Native。与 Web 应用程序没有任何关系,您只能使用 Ngen。反射代码和一些泛型仍然是 jitted。

标签: c# compilation jit


【解决方案1】:

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

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

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

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

此外,Ahead-Of-Time 和 Just-In-Time 编译器中的 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 编译。

【讨论】:

  • 很好的研究。请注意,通常在安装时进行编译时使用术语 AOT。一个很好的例子是 Android 5.0+ 中的新 Android Runtime (ART),它在安装应用程序时编译应用程序,而不是 JITing。 @shashi 评论了您关于 Windows 应用商店应用的原始帖子。 MS 一直在 AOT 编译 .NET Windows Phone 应用程序,但不是在安装时在手机上编译,而是在用户下载和安装之前在 Windows Store 服务器上。 Apple 对 Apple Watch 应用做了类似的事情。
  • 何时发生这种情况:AOT 编译器在程序运行之前将整个程序集(CIL 或 X 语言)编译为本机机器代码(Y 语言)
猜你喜欢
  • 2011-12-17
  • 2017-05-17
  • 2017-11-10
  • 1970-01-01
  • 2017-01-22
  • 2019-08-06
  • 2017-11-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多