📜  CIL或MSIL | Microsoft中间语言或通用中间语言

📅  最后修改于: 2021-05-29 14:23:54             🧑  作者: Mango

Microsoft中间语言(MSIL),也称为通用中间语言(CIL),是一组与平台无关的指令,由特定于语言的编译器从源代码生成。 MSIL是独立于平台的,因此,它可以在任何公共语言基础架构支持的环境(例如Windows .NET运行时)上执行。
通过JIT编译器将MSIL转换为特定于计算机环境的特定机器代码。这是在执行MSIL之前完成的。同样,MSIL在需求的基础上转换为机器代码,即JIT编译器根据需要而不是整个MSIL编译MSIL。

公共语言运行时(CLR)中的执行过程执行过程包括创建MSIL以及通过JIT编译器将MSIL转换为机器代码,如下所示:

MSIL或CIL

  • 在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指令将信号通知函数调用结束。