-
公共語言運行時
鎖定
CLR叫做公共語言運行時(Common Language Runtime),它是所有.NET應用程序運行時環境,是所有.NET應用程序都使用的編程基礎,它如同一個支持.NET Framework,運行一個.NET程序也必須安裝。公共語言運行時遵循公共語言架構的標準,能夠使C++、C# 、Visual Basic、以及JScript等多種語言深度集成。
- 中文名
- 公共語言運行時
- 外文名
- Common Language Runtime
- 簡 稱
- CLR
- 兩個組件
- 公共類型系統、公共類型系統
- 特 點
- 能使多種語言深度集成
- 理 解
- 相當於Java中的Java虛擬機
目錄
- 1 定義
- 2 託管執行過程
- ▪ 選擇編譯器
- ▪ 將代碼編譯為 Micrisoft 中間語言
- ▪ 將SMIL翻譯為本機語言
公共語言運行時定義
公共語言運行時(Common Language Runtime,CLR)是Microsoft的公共語言中基礎結構(CLI)的一個商業實現,CLI是一種國際標準,用於創建語言和庫在其中無縫協同工作的執行和開發環境基礎。.NET Framework 提供了一個稱為公共語言運行時的運行環境,它運行代碼並提供使開發過程更輕鬆的服務。有了公共語言運行時,就可以很容易的設計出對象能夠跨語言交互的組件和應用程序。也就是説,用不同語言編寫的對象可以互相通信,並且它們的行為可以緊密集成。
[1]
公共語言運行時遵循公共語言架構的標準,能夠使C++、C#、Visual Basic、以及JScript等多種語言深度集成。
[2]
CLR從某種意義上理解相當於Java中的Java虛擬機(JVM),而MSIL相當於Java中的字節碼(.class文件)。MSIL總是及時編譯(稱為JIT編譯)為相應平台的機器代碼,這一點與Java也很相似。
[3]
公共語言運行時託管執行過程
公共語言運行時的功能通過編譯器和工具開發,開發者可以編寫利用此託管執行環境的代碼。使用基於公共語言運行時的語言編譯器開發的代碼稱為託管代碼,反之則被稱為非託管代碼。託管代碼有很多優點,例如跨語言集成、跨語言異常處理、增強的安全性、版本控制和部署支持、簡化的組件交互模型、調試和分析服務等。
執行託管代碼的過程包括以下4個步驟:
公共語言運行時選擇編譯器
為獲得公共語言運行時提供的優點,必須使用一個或多個針對運行時的語言編譯器。例如 Visual Basic、C# 、Visual C++、F#或其它的第三方編譯器(如 Eiffel、Perl或 COBOL編譯器)中的一個。
[1]
公共語言運行時將代碼編譯為 Micrisoft 中間語言
編譯將源代碼翻譯為Micrisoft 中間語言(MSIL)並生成所需的元數據。MSIL是一組可以有效地轉換為本機代碼且獨立於CPU的指令。它包括用於加載、存儲和初始化對象以及對對象調用方法的指令,還包括用於算術和邏輯運算、控制流、直接內存存取、異常處理和其他操作的指令。元數據描述代碼中的類型,包括每種類型的定義、每種類型的成員的簽名、代碼引用的成員和運行時在執行時使用的其他數據。
[1]
公共語言運行時將SMIL翻譯為本機語言
公共語言運行時運行代碼
公共語言運行時自動內存管理
自動內存管理是公共語言運行時在託管執行過程中所能提供的服務之一。公共語言運行時的垃圾回收器為應用程序管理內存的分配和釋放。對開發者而言,這意味着開發託管應用程序時不必編寫執行內存管理任務的代碼。自動內存管理可解決常見問題,例如忘記釋放對象並導致內存泄露,或嘗試訪問已釋放對象的內存。
[1]
公共語言運行時分配內存
初始化進程時,CLR為進程保留一個連續的地址空間區域。這個保留的地址空間被稱為託管堆。託管堆上部署了所有引用類型,應用程序創建第一個引用類型時,將為託管堆的基址中的類型分配內存。從內存堆中分配內存要比非託管內存分配速度快。由於CLR通過為指針添加值來為對象分配內存,所以這幾乎和堆棧中分配內存一樣快。另外,由於連續分配的新對象在託管堆中是連續存儲,所以應用程序可以快速訪問這些對象。
[1]
公共語言運行時釋放內存
垃圾回收器的優化引擎根據所執行的分配決定執行回收的最佳時間。垃圾回收器在執行回收時會釋放應用程序不再使用的對象的內存。它通過檢查應用程序的根本來確定不再使用的對象。每個應用程序都有一組根,每個根或者引用託管堆中的對象,或者設置為空。
[1]
公共語言運行時級別和性能
運行時的垃圾回收算法基於以下幾個普遍原理。首先,壓縮託管堆的一部分內存要比壓縮整個託管堆速度快。其次,較新的對象生存期較短,而較舊的對象生存期則較長。最後,較新的對象趨於相互管理,並且大致同時由應用程序訪問。
[1]
公共語言運行時為非託管資源釋放內存
垃圾回收器可以跟蹤封裝非託管資源的託管對象的生存期,但是無法具體瞭解如何清理資源。創建封裝非託管資源的對象時,可以在公共Dispose()方法中提供必要的代碼以清理非託管資源。通過提供Dispose()方法,對象的用户在使用完對象後顯式釋放其內存。
[1]
公共語言運行時CLR的組件
CLR叫做公共語言運行時(Common Language Runtime)。它是所有.NET應用程序運行時環境,是所有.NET應用程序都使用的編程基礎,它如同一個支持.NET Framework,運行一個.NET程序也必須安裝。CLR也可以看作一個在執行時管理代碼的代理,管理代碼是CLR的基本原則,能夠被管理的代碼成為託管代碼,反之稱為非託管代碼。CLR包含兩個組成部分,CLS(公共語言規範)和CTS(通用類型系統)。下面我們通過理解.NET的編程技術來具體瞭解這兩個組件的功能。
[4]
公共語言運行時公共類型系統
C#和VB.NET都是公共語言運行時的託管代碼,它們的語法和數據類型各不相同。CLR是如何對這兩種不同的語言進行託管的呢?通用類型系統(Common Type System)用於解決不同語言的數據類型不同的問題,如C#中的整型是int,而VB.NET中是Integer,通過CTS我們把它們兩個編譯成通用的類型Int32。所有的.NET語言共享這一類型系統,在它們之間實現無縫互操作。
[4]
公共類型系統支持.NET Framwork提供的常用兩種類型:值類型和引用類型。其中每一類又可以細分成子類型。公共類型系統所執行的功能如下:
(1)建立一個支持跨語言的集成、類型安全和高性能代碼執行的框架;
(2)提供一個支持完整實現多種編程語言的面向對象的模型;
公共語言運行時公共語言規範
公共語言規範(Common Language Specification,CLS)。公共語言規範是一組結構和限制條件,它是公共類型系統的子集,它們一起定義了允許不同編程語言的標準集,由這些編程語言編寫的應用程序可以互操作。
[1]
編程語言的區別不僅僅在於類型,語法或者説語言規範也都有很大的區別。因此.NET通過定義公共語言規範(Common Language Specification),限制了由這些不同點引發的互操作性問題。CLS是一種最低的語言的標準,制定了一種以.NET平台為目標的語言所必須支持的最小特徵,以及該語言與其他.NET語言之間實現互操作性所需要的完備特徵。凡是遵守這個標準的語言在.NET框架下都可以實現互相調用。例如,在C#中命名是區分大小寫的,而VB.NET不區分大小寫,這樣CLS就規定,編譯後的中間代碼必須除了大小寫之外有其他的不同之處。
[4]
為了實現跨語言開發和跨平台的戰略目標,.NET所有編寫的應用都不是編譯為本地代碼,而是編譯成微軟中間代碼MSIL(Microsoft Intermediate Language)。它將由JIT(Just In Time)編譯器轉換成機器代碼。C#和VB.NET代碼通過它們各自的編譯器編譯成MSIL,MSIL遵守通用的語法,CPU不需要了解它,再通過JIT編譯器編譯成相應的平台專用代碼,這裏所説的平台是指我們的操作系統。這種編譯方式實現了代碼託管,還能夠提高程序的運行效率。
[4]
公共語言運行時優點
使用公共語言運行時有許多優點,部分優點如下:
(1)它使程序的性能得到了改進;
(1)它使程序的性能得到了改進;
(2)能夠輕鬆的使用其他語言開發的組件;
(3)支持語言功能,例如面向對象編程的繼承、接口和重載;
(4)允許創建多線程的可放縮應用程序的顯示自由線程處理支持;
(5)結構化異常處理支持;
(6)自定義特性支持;
(7)垃圾回收機制;