Xamarin 预先编译器(AOT)与普通编译器的区别

7
我的理解是,Xamarin的Ahead-of-Time(AOT)编译器会直接将Xamarin.iOS应用程序编译为本地ARM汇编代码(Xamarin工作原理)
然而,我不明白为什么它需要被称为“Ahead-of-Time”,而不是普通的编译器。 Xamarin的AOT编译器和传统编译器之间是否有任何区别,还是这只是一个营销术语?
1个回答

19

AOT与传统JIT编译器的比较

提前编译(AOT)与即时编译(JIT)相对立。

简而言之,.NET编译器不会生成特定于平台的汇编代码,它们会生成.NET字节码,这些指令由.NET虚拟机解释。这个字节码是可移植的,任何.NET虚拟机都可以运行它,无论是Windows Phone、Linux上的Mono或者基于JavaScript实现的虚拟机。不幸的是,因为代码必须由虚拟机解释执行,所以它比本机代码慢,后者可以由处理器本身执行。这就是JIT和AOT的作用所在。

当一个.NET应用程序启动时,JIT编译器分析字节码,确定哪些区域可以通过转换为本机代码来加速,并对其进行编译。在执行过程中,编译器还可以识别热路径以供编译。

很遗憾,对于.NET、Java和任何从JIT中受益的平台来说,动态代码生成都被App Store服务条款禁止。由于Xamarin无法在设备上执行JIT并且他们知道他们要运行在ARM设备上,因此他们可以提前运行一种类似JIT的编译器(AOT)并将其捆绑到二进制文件中。
与机器码编译器相比,AOT如何?
如上所述,AOT将解释的字节码的一部分翻译成机器码。它并没有消除虚拟机字节码解释器的需要。VM将像往常一样运行,但偶尔会看到一个指令,表示“执行这个机器码块”。
这只是一种营销术语吗?
不是的。Xamarin在那段话中传达的信息是,他们的代码比简单的基于字节码的语言执行得更快。对于iOS和Android,他们能够在热点路径上执行本地代码以提高性能。 AOT和JIT是关于他们如何做到这一点的技术细节。

谢谢你的回答,Brian。我理解AOT和JIT之间的对比,但我想知道AOT和传统编译器(即没有可移植字节码参与)之间是否有区别。 - gonzobrains
@gonzobrains 我将“traditional”解释为传统的.net编译器。像JIT一样的AOT,其核心仍然是在VM中运行的解释代码,只是在某些路径上,VM执行本地代码而已。我会在明天更新答案。 - Brian Nickel
1
传统意义上,您可能指的是从编写的代码转换为机器代码。Mono、.NET、Java等不会这样做。相反,它们会将语言转换为中间字节码格式(通常用于分发),然后由JIT编译器在运行时稍后重新编译为机器代码。AOT编译器在第一步(更传统的)编译器步骤之后立即使用,但它仍然是第二个编译步骤 - 或重新编译。 - Kevin Newman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接