C#的编译过程
想要知道CLI,我们可以先了解一下C#的编译过程:
- C#代码首先通过C#编译器编译成公共中间语言(CIL)。
- 然后CIL再由虚拟执行系统(运行时)编译成机器码并开始执行。
由此可见,C#与C、C++之类的直接编译成机器码的语言不同,它的底层平台是运行时,而C和C++的底层平台是底层操作系统和机器指令,C#的编译过程看起来就像多了一个CIL和运行时。那么多这两个东西有啥用呢?请接着往下看。
CLI的定义
CLI不是某种代码库或者程序,它是一项国际性的标准,全名是公共语言基础结构(Common Language Infrastructure)。它是一系列规范的总称,上面说到的CIL和运行时就是其中之一。
CLI包含的规范有:
- 虚拟执行系统(VES,运行时)
- 公共中间语言(CIL)
- 公共类型系统(Common Type System,CTS)
- 公共语言规范(Common Language Specification,CLS)
- 元数据(Metadata)
- 框架(Framework)
CLI不是特定为C#服务的,它这套标准可以应用于多种语言,开发者可以依据CLI的规范实现各种编译平台并应用于多种语言和多种操作系统中。
CLI的实现
CLI有多种实现,各自都实现了一个C#编译器,其中比较出名的是.NET和Mono。
- 微软的.NET C#编译器时业内最主要的编译器,但只能应用在Windows操作系统中运行。
- Mono Project是一个开源的实现,提供了CLI规范及C#编译器的Windows、Linux和UNIX兼容版本,Unity3D游戏引擎就是利用Mono实现了多平台移植。
值得注意的是,CLI没有规定标准具体如何实现,但它描述了一个CLI平台在符合标准的前提下应该具有什么行为,这给CLI的实现者足够的灵活性去开发,但也导致了每个CLI和C#编译器实现和规范相符程度是不一的,有的实现不能编译全新语法。
CLI的作用
支持多种语言。CIL不只是C#的中间语言,还有可能是Java、C++等的中间语言,只是各由不同的编译器编译成CIL。这个特点实现了CLI支持多种语言在同一个应用程序内的交互,允许使用多种语言来编写同一个程序,并允许用一种语言写的代码访问另一种语言写的库。
托管机制。运行时将CIL转换成机器码并开始执行时,它还在继续管理代码,这样的代码称为托管代码,执行过程称为托管执行。在托管执行中,CLI平台可以对程序进行一些附加服务,比如垃圾回归、类型安全检查、代码安全检查等。
平台可移植性。由于C#的底层平台是运行时,而不是底层操作系统,所以针对不同的操作系统开发对应的运行时或者开发一个多系统通用的运行时,就可以达到一套C#代码在不同平台下运行,实现平台可移植性。