初讀CLR Via C# 知識總結

來源:互聯網
上載者:User

 

      相信很多有過面試經曆的開發人員都在面試的時候被問及到.net比較底層的東西,如程式在底層是怎麼啟動並執行?筆者就遇到過面試官問反射的機制是什嗎?當時確實答的一塌糊塗,但是有幸還是找到了一份不錯的工作。在工作中猛然覺醒,是時候(有一定的開發基礎)有必要瞭解一些.net啟動並執行機制了,在買了一本CLR Via C#的書並在細細品味了第一章之後,決定把所學到的東西與大家進行分享,雖然之前都知道的知識,但是還是讓我學到了很多的東西。可能總結的過程中還是有些不對的地方,希望各位看官能指出,並提出,我將儘快改正。謝謝!(目前只總結第一章前半部分,後半部分文檔還未整理出來,望大家海涵)

      言歸正傳,先從CLR是什麼開始談起。CLR(Common Language Runtime)通用語言執行平台,是可被多種語言所同時使用,並且很多特性可用於所有針對它的開發語言。我們所編寫的程式在編譯的同時由編譯器進行文法的檢查和程式碼分析,然後產生一個託管模組。

圖1.1

      這時又需要瞭解一個概念了,什麼是託管模組?

      託管模組是由一個標準的32位Microsoft Windows 可執行體(PE32)檔案或者是一個標準的64位Microsoft Windows 可執行體(PE32+)檔案,以上兩種的其中一種再加上CLR頭資訊(包含使該模組成為託管模組的一些資訊,如:CLR的版本,託管模組的方法進入點(我們俗稱的Main方法等))再加上中繼資料(這裡的中繼資料並不是我們的原始碼檔案,是每個託管模組所包含的中繼資料表,一種類型表、一種原始碼參考型別、成員表)最後再加上IL代碼(就是由我們各個語言的編譯器所編譯出來的中繼語言代碼),在最後啟動並執行時候,CLR控制IL代碼的運行。

      寫到這裡大家可能覺得CLR是和託管模組一起工作的吧?其實不是,CLR只和程式集(assembly)一起工作。又來一個概念,什麼是程式集?

      程式集是一個或者多個由資源檔、模組組成的邏輯性分組。程式集在整個程式中的重用和版本控制都是最小的單元。程式集是怎麼形成的呢?當我們通過圖1.1所示的過程把原始碼檔案通過各種語言的編譯器編譯成託管模組(中繼語言和中繼資料)之後,再加上我們程式中需要的一些jpge、gif等資源檔交由產生程式集的工具進行處理之後,成為與CLR打交道的程式集(預設情況下,產生程式集的工具由編譯器來完成,但不一定是編譯器)

      那麼如何確定我們機器上是否安裝了.Net的架構呢?在運行裡面可以輸入%windir%/System32,查看目錄中是否存在mscoree.dll檔案。

      在說了這些之後,讓我們看看CLR到底是如何讓我們所寫的代碼跑起來的。

      在我們寫完原始碼檔案之後,進行編譯運行(這裡單單以C#為例筆者主要做的就是C#的開發,慚愧於對其它語言只知皮毛,筆者會閑暇之餘會去進行學習)那麼在編譯啟動並執行時候我們程式是怎麼跑起來的?不管我們的源檔案是什麼語言寫的C#或者VB再或者J#這些都不重要,最終我們的語言會通過相對的編譯器被編譯成IL中繼語言,那麼如果我們需要執行下述代碼:

圖1.2

      首先,把我們的main方法編譯成IL中繼語言,然後再轉換成本地的CPU指令(這一步是由JIT(just-in-time或者“即時”)編譯器完成的)。那麼在執行main方法之前,CLR會檢測main方法的代碼所有的類型,然後產生一個資料結構表,記錄方法的類型、參數引用等一些資訊,以便對參考型別的資訊進行訪問,這個時候Console類中的所有方法都已經記錄在CLR產生的資料結構表中並有每個方法的記憶體位址。然而,在第一次調用Console.WriteLine方法的時候,JIT編譯器就知道要調用哪個方法,然後JIT將IL編譯成CPU指令,然而這個CPU指令就被分配在一個動態記憶體中,以便第二次調用的時候直接調用已經編譯好的CPU指令,而省去了再編譯的麻煩。注意:這裡所說的再編譯,是指應用程式一直在啟動並執行時候,不需要再編譯一次Console.WriteLine方法,而是直接運行。如果程式退出,將再一次對方法進行檢驗和編譯。

圖1.3

      那麼再次總結以下方法調用的過程:

      1、 當程式第一次運行時,會調用JIT編譯器,它可以知道調用了那些方法,以及通過CLR產生的資料結構表找到定義該方法的類和具體實現;

      2、 然後JIT編譯器在中繼資料中找到該方法的IL代碼,進行驗證,然後轉換成CPU指令。並分配在動態記憶體中;

      3、 JIT編譯器將調用的方法地址改為第二步的記憶體位址;

      4、 跳轉到上Main方法編譯後的代碼。

      5、 執行完畢並返回

      當程式第二次執行的時候,就不需要JIT的驗證,而是直接調用本地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.