MSIL和LLVM bitcode有什么区别?

时间:2017-12-03 19:04:27

标签: .net swift

我是.Net的新手,我想先了解一下基础知识。 MSIL和LLVM bitcode有什么区别?

1 个答案:

答案 0 :(得分:5)

LLVM bitcode和MSIL均为intermediate languages。本质上,它们是通用汇编代码语言:不像大多数源语言那样高级(例如,Swift,C#),但也不像真正的汇编语言那样低级(例如,ARM,x86)。这两种语言之间存在许多技术实现差异,但大多数开发人员不需要了解小东西*。他们只需要在各自的平台上使用它们的方式。分配模型。

LLVM bitcode格式是the intermediate representation code used within the LLVM compiler的序列化版本。 "前端"编译器将源语言(如Swift)转换为LLVM bitcode,然后将"后端"编译器将bitcode转换为目标指令集(例如ARM机器代码)。 (注意:此答案的先前版本暗示LLVM bitcode与处理器无关。事实并非如此,因为源语言依赖于目标处理器。)

Apple允许iOS开发人员将他们的应用程序作为完全编译的ARM代码or as LLVM bitcode提交,后者包括:

  

[...]将允许Apple在将来重新优化您的应用二进制文件,而无需向商店提交新版本的应用。

基本上,您在开发环境中运行LLVM前端,将bitcode传递给Apple,后者在其服务器上运行LLVM后端。这个过程被称为提前(AOT)编译the Wikipedia article关于非bitcode案例是否也是AOT或者是否只是两个想法"标准"汇编)。

但无论你是否使用bitcode,iOS最终用户总是将应用程序作为ARM机器代码。

.NET中的情况有所不同。大多数.NET代码都编译为MSIL,MSIL打包在名为程序集的文件中。最终用户设备上的.NET运行时加载并执行程序集,在运行时将MSIL编译为设备处理器的机器代码。这称为即时(JIT)编译

通常,MSIL与处理器无关,因此大多数开发人员都认为.NET应用程序也与处理器无关。但是,在最终用户通过JIT运行应用程序之前,有许多方法可以打包特定于处理器的代码:

  1. 某些工具(如Native Image Generator.NET Native)允许AOT编译。实际上,上传到Microsoft Store的通用Windows平台(UWP)应用程序是AOT编译的 - 您将应用程序的MSIL版本提交给Microsoft,然后他们的服务器使用.NET Native为Windows 10支持的各种体系结构编译它。 p>

  2. 也可以在程序集本身中包含本机代码;这些被称为mixed assemblies

  3. 如果源语言使用"不安全" MSIL本身可以是特定于处理器的。操作(例如pointer math in C#)。

  4. 但这些通常是例外,而不是规则。通常,.NET应用程序是在MSIL中分发的,而最终用户则是设备是生成本机代码的地方。

    总结如下:

    • LLVM bitcode是特定于处理器的,但不如实际机器代码那么低。 Apple允许iOS开发人员以bitcode的形式提交应用程序,以便在可以引入优化时进行未来的重新编译。最终用户运行本机可执行文件。

    • MSIL通常与处理器无关。最终用户通常运行此处理器无关的代码,.NET在运行时将MSIL编译为本机代码。但是,在某些情况下,部分或全部应用可能是本机代码。

    *当然,如果您 对技术细节感兴趣,则有标准for LLVM bitcodefor MSIL, under its ECMA name CIL。我对后者知之甚少;在粗略地看一眼前者之后,最值得注意的技术差异是内存模型:LLVM bitcode是基于寄存器的,MSIL / CIL使用评估堆栈。