Per*_*kie 5 c# cil compilation intermediate-language
CIL是一种面向对象的汇编语言,完全基于堆栈.它的字节码被翻译成本机代码,或者 - 最常见的 - 由虚拟机执行.
为什么我们需要CIL?是不是可以将C#转换为本机代码而不是CIL?如果所有.Net语言都编译成CIL,为什么不使用C#而不是IL?CIL比C#或VB更具表现力吗?
问题更为笼统:为什么我们需要中间语言?为什么许多现代高级语言编译成中间形式,然后解释/ 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#都是Turing-complete,这意味着任何其他编程语言都可以编译成C#和CIL,但C#太抽象,太高级.因此,将一些非对象语言编译成C#(函数式语言,声明性语言)可能需要大量的C#代码,并且与所有高级语言的目标相同,抽象但仍然相比的情况下,实际执行会更慢.非常低级的中间语言,可以有效地JIT到本机代码.
这就是为什么CIL包含C#中不存在的功能,反之亦然.例如,CIL支持方法指针和尾调用,而C#不需要两者 - 但这样一些函数式语言可以以更有效的方式进行转换.另一方面,C#具有CIL中不存在的属性概念- 这是因为属性可以被视为语法糖,不会引入任何表达性,而是在语言中引入某种方便性.
| 归档时间: |
|
| 查看次数: |
2221 次 |
| 最近记录: |