编译 IL 是否有任何其他目的

本文关键字:其他 任何 IL 是否 编译 | 更新日期: 2023-09-27 18:32:08

我很确定将高级语言编译成某些字节码的一个原因是虚拟机(Java或.NET)可以生成依赖于机器的本机指令。

这是唯一的原因吗?如果有一些方法(理论上)可以在程序执行之前(在不同的计算机上)生成依赖于机器的指令,那么编译为字节码有什么目的吗?我们可以编译成机器代码并在运行时执行这些指令吗?

要清除它:

如果编译器可以为每台计算机生成完美的指令,是否需要 IL?

编译 IL 是否有任何其他目的

简化了编译器,因为现在我们可以只针对一种简单的汇编语言 - CIL,而不是四到五种复杂的汇编语言。

您不能掉以轻心。 x64汇编作为近四十年前8位指令集扩展的扩展,充满了特殊情况和设计缺陷。相比之下,CIL是神奇的独角兽彩虹。

简化了开发,因为我们不再需要仅仅为了构建手机应用程序而设置复杂的交叉编译工具链。单个库可以在桌面和移动设备上运行,无需重新编译。

是的,您可以将代码的多个版本(每个体系结构一个)捆绑到一个文件中。苹果在PowerPC到英特尔的过渡中做到了这一点。但是生成的二进制文件通常很大,这不适用于移动设备。

增加了优化的范围。AOT 编译器中的任何优化仅影响其编译的代码。但是 JIT 中的优化将加快所有程序的速度。

JIT 还有一个额外的信息源——正在运行的程序本身。通过观察程序的运行方式,JIT 可以针对最需要它的代码区域。Java HotSpot VM 广泛使用这种技术。

我认为还有更多优势,但这些都是显而易见的。

CLR 程序集包含 IL/MSIL/CIL/无论现在的术语 du jour 是什么。也就是说,使编译的代码硬件和操作系统独立。只要目标系统支持指定版本的 CLR(并且代码没有对 P/Invoke 等执行任何有趣的操作),程序集就应该在目标系统上运行。加载程序集时,它会 JIT 到本机机器代码中(或者您可以ngen它以生成特定于计算机的二进制文件。

拥有可移植可执行文件的原因应该是相当明显的(参见Java)。

所以你想知道为什么要使用中间语言?

字节码

(IL,Java字节码,甚至VB6的p码)提供了几个优点。这些来自这样一个事实,即字节码不会立即编译并在目标 CPU 上运行。在IL的情况下,它只是及时编译(JIT)以按需机器指令。

虽然这似乎比立即编译为本机代码要复杂得多,但我们从中获得了许多有用的功能,例如反射、垃圾回收、类型安全和异常处理。

你可以通过 JITig C# 代码到本机代码中获得那些没有 IL 的花哨托管功能,但随后你必须实现这些功能并为你想要的每种语言(C++/CLI、VB.NET 等)编写一个 JITer。

此外,为基于机器的语言编写这些托管功能比尝试为主要为人类使用而设计的语言编写这些功能要容易得多。

相关文章: