我是.Net的新手,正在努力先了解基础知识。MSIL和LLVM bitcode有什么区别?
LLVM比特码和MSIL都是中间语言。本质上,它们是一种通用的汇编代码语言:不像大多数源语言(例如Swift、C#)那样高级,但也不像真正的汇编语言(例如ARM、x86)那样低级。两种语言之间存在许多技术实现差异,但大多数开发人员不需要知道这些细节*.他们只需要知道在各自平台的分布模型中如何使用它们。
一些工具,例如 本地图像生成器 和 .NET Native,可以进行AOT编译。实际上,上传到Microsoft Store的通用Windows平台(UWP)应用程序都是经过AOT编译的-您将应用程序的MSIL版本提交给Microsoft,然后他们的服务器使用.NET Native将其编译为Windows 10支持的各种体系结构。
还可以将本机代码与程序集本身一起包含; 这些被称为混合程序集。
如果源语言使用“不安全”操作(例如,C#中的指针运算),则MSIL本身可以是处理器特定的。
但这些通常是例外,而不是规则。通常,.NET应用程序以MSIL形式分发,并且最终用户的设备是生成本地代码的地方。
总之:
LLVM位码是特定于处理器的,但不像实际机器码那样低级。苹果允许iOS开发者将应用程序提交为位码,以便在未来引入优化时进行重新编译。最终用户运行本地可执行文件。
MSIL通常不特定于处理器。最终用户通常运行这种处理器不可知的代码,.NET会在运行时将MSIL编译为本地代码。但是,在某些情况下,一些或所有应用程序可能是本地代码。
* 当然,如果您对技术细节感兴趣,有LLVM比特码的标准和在ECMA名称CIL下的MSIL的标准。我在后者方面有一定的知识;经过对前者的粗略浏览,最显着的技术差异是内存模型:LLVM比特码是基于寄存器的,而MSIL/CIL使用评估堆栈。