Xamarin Ahead-of-Time(AOT)编译器与普通编译器

时间:2014-02-10 23:22:49

标签: ios compiler-construction xamarin

我的理解是Xamarin的Ahead-of-Time(AOT)编译器直接将Xamarin.iOS应用程序编译为本机ARM汇编代码(How Xamarin works)

然而,我不能得到的是为什么它需要被称为“Ahead-of-Time”而不仅仅是普通的编译器。 Xamarin的AOT编译器和传统编译器之间有什么区别,还是仅仅是一个营销术语?

1 个答案:

答案 0 :(得分:18)

AOT与传统JIT编译器的比较

Ahead-of-Time(AOT)编译与Just-in-Time compilation(JIT)形成对比。

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

当.NET应用程序启动时,JIT编译器会分析字节码,通过转换为本机代码来识别可以加速的区域,并编译它们。在执行期间,编译器还可以识别用于编译的热路径。

不幸的是,对于.NET,Java以及任何可以从JIT中受益的平台,App Store服务条款都不允许动态代码生成。由于Xamarin无法在设备上执行JIT,因此他们知道它们正在运送到ARM设备,它们可以提前运行JIT类型的编译器(AOT)并将其捆绑到二进制文件中。 / p>

AOT如何与机器码编译器进行比较

如上所述,AOT将部分解释的字节码转换为机器码。它不会消除对虚拟机字节码解释器的需求。 VM将按原样运行,但偶尔会看到一条说明“执行此机器代码块”的指令。

这只是一个营销术语吗?

没有。 Xamarin在该段中传达的信息是,他们的代码比简单的基于字节码的语言执行得更快。对于iOS和Android,他们都能够在热代码路径上执行本机代码以提高性能。 AOT和JIT这两个术语是关于他们如何做到的技术细节。