ios - Xamarin 提前 (AOT) 编译器与普通编译器

标签 ios compiler-construction xamarin

我的理解是 Xamarin 的提前 (AOT) 编译器将 Xamarin.iOS 应用程序直接编译为 native ARM 汇编代码 (How Xamarin works) .

然而,我不明白的是为什么它需要被称为“提前”而不是仅仅作为一个普通的编译器。 Xamarin 的 AOT 编译器和传统编译器之间有什么区别,还是这只是一个营销术语?

最佳答案

AOT 与传统 JIT 编译器的比较

提前 (AOT) 编译与 Just-in-Time compilation 对比(JIT)。

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

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

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

AOT 与机器代码编译器的比较

如上所述,AOT 将解释的字节码的一部分翻译成机器码。它并没有消除对虚拟机字节码解释器的需要。 VM 将照原样运行,但偶尔会看到一条说明“执行这段机器代码”的指令。

这只是一个营销术语吗?

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

关于ios - Xamarin 提前 (AOT) 编译器与普通编译器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21689993/

相关文章:

ios - Xcode 构建错误 - 缺少所需的体系结构 i386

ios - Xamarin Forms 上的 UIWebView 弃用和 App Store 拒绝

c - 全局空间中的指针初始化 C 语句如何在编译/链接时获取其分配的值?

c++ - 为自制操作码列表创建 C++ 编译器/链接器

azure - Xamarin + RestSharp + .Net Core Web API - 值不能为空。参数名称 : src

Xamarin Forms - PopToRootAsync 然后 PushAsync 不会触发

ios - 从模型的属性中获取可选值

ios - 从报亭应用程序过渡到非报亭应用程序

iphone - 如何将 touchesEnded 转移到由 touchesBegan 在不同的 UIView 上添加的 UIView?

ios - 以编程方式将 UIButton 添加到 UITableView 但按钮不显示