Microsoft中间语言(MSIL),也称为通用中间语言(CIL),是一组与平台无关的指令,由特定于语言的编译器从源代码生成。 MSIL是独立于平台的,因此,它可以在任何公共语言基础架构支持的环境(例如Windows .NET运行时)上执行。
通过JIT编译器将MSIL转换为特定于计算机环境的特定机器代码。这是在执行MSIL之前完成的。同样,MSIL在需求的基础上转换为机器代码,即JIT编译器根据需要而不是整个MSIL编译MSIL。
公共语言运行时(CLR)中的执行过程:执行过程包括创建MSIL以及通过JIT编译器将MSIL转换为机器代码,如下所示:
- 在CLR的编译期间,特定于语言的编译器会将源代码转换为MSIL。此外,与MSIL一起,在编译中还会生成元数据。元数据包含诸如代码中类型的定义和签名,运行时信息等信息。
- 通过组装MSIL,可以创建一个通用语言基础结构(CLI)组装。该程序集基本上是用于安全性,部署,版本控制等的已编译代码库,它具有两种类型,即进程程序集(EXE)和库程序集(DLL)。
- 然后,JIT编译器将Microsoft中间语言(MSIL)转换为特定于JIT编译器运行所在的计算机环境的机器代码。 MSIL在需求的基础上转换为机器代码,即JIT编译器根据需要而不是整个MSIL进行编译。
- 然后,由JIT编译器获得的机器代码由计算机的处理器执行。
示例: MSIL由特定于语言的编译器从下面给出的源代码生成。为了详细了解MSIL,给出了显示为GeeksforGeeks的Demo类的简单C#源代码,如下所示:
using System;
public class Demo {
public static void Main()
{
Console.WriteLine("GeeksforGeeks");
}
}
C#编译器为上面提供的代码创建的MSIL如下所示:
// =============== CLASS MEMBERS DECLARATION ===================
.class public auto ansi beforefieldinit Demo
extends [mscorlib]System.Object
{
.method public hidebysig static void Main() cil managed
{
//
.maxstack 8
IL_0000: nop
IL_0001: ldstr "GeeksforGeeks"
IL_0006: call void [mscorlib]System.Console::WriteLine(string)
IL_000b: nop
IL_000c: ret
} // end of method Demo::Main
.method public hidebysig specialname rtspecialname
instance void .ctor() cil managed
{
//
.maxstack 8
IL_0000: ldarg.0
IL_0001: call instance void [mscorlib]System.Object::.ctor()
IL_0006: ret
} // end of method Demo::.ctor
} // end of class Demo
// =============================================================
在上面的MSIL中,有1或2个字节长的操作码。 mscorlib.dll中包含从其继承所有其他类的基类声明。在方法Main()中,指令ldstr将字符串“ GeeksforGeeks ”加载到堆栈上。然后,调用静态System.Console.Writeline函数,并从堆栈中弹出字符串。最后,ret指令向函数调用的结束发出信号。
然后, .ctor( )语句隐含了默认的构造函数,该构造函数没有用于Demo类的参数。该构造函数由编译器自动为非静态类Demo创建。调用指令将传递基础对象构造函数,而ret指令将信号通知函数调用结束。