C#初入CLR基础(一)

有代码:
 static void Main(){
        Console.WriteLine("Hello,World");
}

在Main方法首次执行之前,会执行这样一个过程:
    1.首先检测Main引用的所有类型(这里引用了Console这个静态类),并且在其引用类(Console)中找到其元数据调用的方法(WriteLine)
    2.获取该方法的IL(Intermediate Language:中间语言)
    3.分配其所需要用的内存块

    4.将IL编译为可识别的CPU(机器语言)指令并分配到开辟的内存块中


在Main方法首次调用的时候,会执行这样一个过程:

    JITCompiler(just in time Compiler:即时编译器)被当方法调用,它此时已经知道需要调用哪一个类型的哪一个方法(Console类型的WriteLine方法),并验证IL代码的正确性(检测语法错误等),JITCompiler会返回到Main,且Main正常执行,此刻已经完成了整个Main的编译.(以上省略了一些有点绕的小细节)


    在Main 2+ 次调用的时候则直接省略了整个JITCompiler的调用过程,所以C#首次运行的性能缺失将不会在发生,之后的调用全都以本机代码形式全速运行,无需把未修改的代码重新编译.

当Microsoft Visual Studio重新运行时,首次执行Main则同上.


IL(中间语言):
    使用.NET框架提供的编译器可以直接将源程序编译为.exe OR .dll exe文件可通过ILDasm反编译为IL代码,有兴趣的小伙伴可以去看看什么是中间语言(例如装箱拆箱的详细过程等).
JITCompiler(即时编译器)为CLR(公共语言运行时)的一个组件.

你可能感兴趣的:(C#)