处理器不能直接解释一个程序集。程序集采用的是另一种语言,即公共中间语言(Common Intermediate Language, CIL),或者简称为中间语言(IL)。
注意:CIL的另一种说法是MSIL,即Microsoft IL。本书采用的是CIL这种术语,因为该术语已被CIL标准采纳。从事C#开发的人在相互交流时,IL这个词显得很贴切,因为他们假定IL是指CIL,而不是其他类型的中间语言。
C#编译器只是将C#源代码文件转化成这种中间语言。为了将CIL代码转换成处理器能够理解的机器码,还是执行一个额外的步奏(该步奏通常是执行时完成的)。这个步奏涉及C#程序执行中一个重要的元素:VES(virtual Execution System, 虚拟执行系统)。VES偶尔也被人们称为运行时,他根据需要来编译CIL代码,这个过程称为及时编译或者JIT编译(just—in—time compilation)。假如代码在像“运行时”这样的一个“代理”的上下文中执行,就将这些代码称为托管代码(managed code),而在“运行时”的控制下执行的过程称为托管执行(managed execution)。之所以叫做托管代码,是因为“运行时”管理着诸如内存分配,安全性和JIT编译等方面,从而控制了主要的程序行为。执行过程中不需要“运行时”的代码称为“非托管代码”(umanaged code)。
VES规范被包含在一个包容面更广的规范中,即CLI(Common Language Infrastructure,公共语言基础结构)规范。作为一个国际性标准,CLI包含了以下几个方面的规范。
- VES 或 “运行时”。
- CIL。
- 为了语言操作性提供支持的一个类型系统,称为CTS(Common Type System,公共类型系统)。
- 如何编写能通过各种CLI兼容语言访问的库的指导原则,这部分内容具体放在公共语言规范(Common Language Specification,CLS)中。
- 使各种服务能被CLI(包括程序集的布局过文件格式规范)识别的元数据。
- 一个公共编程框架,称为基类库(Base Class Library,BCL),所有语言的开发者都能利用它。
假如在一个CLI实现的上下文中运行,那么程序员不需要直接编写代码,就能够使用大量服务和特性,包括如下方面。
- 语言互操作性:不同源语言之间的互操作性。语言编译器将每一种源语言转换成相同的中间语言(CIL),从而实现这种互操作性。
- 类型安全:检查类型间的转换,确保只有相互兼容的类型才会转换,这有助于防止缓冲区溢出——造成安全问题的一个主要诱因。
- 代码访问安全性:程序集开发者的代码有权在计算机上执行的证明。
- 垃圾回收:一种内存管理机制,能自动释放由“运行时”为数据分配的空间。
- 平台可移植性:允许一个程序集在多种操作系统中运行。要做到这一点,一个显而易见的限制就是不能使用平台相关的库,所以,同java一样,不可避免地有一些“个性”问题需要解决。
- BCL:提供开发者能够(在所有CLI实现中)依赖的一个大型代码库,使他们不必亲自编写这些代码。