DotNet 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 下,編譯器不需要包含鏈接器。

 技術棧

 1、.NET:C#、.NET5、.NET6、.NET Core、MVC、ASP.NET Core、Web API、RESTful API

 2、jQuery、Vue.js、Bootstrap

 3、數據庫:SQLServer、MySQL、PostgreSQL、Oracle、SQLite、SequoiaDB 、

                     Redis、MongoDB、ElasticSearch、TiDB

 4、ORM:Dapper、Entity Framework、FreeSql、SqlSugar、分庫分表

 5、架構:領域驅動設計 DDD、ABP

 6、環境:跨平臺、Linux、Windows、MaxOS、IIS、Nginx

 7、移動 App:Android、IOS、HarmonyOS、微信、小程序、快應用、

                        Xamarin、uni-app、MUI、Flutter、Framework7、Cordova、Ionic、React Native、Taro、NutUI、

                        mpvue、Smobiler

  其他:

出處:http://www.cnblogs.com/SavionZhang

作者:張傳寧   微軟 MCP、系統架構設計師、系統集成項目管理工程師、科技部創新工程師。

本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/89ZtOZWkNaqA9mlkHaPwJA