为什么 C# 不直接编译为机器代码

本文关键字:机器 代码 编译 为什么 | 更新日期: 2023-09-27 18:32:43

CIL是一种面向对象的汇编语言,完全是 基于堆栈。它的字节码被翻译成本机代码或 - 大多数 通常 — 由虚拟机执行。

为什么我们需要 CIL?是否可以将 C# 转换为本机代码而不是 CIL?如果所有 .Net 语言都编译为 CIL,为什么不使用 C# 而不是 IL?CIL 比 C# 或 VB 更具表现力吗?

为什么 C# 不直接编译为机器代码

问题更普遍:为什么我们需要中间语言?为什么许多现代高级语言编译为中间形式,然后将其解释/JIT化为本机代码?

首先,请注意,不仅 .NET 使用自己的中间语言。Java有一个以及许多其他语言/平台。

支持这种方法的原因有几个。最重要的是中间语言抽象了运行时环境的体系结构。它依赖于任何特定的体系结构,而是使用一些抽象(例如,在 CIL 中没有寄存器,尽管物理机有寄存器,但在 CIL 中存在局部变量,这些变量通常被 JIT 到物理寄存器(。

抽象意味着对安全性和性能进行推理要容易得多。例如,他们有一个形式定理,即CIL是类型安全的,由J. Kennedy和D. Syme证明。此外,抽象中间形式可能比平台本机代码更紧凑。另一个好处是,实际执行可以使用有关当前系统的信息,例如,在 32 位与 64 位环境中执行的相同 CIL 可以 JIT 到不同的本机代码,从而反映 64 位寄存器的可用性。

http://en.wikipedia.org/wiki/P-code_machine

C# 不是中间语言的好选择。尽管 CIL 和 C# 都是图灵完备的,这意味着任何其他编程语言都可以编译成 C# 和 CIL,但 C# 太抽象了,太高级了。因此,将一些非对象语言编译为 C#(函数式语言、声明性语言(可能需要大量 C# 代码,并且与所有高级语言都针对完全相同、抽象但仍然相当低级的中间语言(可以有效地 JIT 转换为本机代码(的情况相比,实际执行会更慢。

这就是为什么 CIL 包含 C# 中不存在的功能,反之亦然。例如,CIL 支持方法指针尾部调用,而 C# 不需要两者 - 但这样就可以更有效地翻译一些函数式语言。另一方面,C# 具有 CIL 中不存在的属性概念 - 这是因为属性可以被视为只是一种语法糖,不会在语言中引入任何表现力,而是引入某种便利