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

时间:2014-12-02 12:20:44

标签: c# compilation cil intermediate-language

  

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

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

1 个答案:

答案 0 :(得分:8)

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

首先,请注意,不仅.NET使用自己的中间语言。 Java has one as well as many, many other languages/platforms.

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

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

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

C#不是中级语言的好选择。虽然CIL和C#都是 Turing-complete ,这意味着任何其他编程语言都可以编译成C#和CIL,但C#只是太抽象,太高级了。因此,将一些非对象语言编译成C#(函数式语言,声明性语言)可能需要大量的C#代码,并且与所有高级语言的目标相同,抽象但仍然相比的情况下,实际执行会更慢。非常低级的中间语言,可以有效地JIT到本机代码。

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