CLR的執行模型(C#)

來源:互聯網
上載者:User

好好學習底層運行機制,從CLR via C# 開始。

CLR的執行模型:

    CLR:Common Language Runtime,是一個可由多種程式設計語言使用的“運行時”。CLR的核心功能(比如記憶體管理、程式集載入、安全性、異常處理和線程同步)可由面向CLR的所有語言(C#,Visual Basic,F#等)使用。

1.將原始碼編譯成託管模組:                                                  

    CLR根本不關心開發人員用那一種語言來寫原始碼,說明我我們寫C#代碼的時候肯定還經過一定的步驟才能跟CLR,於是就需要相應的面向CLR的、可以編譯C#代碼的編譯器,以便CLR可以識別你寫的東西。這個編譯器會檢查文法和分析原始碼,產生的是一個託管模組

 

    託管模組是一個可以在CLR中執行的PE(Portal Executable)檔案。

    書中介紹託管模組由PE32或PE32+頭、CLR頭、中繼資料、IL(中繼語言)代碼。看的時候個人覺得理解中繼資料和IL比較重要。

    中繼資料:包含兩種類型的中繼資料表:一個表描述原始碼中定義的類型和成員;另一個表描述原始碼引用的類型和成員 。

    IL(中繼語言)代碼:編譯器編譯原始碼時產生的程式碼。在運行時,CLR將IL編譯成本地CPU指令。(IL代碼有時稱為Managed 程式碼,因為CLR要管理它的執行)

2. 將Managed 程式碼合并成程式集:                                                

“CLR實際不和模組一起工作。相反,它是和程式集一起工作的。”

    前面說到CLR不會識別你的具體語言,需要相應編譯器產生相應的託管模組。這會又說實際不和模組一起工作,引入了程式集的概念。文中說程式集是一個抽象的概念,初學者往往難以把握它的精髓。但我看到程式集(assembly)的時候就有一種無比熟悉的感覺,很經常聽到這個詞,我感覺我離真相又近了一步。 

    就不再抄書中的概念了,抄個圖:

 

 

3. 載入通用語言執行平台:                                                     

    你產生的程式集既可以是一個可執行檔應用程式,也可以是一個DLL(其中含有一組由可執行程式使用的類型)。最終由CLR管理這些程式集中代碼的執行。

    載入公用語言進行時是window的事,我們可以考慮在window的一系列操作之後會初始化CLR,然後載入exe程式集,然後調用其入口方法(Main)。隨即,託管的應用程式將啟動並運行。

4. 執行程式集的代碼:                                                       

    在第一步,即原始碼編譯成託管模組的時候提到:中繼資料總是和包含IL代碼的檔案關聯,由於編譯器同時產生中繼資料和代碼,把它們綁定一起,並嵌入最終產生的託管模組,所以中繼資料和它描述的IL代碼永遠不會失去同步。

    可想而知,當你調用入口方法(Main)的時候,中繼資料也跟著進來了,它們是一對好基友。

 

 

    當你調用Console.WriteLine(“Hello”);時,肯定和它的中繼資料脫不了干係,中繼資料可是管著著其定義或者引用的資料結構,所以當Main方法引用了一個Console類型時,就導致了CLR分配一個內部結構。在這個內部結構中,Console類型定義的每個方法都有一個對應的記錄項。每個記錄項都容納了一個地址,根據此地址即可找到方法的實現(是不是類似C中的指標?),對這個結構進行初始化時,CLR將每個記錄項設定(指向)包含在一個函數中(JITCompiler),圖例中可以很清楚的獲知JITCompiler 函數的作用。 

    當第二次調用同樣的方法時,如Main第二次調用WriteLine。這一次,由於已對WriteLine的代碼進行了驗證和編譯,所以會直接執行記憶體塊中的代碼,完全跳過JITCompiler函數。WriteLine方法執行完畢之後,會再次返回Main。所以一個方法只有在首次調用的時候才會造成一些效能損失。以後對該方法的所有調用都以本地代碼的形式全速運行,無需重新驗證IL並把它編譯成本地代碼。 

    JIT編譯器(JITCompiler)將本地CPU指令儲存到動態記憶體中。一旦應用程式終止,編譯好的代碼也會被丟棄。

 

新手,歡迎指教!

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.