CIL----公共中间语言

CIL----公共中间语言

 

首先要了解的就是C#程序源码在编译之后会得到什么样的一个文件.大家知道,过去使用VC++生成的可执行文件,经过预编译,编译,汇编,链接几个步骤后,最终生成的可执行文件就已经包含了处理器的本地代码(Native Code),支持他运行的知识操作系统的和本地的机器指令集.那么采用C#编译器生成的文件又是啥呢?现在需要引入程序集这个概念:.NET框架下,类似C#这样的高级语言经过编译后生成的结果文件被称作程序集,其后缀名是.dll(类库).exe(可执行程序).再引入这个概念之前,前面提到程序集时,都是用”文件”这个词来描述的.

 

程序集的定义只是给编译生成的文件一个稍微正式一点的名称,对于解释”它是由什么构成的”这个问题并没有太大的帮助.为了进一步了解程序集,我们再来做一个实验,使用VB.NET创建一个控制台应用程序(ConsoleAppVB),并生成一个程序集,代码功能和上面用C#创建的项目是一样的.

Module Module1
 
    Sub Main()
        Dim text As String = "hello,world"
        Console.WriteLine(text)
    End Sub
 
End Module

现在,需要一个工具来查看这个程序集的内容,并且与C#项目生成的程序集进行对比.还好,微软给我们提供了一个利器----IL DASM(IL Disassembler,IL反汇编程序)来帮助开发者查看程序集的信息.如果暗转了VS,IL DASM将会随同VS一起安装.依次选择开始菜单->VS->SDK Tools->IL 反汇编程序(IL DASM)可以启动IL DASM.

 

如果你找不到的话,试试这个路径:

C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin 这是我电脑中的路径

打开IL DASM后选择VB.NET项目生成的ConsoleAppVB.exe

 

这部分内容很多,这里暂且略过.展开图中的ConsoleAppVB.Moudle1类型,Main()方法上双击,会弹出一个窗口,显示的代码如下:

 

看上去有点像汇编语言,汇编不懂不要紧,楼主在接下来的时间将会讲解一下汇编.在这里可以看到熟悉的string text变量声明及”hello,world”.

 

接下来再打开C#项目生成的ConsoleApp.exe,进行同样的操作,再开打Main()方法后会发现其中的代码和上面图中的代码几乎完全相同,下面是C#的代码.

 

现在对上面你的程序集所包含的类似汇编的语言做一下介绍,这是本节的主题CIL(Common Intermediate Language,公共中间语言).CIL最初是随着.NET由微软一起发布的,因此之前也叫做MSIL(Microsoft Intermediate Language),后来进行了标准化,之后便称作CIL.有时候也会简写IL,其实都是值同样的东西.

 

我们可以将上面的过程用下图表示一下:

 

接下来再深入的分析一下,公共中间语言这个术语到底有哪几层含义:

公共.     因为不论C#语言也好,还是VB.NET语言也好,C++/CIL语言也好,甚至是从新开发一套以自己的名字缩写命名的语言,只要它期望运行的目标平台是.NET,在经过相应的编译器编译之后,所生成的程序集就是由CIL语言代码描述的.

中间.    这个词大有深意,为啥不叫公共机器语言(Common Machine Language),或者公共本地语言(Common Native Language)?因为这种语言知识比我们使用的高级语言,比如C#低级一点,并不是CPU可以直接执行的本地机器语言.这种语言还需要.NET运行时(.NET runtime)环境的支持,在执行之前,进行一个被称为Just-in-time(即时)的二次编译过程,才能转变成计算机可以识别的指令.关于.NET运行时,以及详细过程以后再说,现在只需要知道,这个文件所包含的CIL代码并非机器可以直接执行的指令代码.

语言.    CIL不过是一种程序语言,只不过相对于C#来说,它是一种更低级的语言.从前面的代码截图来看,CIL是一种基于堆栈的语言,同时,它提供了class,interface,继承,多态等诸多面向对面的语言特性,因此它又是完全面向对象的语言.

 

这么说的话,你如果愿意,不怕麻烦,完全可以直接编写CIL代码,并且使用CIL的编译工具IS ASM(IL Assembler,IL汇编程序)来对它进行编译.只不过,和大多数低级语言一样,这种方式会使开发效率变得很低.这里注意区别一下IL ASMIL DASM,它们的拼写是不同的.

 

为了加深印象,咱们编一段CIL代码,并且使用ILASM工具对其进行编译,得到和前面一样的ConsoleApp.exe程序.

 

(1).打开记事本,输入下面的代码,然将其保存在d:\ConsolApp.il

.assembly extern mscorlib{}
.assembly ConsoleApp{}
.module ConsoleApp.exe
.class public auto ansi Program extends System.Object
{
.method public static void Main()
{
.entrypoint
nop
ldstr "hello,world"
call void [mscorlib]System.Console::WriteLine(string)
nop
ret
}
}


(2).打开VS命令行工具,输入:

d:\ilasm ConsoleApp.il

(3).成功之后会看到ConsoleApp.exe程序,他的执行结果和上面用C#编写的完全一样.

 

由于程序集是由CIL语言所描述的,因此CIL也叫做程序集语言(Assembly Language).又因为.NET程序集需要由.NET运行时加载才能运行,可以视其为由.NET运行时进行管理的,所以CIL代码也叫做托管代码(Managed Code).相对的,不需要.NET运行时就可以执行的代码叫做非托管代码(Unmanaged Code).

 

好了,说完CIL的存在了,现在应该CIL是个啥玩意了吧.最好在头脑中建立建立起两个模型或两种视角:一种是基于C#或其他高级语言的源程序视角,一种是基于CIL中间语言的程序集视角.C#源程序在被编译为程序集以后,就独立于C#,因此程序集可以由其他种类的语言所调用;同时,因为程序并没有包含本地机器的指令,所以它与具体的机器类型也分隔开了,可以被装有.NET框架的任何机器运行.

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值