C#与.NET程序员面试宝典 2.2.1 面试题8:IL语言如何在.NET下运行

时间:2022-09-28 09:07:23

通过前面小节的介绍,读者可以理解.NET程序中的代码都属于托管代码,即.NET程序编译后并不是直接生成机器代码,而是生成中间代码(MSIL)简称IL。本小节借助回答这个问题向读者介绍.NET框架下的IL语言。

 

【出现频率】★★★★

 

【关键考点】

IL基本概念

IL的作用

 

【考题分析】

在.NET框架中,公共语言基础结构使用公共语言规范来绑定不同的语言。公共类型系统(CTS)包含在公共语言规范中的部分要求不同的语言均需要实现,因此公共语言基础结构允许不同的语言使用.NET框架。在.NET框架中,所有的语言(C#,VB.NET,Effil.NET等)最后都被转换为了一种通用语言,即微软中间语言(MSIL)。

 

看一段简单的示例代码,以及第一次编译后生成的MSIL语言的情况。代码如下所示。

 

static void Main(string[] args)                                                                      //主程序

         Console.WriteLine("这是一个MSIL测试程序,Hello Kitty");      //输出一个测试信息 

         Console.Read();

}

 

这段代码相当简单,而笔者列举它的目的也不在于代码本身,而在于编译它所生成的MSIL代码。有汇编基础或者有兴趣的读者,可以尝试详细地查看一下MSIL代码和元数据,这样可以帮助读者更加清晰地了解自己编写的代码的执行方式。下面展示被编译后的MSIL代码:

 

//将上面C#代码编译成MSIL代码

.method private hidebysig static void Main(string[] args) cil managed                          //主程序

{

    .entrypoint

    .maxstack 8

    L_0000: nop

    L_0001: ldstr "\u8fd9\u662f\u4e00\u4e2aMSIL\u6d4b\u8bd5\u7a0b\u5e8f\uff0cHello Kitty"

    L_0006: call void [mscorlib]System.Console::WriteLine(string)

    L_000b: nop

    L_000c: call int32 [mscorlib]System.Console::Read()

    L_0011: pop

    L_0012: ret

}      

 

从理论上来说,IL将消除多年以来业界中不同语言之间的纷争。在.NET的编码世界中可能出现下面的情况:一部分代码使用C#或VB完成的,另一部分代码使用Effil实现,但是最后所有这些不同语言编写的代码都将被转换为中间语言。这将给程序员提供了极大的灵活性,程序员可以选择自己熟悉的、擅长的语言,并且再也不用为学习不断推出的新语言而烦恼。

 

注意:MSIL通常简称IL。

 

【答案】

MSIL是将.NET代码转化为机器语言的一个中间过程,它是一种介于高级语言和基于Intel的汇编语言之间的伪汇编语言。当用户编译一个.NET程序时,编译器将源代码翻译成一组可以有效地转换为本机代码且独立于CPU的指令。当执行这些指令时,实时(JIT)编译器将它们转化为CPU特定的代码。由于公共语言运行库支持多种实时编译器,因此同一段MSIL代码可以被不同的编译器实时编译并运行在不同的结构上。