然而,我没有得到的是为什么它需要被称为“Ahead-of-Time”而不仅仅是一个普通的编译器. Xamarin的AOT编译器和传统编译器之间有什么区别,还是仅仅是一个营销术语?
解决方法
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)并将其捆绑到二进制文件中.
AOT如何与机器代码编译器进行比较
如上所述,AOT将解释的字节码的一部分转换为机器代码.它不会消除对虚拟机字节码解释器的需求. VM将按原样运行,但偶尔会看到一条说明“执行此机器代码块”的指令.
这只是一个营销术语吗?
没有.Xamarin在该段中传达的信息是,他们的代码比简单的基于字节码的语言执行得更快.对于iOS和Android,他们都能够在热代码路径上执行本机代码以提高性能. AOT和JIT这两个术语是关于他们如何做到这一点的技术细节.