公共語言運行時

公共語言運行時

CLR叫做公共語言運行時(Common Language Runtime),它是所有.NET應用程式運行時環境,是所有.NET應用程式都使用的編程基礎,它如同一個支持.NET Framework,運行一個.NET程式也必須安裝。公共語言運行時遵循公共語言架構的標準,能夠使C++、C# 、Visual Basic、以及JScript等多種語言深度集成。

基本介紹

  • 中文名:公共語言運行時
  • 外文名:Common Language Runtime
  • 簡稱:CLR
  • 兩個組件:公共類型系統、公共類型系統
  • 特點:能使多種語言深度集成
  • 理解:相當於Java中的Java虛擬機
定義,託管執行過程,選擇編譯器,將代碼編譯為 Micrisoft 中間語言,將SMIL翻譯為本機語言,運行代碼,自動記憶體管理,分配記憶體,釋放記憶體,級別和性能,為非託管資源釋放記憶體,CLR的組件,公共類型系統,公共語言規範,優點,

定義

公共語言運行時(Common Language Runtime,CLR)是Microsoft的公共語中言基礎結構(CLI)的一個商業實現,CLI是一種國際標準,用於創建語言和庫在其中無縫協同工作的執行和開發環境基礎。.NET Framework 提供了一個稱為公共語言運行時的運行環境,它運行代碼並提供使開發過程更輕鬆的服務。有了公共語言運行時,就可以很容易的設計出對象能夠跨語言互動的組件和應用程式。也就是說,用不同語言編寫的對象可以互相通信,並且它們的行為可以緊密集成。
公共語言運行時遵循公共語言架構的標準,能夠使C++C#Visual Basic、以及JScript等多種語言深度集成。CLR從某種意義上理解相當於Java中的Java虛擬機(JVM),而MSIL相當於Java中的位元組碼(.class檔案)。MSIL總是及時編譯(稱為JIT編譯)為相應平台的機器代碼,這一點與Java也很相似。

託管執行過程

公共語言運行時的功能通過編譯器和工具開發,開發者可以編寫利用此託管執行環境的代碼。使用基於公共語言運行時的語言編譯器開發的代碼稱為託管代碼,反之則被稱為非託管代碼。託管代碼有很多優點,例如跨語言集成、跨語言異常處理、增強的安全性、版本控制和部署支持、簡化的組件互動模型、調試和分析服務等。
執行託管代碼的過程包括以下4個步驟:

選擇編譯器

為獲得公共語言運行時提供的優點,必須使用一個或多個針對運行時的語言編譯器。例如 Visual Basic、C# 、Visual C++、F#或其它的第三方編譯器(如 EiffelPerlCOBOL編譯器)中的一個。

將代碼編譯為 Micrisoft 中間語言

編譯將原始碼翻譯為Micrisoft 中間語言(MSIL)並生成所需的元數據。MSIL是一組可以有效地轉換為本機代碼且獨立於CPU的指令。它包括用於載入、存儲和初始化對象以及對對象調用方法的指令,還包括用於算術和邏輯運算、控制流、直接記憶體存取、異常處理和其他操作的指令。元數據描述代碼中的類型,包括每種類型的定義、每種類型的成員的簽名、代碼引用的成員和運行時在執行時使用的其他數據。

將SMIL翻譯為本機語言

在執行時,實時(JIT)編譯器將MSIL翻譯為本機代碼。在此編譯過程中,代碼必須通過驗證過程,該過程檢查MSIL和元數據以查看是否可以將代碼確定為類型安全。

運行代碼

公共語言運行時提供使託管代碼能夠發生及可在執行期間使用的各種服務的基礎結構。

自動記憶體管理

自動記憶體管理是公共語言運行時在託管執行過程中所能提供的服務之一。公共語言運行時的垃圾回收器為應用程式管理記憶體的分配和釋放。對開發者而言,這意味著開發託管應用程式時不必編寫執行記憶體管理任務的代碼。自動記憶體管理可解決常見問題,例如忘記釋放對象並導致記憶體泄露,或嘗試訪問已釋放對象的記憶體。

分配記憶體

初始化進程時,CLR為進程保留一個連續的地址空間區域。這個保留的地址空間被稱為託管堆。託管堆上部署了所有引用類型,應用程式創建第一個引用類型時,將為託管堆的基址中的類型分配記憶體。從記憶體堆中分配記憶體要比非託管記憶體分配速度快。由於CLR通過為指針添加值來為對象分配記憶體,所以這幾乎和堆疊中分配記憶體一樣快。另外,由於連續分配的新對象在託管堆中是連續存儲,所以應用程式可以快速訪問這些對象。

釋放記憶體

垃圾回收器的最佳化引擎根據所執行的分配決定執行回收的最佳時間。垃圾回收器在執行回收時會釋放應用程式不再使用的對象的記憶體。它通過檢查應用程式的根本來確定不再使用的對象。每個應用程式都有一組根,每個根或者引用託管堆中的對象,或者設定為空。

級別和性能

運行時的垃圾回收算法基於以下幾個普遍原理。首先,壓縮託管堆的一部分記憶體要比壓縮整個託管堆速度快。其次,較新的對象生存期較短,而較舊的對象生存期則較長。最後,較新的對象趨於相互管理,並且大致同時由應用程式訪問。
為最佳化垃圾回收機制的性能,將託管堆分為3代:第0代、第1代和第2代。運行時的垃圾回收器將新對象存儲在第0級中。在應用程式生存期的早期創建的對象如果未被回收,則被升級並存儲在第1級和第2級中。

為非託管資源釋放記憶體

對於應用程式創建的大多數對象,可以依賴垃圾回收器自動執行必要的記憶體管理任務。但是,非託管資源需要顯式清除。最常用的非託管資源類型是包裝作業系統資源的對象,例如,檔案句柄視窗句柄或網路連線。
垃圾回收器可以跟蹤封裝非託管資源的託管對象的生存期,但是無法具體了解如何清理資源。創建封裝非託管資源的對象時,可以在公共Dispose()方法中提供必要的代碼以清理非託管資源。通過提供Dispose()方法,對象的用戶在使用完對象後顯式釋放其記憶體。

CLR的組件

CLR叫做公共語言運行時(Common Language Runtime)。它是所有.NET應用程式運行時環境,是所有.NET應用程式都使用的編程基礎,它如同一個支持.NET Framework,運行一個.NET程式也必須安裝。CLR也可以看作一個在執行時管理代碼的代理,管理代碼是CLR的基本原則,能夠被管理的代碼成為託管代碼,反之稱為非託管代碼。CLR包含兩個組成部分,CLS(公共語言規範)和CTS(通用類型系統)。下面我們通過理解.NET的編程技術來具體了解這兩個組件的功能。

公共類型系統

公共類型系統(Common Type System,CTS)。CLR通過公共類型系統和公共語言規範定義了標準數據類型和語言間互操作性的規則。
C#VB.NET都是公共語言運行時的託管代碼,它們的語法和數據類型各不相同。CLR是如何對這兩種不同的語言進行託管的呢?通用類型系統(Common Type System)用於解決不同語言的數據類型不同的問題,如C#中的整型是int,而VB.NET中是Integer,通過CTS我們把它們兩個編譯成通用的類型Int32。所有的.NET語言共享這一類型系統,在它們之間實現無縫互操作。
公共類型系統支持.NET Framwork提供的常用兩種類型:值類型和引用類型。其中每一類又可以細分成子類型。公共類型系統所執行的功能如下:
(1)建立一個支持跨語言的集成、類型安全和高性能代碼執行的框架;
(2)提供一個支持完整實現多種程式語言的面向對象的模型;
(3)定義各語言必須遵守的規則,有助於確保用不同語言編寫的對象能夠互動作用。

公共語言規範

公共語言規範(Common Language Specification,CLS)。公共語言規範是一組結構和限制條件,它是公共類型系統的子集,它們一起定義了允許不同程式語言的標準集,由這些程式語言編寫的應用程式可以互操作。
程式語言的區別不僅僅在於類型,語法或者說語言規範也都有很大的區別。因此.NET通過定義公共語言規範(Common Language Specification),限制了由這些不同點引發的互操作性問題。CLS是一種最低的語言的標準,制定了一種以.NET平台為目標的語言所必須支持的最小特徵,以及該語言與其他.NET語言之間實現互操作性所需要的完備特徵。凡是遵守這個標準的語言在.NET框架下都可以實現互相調用。例如,在C#中命名是區分大小寫的,而VB.NET不區分大小寫,這樣CLS就規定,編譯後的中間代碼必須除了大小寫之外有其他的不同之處。
為了實現跨語言開發和跨平台的戰略目標,.NET所有編寫的套用都不是編譯為本地代碼,而是編譯成微軟中間代碼MSIL(Microsoft Intermediate Language)。它將由JIT(Just In Time)編譯器轉換成機器代碼。C#和VB.NET代碼通過它們各自的編譯器編譯成MSIL,MSIL遵守通用的語法,CPU不需要了解它,再通過JIT編譯器編譯成相應的平台專用代碼,這裡所說的平台是指我們的作業系統。這種編譯方式實現了代碼託管,還能夠提高程式的運行效率。

優點

使用公共語言運行時有許多優點,部分優點如下:
(1)它使程式的性能得到了改進;
(2)能夠輕鬆的使用其他語言開發的組件;
(3)支持語言功能,例如面向對象編程的繼承、接口和重載;
(4)允許創建多執行緒的可放縮應用程式的顯示自由執行緒處理支持;
(5)結構化異常處理支持;
(6)自定義特性支持;
(7)垃圾回收機制;
(8)使用委託取代函式指針,從而增強了類型安全和安全性。

相關詞條

熱門詞條

聯絡我們