.NET平台系列3 .NET CLR 詳解


CLR 簡介

  運行時(Runtime Environment,簡稱Runtime ),是指那些支持在特定的平台上,用於運行特定編程語言編寫的軟件的庫和程序集,它一般要處理軟件和操作系統之間的接口細節。例如,系統調用、程序的啟動和終止、內存管理等。 運行時分3種:純靜態環境(如Fortran)、基於堆棧環境(如C、C++、Pascal)、純動態環境(如SmallTak、Java)。

  CLR(Common Language Runtime),處於 .NET Framework 的最底層,它是 .NET Framework 的核心。CLR 是一個軟件引擎,提供加載應用程序、程序編譯、錯誤檢查、安全許可認證、線程管理、遠程處理、執行、清空內存等核心服務。 CLR 是屬於純動態運行時的一種,它的主要組成部分是虛擬執行引擎 VEE(Vitual Execution Enging)。

CLR 版本
  CLR 是.NET Framework 的子集,但是兩者的版本策略不同。截止2019年,微軟發布了4個版本的CLR,對應關系如下。

 

 使用 ASP.NET Web Form 開發的應用程序,部署到IIS服務器時,不同的CLR版本需要選擇不同的托管管道模式。

  

CLR 構成

  CLR主要由以下11個功能器件組成。

(1)類加載器(Class Loader):將應用程序的匯編加載到內存中。匯編包括微軟中間語言(Microsoft Intermediate Language,簡稱MSIL)代碼、描述應用程序中組件的元數據(類和類的布局描述),以及其他應用程序所需的組件。
(2)即時編譯器(Just-In-Time,簡稱JIT):負責將MSIL翻譯成本機執行代碼。
(3)代碼管理器(Code Manager):管理代碼的執行。
(4)垃圾回收器(Garbage Collection):負責整個.NET運行時托管代碼的內存分配與釋放任務,它通過一定的優化算法選擇收集對象和時間,並進行自動的垃圾收集。
(5)安全引擎(Security Engine):提供基於認證的安全機制,如用戶身份。
(6)調試引擎(Debugger):使開發者能調試和跟蹤應用程序代碼。
(7)類型檢查器(Type Checker):檢查並禁止非安全的類型轉換以及未初始化的變量的使用。
(8)異常管理器(Exception Manager):提供結構化的異常處理,與Windows結構化異常處理機制(SHE)集成,改進了錯誤報告。
(9)線程支持(Thread Support):提供了多線程編程的類和接口。
(10)COM列集器(COM Marshaler):處理與COM之間的配置。
(11).NET 基礎類庫(BCL):集成具有支持.NET Framework 類庫運行時的代碼。

CLR 工作原理

編譯器(Windows平台上有3個不同的JIT編譯器)
1、JIT -- 標准編譯器。運行時默認使用的JIT編譯器。代碼高度優化,資源開銷大,它要求計算機具有足夠的內存來高速緩存編譯后的代碼,以便重復利用。如果沒有足夠的內存來高速緩存編譯后代碼,就需要反復調用JIT,由於優化技術需要花時間,這樣就大大降低了編譯的速度。
2、EconoJIT -- 經濟編譯器。它不是執行優化技術的編譯器。代碼不能高速緩存,但可以把MSIL快速轉換成托管的原始代碼,編譯速度快。
3、PreJIT -- 類似傳統的編譯器。實現將應用程序首次安裝到計算機時,就把整個應用程序轉換為本機代碼。

編譯過程
(1)編譯器首先將各類.NET 上支持的語言(C#、VB.NET、VC++等)編寫的源代碼編譯托管的中間語言(MSIL)代碼,不是機器碼。這個MSIL就構成可移植執行的 .exe文件(Portable Executable,檢查PE)。在編譯器將源代碼編譯成MSIL的同時,元數據引擎也產生元數據信息,這些代碼也可和其他語言編譯的代碼鏈接為一個EXE或DLL文件(通過鏈接器實現)。
(2)由於本地的CPU不能直接執行MSIL指令。當執行應用程序時,首先類加載器將應用程序的匯編(MSIL代碼和元數據)加載到內存中,然后使用其中的元數據加載任何應用程序所需要的組件支持的匯編並進行類型安全和版本檢查。例如:它可能加載一個桌面應用程序所需要的圖形用戶接口(GUI)控制的匯編等。
(3)CLR 並不是將應用程序的所有MSIL的代碼都翻譯成CPU指令代碼,僅當用戶需要運行一個托管的應用程序時,操作系統裝載器才加載 CLR,這時CLR 才開始翻譯該應用的MSIL代碼。當然,如果開發人員希望在應用程序首次安裝到計算機中時就全部從MSIL轉變為本機代碼,那么可以使用 PreJIT 編譯器實現,PreJIT自動把MSIL轉換本機代碼。
(4)JIT編譯器和其他大多數編譯器是不用的。JIT編譯器只執行編譯這個過程,而在其他編譯器(C和C++)中要經過編譯和鏈接兩個階段。也就是說,.NET下的源程序(C#等)並不被編譯成目標文件(.obj),而是直接生成可執行文件(.exe)或動態鏈接庫(.dll)。在.NET下,編譯器不需要包含鏈接器。


免責聲明!

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



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