CLR

CLR

計算機專業名詞
CLR常用簡寫詞語,CLR是公共語言運行庫(Common Language Runtime),和Java虛拟機一樣也是一個運行時環境。[1]它負責資源管理(内存分配和垃圾收集等),并保證應用和底層操作系統之間必要的分離。CLR存在兩種不同的翻譯名稱:公共語言運行庫和公共語言運行時。CLR将監視形形色色的常見編程錯誤,許多年來這些錯誤一直是軟件故障的主要根源,其中包括:訪問數組元素越界,訪問未分配的内存空間,由于數據體積過大而導緻的内存溢出,等等。CLR的核心功能包括:内存管理、程序集加載、安全性、異常處理和線程同步,可由面向CLR的所有語言使用。
    中文名:公共語言運行庫 外文名:Common Language Runtime 别名: 縮寫:CLR 負責:資源管理 依靠:可操控代碼 特性:公用語言規範

基本内容

CLR(公共語言運行庫,Common Language Runtime)和Java虛拟機一樣也是一個運行時環境,是一個可由多種編程語言使用的運行環境。CLR的核心功能包括:内存管理、程序集加載、安全性、異常處理和線程同步,可由面向CLR的所有語言使用。并保證應用和底層操作系統之間必要的分離。CLR是.NET Framework的主要執行引擎。

為了提高平台的可靠性,以及為了達到面向事務的電子商務應用所要求的穩定性級别,CLR還要負責其他一些任務,比如監視程序的運行。按照.NET的說法,在CLR監視之下運行的程序屬于“托管的”(managed)代碼,而不在CLR之下、直接在裸機上運行的應用或者組件屬于“非托管的”(unmanaged)的代碼。

CLR将監視形形色色的常見編程錯誤,許多年來這些錯誤一直是軟件故障的主要根源,其中包括:訪問數組元素越界,訪問未分配的内存空間,由于數據體積過大而導緻的内存溢出,等等。

然而,這種對受管理代碼的運行監視是有代價的。雖然當前還不可能精确地得到監視程序運行所需要的開銷,但從當前Beta測試版的性能表現來看,正如Microsoft所承認的那樣,我們可以預料由它導緻的性能降低程度至少達到10%。當然,如果監視程序運行能夠将穩定性和可用性提高到一個新的檔次,那麼,我們是否仍會懷疑這10%的性能降低是一件壞事?

在處理器性能改善方面,摩爾定律已經一再被證明是正确的。既然如此,我們要得到一台性能增加了10%的服務器要等待多長時間呢。

NET提供的公共語言運行庫是一種多語言執行環境,支持衆多的數據類型和語言特性。他管理着代碼的執行,并使開發過程變得更加簡單。這是一種可操控的執行環境,其功能通過編譯器與其他工具共同展現。

依靠一種以運行時為目标的編譯器開發的代碼叫做可操控代碼。

元數據:為了使運行時環境可以向可操控代碼提供服務,語言編譯器需要産生一種元數據,它将提供在使用語言中的類型、成員、引用的信息。運行時環境使用元數據定位并載入類,在内存中展開對象實例,解決方法調用,産生本地代碼,強制執行安全性,并建立運行時環境的邊界。

可操控執行的含義:對象在執行的過程中完全被運行時環境所控制。運行時環境提供以下服務:自動内存管理、調試支持、增強的安全性及與非可操控性代碼的互操作性。條件:1、選擇以運行時為目标的語言編譯器,如VB、C#;2、在組件的輸出類型中使用CLR要求的語言特性。

集成能力

跨語言集成的能力:CLR包含了一個豐富的語言特性集,保證了它與各種程序設計語言的兼容性。這一特性集即公用語言規範,稍後将對其進行詳細說明。

内存管理

内存管理的自動化:在執行過程中管理應用程序的資源是一項單調而困難的工作。它會将你的注意力從你本應解決的問題中引開。而垃圾收集機制完全解決了程序員在編程過程中頭痛的問題,跟蹤内存的使用,并知道何時将它們釋放。

在面向對象的環境中,每種類型都标識了對你的應用程序有用的某種資源。為了使用這些資源,你需要為類型分配内存。在應用中,訪問一種資源要通過以下步驟:

(1)為類型分配内存。

(2)初始化内存,設置資源的初始狀态并使其可用。

(3)通過訪問該類型的實例成員來訪問資源。

(4)卸下将被清除的資源狀态。

(5)釋放内存。

這一看似簡單的過程在實際的編程中是産生錯誤的主要來源之一。更可怕的是:内存中的錯誤往往導緻不可預見的結果。如果你有過編程的經驗,想想看,有多少次你的程序因為内存訪問錯誤而崩潰?特别是計算機存在多根内存條時特别容易内存報錯死機。建議升級電腦時換掉原來的内存,不要采用加内存的方式。

CLR要求所有的資源從可操控的堆(注:在此指一種内存結構)中分配。當一個進程被初始化後,CLR保留了一個未被分配的地址空間。這一區域叫做可操控堆。在堆中保持了指向下一個将被分配給對象的堆地址的指針(NEXT)。

初始狀态下,該指針是保留地址空間的基地址。一個應用使用新的操作産生對象。此操作首先檢查新對象需要字節的大小是否會超出保留空間。如果對象大小合适,指向下一個地址的指針将指向堆中的這個對象,該對象的構造器被調用,新的操作返回對象的地址。

當一個應用請求建立一個對象時,地址空間可能不夠大。堆将發現這一點(通過将新對象的大小與NEXT指針相加,并與堆的大小進行比較),這時垃圾收集器就将被調用。在這裡,CLR引入了“代”的概念。代,指堆中對象産生的先後。這樣,垃圾收集器在将發生溢出時回收屬于特定的“代”的對象,而不是回收堆中的所有對象。

(6)即時編譯

在各種語言的編譯器對源代碼進行編譯之後,在CLR環境中産生的是中間代碼(出于兼容性與跨語言集成的考慮),其内容雖然有效,但在轉化為本地代碼之前它本身是不可執行的。這就是JIT編譯器需要完成的工作。

這裡需要說明一個問題:為什麼要即時編譯,而不是一次性的将中間代碼文件進行編譯?答案很簡單:原因在于效率。在大型的應用中,你很少會用到程序的全部功能,這種邊執行邊編譯的措施比一次性的完全編譯效率更高。

CLR帶有三個不同的JIT編譯器,在Windows平台中,CLR帶有三個不同的JIT編譯器:

(1)缺省的編譯器---主編譯器,由它進行數據流分析并輸出經過優化的本地代碼,所有的中間代碼指令均可被它處理。

(2)PREJIT,它建立在主JIT編譯器之上。其運行方式更象一個傳統的編譯器:每當一個.NET組件被安裝時它就運行。

(3)ECONOJIT,在并不充分優化的前提下,它能夠快速完成IL代碼到本地碼的轉換,編譯速度與運行速度都非常快。

為了配合編譯器的工作,在.NET SDK的安裝路徑下的/bin目錄中有一個負責管理JIT的應用程序:jitman.exe。具體的使用參見聯機幫助。

版本發布

在當前以組件為基礎的系統中,開發人員和用戶對于軟件版本和發布中存在的問題已經十分熟悉了。當我們安裝一個新的應用之後,我們很可能發現原本正常的某個應用程序奇怪的停止了工作。絕大多數開發人員将時間花在了确保所有注冊表入口的一緻性,以便激活COM類上。這就是所謂的“DLL地獄”。

.NET平台通過使用集合來解決這一問題。在這裡,“集合”是一個專有名詞,指類型與資源的發布單元,在很大程度上它等同于今天的DLL。正象.NET用元數據描述類型一樣,它也用元數據描述包含類型的集合。

通常說來,集合由四個部分組成:集合的元數據(集合的内部清單)、元數據描述的類型、實現類型的中間語言代碼和一組資源。在一個集合中,以上四個部分并不是都必須存在,但是,集合中必須包含類型或資源,這樣集合才有意義。

在.NET中一個基本的設計方針是使用孤立的組件。一個孤立的集合的含義是指一個集合隻能被一個應用所訪問。在一台機器上,它不被多個應用共享,也不會受其它應用程序對系統的更改的影響。“孤立”賦予了開發人員在自己的程序中對代碼的完全控制權。

任何共享代碼都需要被明确地标識。同時,.NET框架也支持共享集合的概念。一個共享集合指在一台機器上被多個應用共享的集合。共享集合需要嚴格地命名規定。

有了.NET,應用程序間的共享代碼是明确定義的。共享集合需要一些額外的規則來避免我們今天遇到的共享沖突問題。共享代碼必須有一個全局唯一的名稱,系統必須提供名稱保護,并在每當引用共享集合時,CLR将對版本信息進行檢查。

彙編指令

51單片機 彙編 指令CLR:

CLRA

//累加器A 被賦零值,此時為邏輯運算指令。

CLRC

//程序狀态寄存器PSW中的CY位狀态清零,此時為位操作指令。

上一篇:經史子集

下一篇:經營杠杆

相關詞條

相關搜索

其它詞條