CIL(公共中间语言)

  • CIL(公共中间语言)已关闭评论
  • 201 次浏览
  • A+
所属分类:.NET技术
摘要

熟悉C#开发的朋友们都应该知道,使用C#语言编写的程序在编译之后生成的文件被称做为程序集,这其中又分为dll(类库)和exe(可执行程序)两种类型,而程序集当中的内容其实就CIL(Common Intermediate Language,公共中间语言)。CIL最初是随着.NET由微软一起发布的,因此有的地方也叫做MSIL(Microsoft Intermediate Language),后来进行了标准化就被称作CIL,在一些书或文字中,CIL也会简写,其本质都是相同的东西。

熟悉C#开发的朋友们都应该知道,使用C#语言编写的程序在编译之后生成的文件被称做为程序集,这其中又分为dll(类库)和exe(可执行程序)两种类型,而程序集当中的内容其实就CIL(Common Intermediate Language,公共中间语言)。CIL最初是随着.NET由微软一起发布的,因此有的地方也叫做MSIL(Microsoft Intermediate Language),后来进行了标准化就被称作CIL,在一些书或文字中,CIL也会简写,其本质都是相同的东西。

 

1.CIL是绕不开的弯

在.NET平台下不仅仅支持C#这一门高级编程语言,这其中还包括但不限于:VB.NET、F#、C++,而这些要在.NET平台下使用的高级语言,最终编译后都会生成为CIL代码,所以说“CIL是绕不开的弯”。

为了证明这一特点,我们选用VB.NET来和C#做一个对比试验,首先我们用VB.NET创建一个控制台程序并生成一个程序集。

1 Module Module1 2  3     Sub Main() 4         Dim text As String = "hello,world" 5         Console.WriteLine(text) 6     End Sub 7  8 End Module

代码写好后,现在需要通过微软提供的IL DASM(反汇编程序)来查看这个程序集的内容。打开IL DASM后选择VB.NET项目生成的exe文件,然后在界面的节点上选择到Main方法节点,双击打开后解析出下图的内容。

CIL(公共中间语言)

接下来我们使用和VB.NET相同的代码编写一个程序,再编译后打开C#项目所生成的exe文件,在进行和上面同样的操作,然后选择到Main方法节点,双击打开后解析出下图的内容。

CIL(公共中间语言)

如果你和我一样实践了上面的简单试验,那么我们可以初步推断出:不管是VB.NET还是C#,只要是要运行在.NET平台下的高级编程语言,在编译之后都会生成相同格式的程序集文件(dll或exe)并且内容都是CIL代码。如果不同语言所实现的代码都相同时,程序集所包含的CIL代码也是类似的。

CIL(公共中间语言)

 

2.概念解析

我们通常去记住一个名称概念的时候,如果死记硬背、生搬硬套,实际上是很难牢记于心的。为了记住这些概念我们还是要刨析其中的原理,去深刻理解这些术语背后的含义,中国文化不是就有这一道理嘛——格物致知。所以接下来我们深入的分析下,“公共中间语言”这个术语到底包含了哪些含义。

2.1.公共

在本文的对比试验中,其实就体现出这个“公共”的内涵:不管是什么编程语言,甚至是你重新开发一套以自己名称命名的语言也好,只要他想要在.Net平台上运行程序,那么它在编译之后,所生成的程序集中的内容都会是CIL代码。那么这也说明了,CIL不仅仅是为某个语言去单独服务的,它是面向多种语言的。

2.2.中间

中间一词是CIL最突出的一面,为什么要叫中间?怎么不叫上下或者前后?因为它不是最新CPU可以直接执行的本地机器语言,它只是一个过渡,中间语言还需要进行一个被称为“Just-in-time(即时)”的二次编译过程,才能转变成计算机可以识别的指令,从而运行我们的程序逻辑。

CIL(公共中间语言)

打个通俗的比分,比如在吃东西的时候,嘴巴咀嚼吞咽食物后,食物在肚中的时候其实就是一个“中间”性质。因为吃进肚子的食物这并不代表食物的能量被我们直接吸收,它还需要我们的胃肠道进行消化(“二次编译”)的过程,把食物消化成身体能接收的营养物质,我们人的身体才能从食物获取能量。

2.3.语言

语言其实就是CIL的一种内容形式的描述,它本质上还是一种程序语言。只不过相对于C#来说,它并不是面向开发者特别易于使用的“低级”语言。

如果仔细观察IL DASM解析后的CIL代码,就可以看出CIL是一种基于堆栈的语言,并且它还提供了面向对象的语言特性。如果你愿意,甚至可以直接编写CIL代码进行开发,并且使用CIL的编译工具IL ASM(汇编程序)来对它进行编译,只不过这种方式会让我们的开发效率变的很低。

 

3.浅谈托管和非托管

C#编写的程序在编译后会生成程序集,程序集中的内容是CIL代码,而.NET运行时(CLR)会去执行程序集中的CIL代码,那么只要是必须依托.NET运行时(CLR)才能执行的代码就叫做“托管代码”。相对的,不需要.NET运行时(CLR)就可以运行的代码就叫做“非托管代码”。

 

4.独立性

C#源程序在编译后会生成包含CIL代码的程序集文件,这其实也代表它成为了一个独立的个体,不在依赖于C#。因此程序集就可以由其他种类的语言所引用。那么这个时候,如果有VB.NET或者F#开发的项目其实就可以引用C#的程序集。程序集也就作为一个独立的个体服务于.Net平台下不同语言开发的项目。

另外,基于CIL的中间性质说明了它并不是本地机器可以直接执行的指令,所以它没有与某个固定的机器所绑定在一起,它可以被装有.NET框架的任何机器上运行。