一個C#程序的執行過程


    可能很多人都知道我們把程序打包成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方法進行了驗證和編譯,所以到了第二次的話,就直接執行內存中的代碼塊了。

      方法在首次被調用的時候,會有一些性能損失。以后對該方法的所有調用都以本機代碼的形式全速運行。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM