可能很多人都知道我們把程序打包成dll就丟出去了,但是里面的具體的執行過程是怎么樣的呢。
程序集是由元數據和IL組成的。IL是和CPU無關的語言,是微軟的幾個專家請教了外面的編譯器的作則,開發出來的。IL比大多數機器語言都要高級一點。IL能夠訪問和操作對象類型,並提高了指令來初始化對象,調用對象上的虛方法以及直接操作數組元素。
比如下面這個例子
class Program { static void Main(string[] args) { Console.WriteLine("Hello"); Console.WriteLine("GoodBye"); } }
這是一個很普通的例子,首先我們把這個程序編譯了生成了dll。然后再通過reflector來看看我們的dll是怎么樣的。可以看到我們的代碼變成了前面所說的IL代碼。
為了執行這個方法,首先必須要先把方法里面的IL代碼轉換為本機的CPU指令。這就是CLR里面的JIT(即時)編譯器的職責。
JIT的功能主要是這樣的
1、在負責實現類型的(console)程序集的元數據中查找被調用的方法(WriteLine)
2、從元數據里面找到該方法的IL
3、分配內存塊
4、將IL編譯成本機的cpu指令,然后把這些東西扔進步驟三分配的內存塊里面。
5、在Type表中修改對應的方法,讓她指向步驟三分配的內存塊
6、調到內存塊執行本機代碼。
當你第二次調用Console.WriteLine的時候,由於之前已經對WriteLine方法進行了驗證和編譯,所以到了第二次的話,就直接執行內存中的代碼塊了。
方法在首次被調用的時候,會有一些性能損失。以后對該方法的所有調用都以本機代碼的形式全速運行。
