關於CLR、CIL、CTS、CLS、CLI、BCL和FCL

若是要想深刻學習.NET平臺,那麼標題中的這些關鍵字對你來講並不陌生,這些名詞構成了.NET龐大的生態系統,爲了宏觀認識.NET平臺,學些.NET架構體系,針對一些經常使用經常使用名詞的理解是頗有必要的,未必強行記憶,但至少要知道它們的含義。程序員

clr-cts-cls

CLR,公共語言運行時(Common Language Runtime)

不管經過任何語言構建產品,都必須寄宿到一個平臺中運行,這正如咱們的軟件運行在操做系統環境同樣,操做系統爲CLR提供了運行環境,使用.NET構建的程序又運行在CLR之上,CRL爲.NET程序的運行提供了溫牀,CLR提供基本的類庫和運行引擎,基本類庫封裝操做系統函數供開發者方便調用,運行引擎用於編譯並運行咱們開發的程序。CLR包含.NET運行引擎和符合CLI的類庫。經過.NET平臺構建的程序都基於CLR基礎類庫來實現,而且運行在CLR提供的運行引擎之上。數據庫

編譯爲託管代碼時,編譯器將源代碼翻譯爲 Microsoft 中間語言 (MSIL),這是一組能夠有效地轉換爲本機代碼且獨立於 CPU 的指令。MSIL 包括用於加載、存儲和初始化對象以及對對象調用方法的指令,還包括用於算術和邏輯運算、控制流、直接內存訪問、異常處理和其餘操做的指令。要使代碼可運行,必須先將 MSIL 轉換爲特定於 CPU 的代碼,這一般是經過實時 (JIT) 編譯器來完成的。因爲公共語言運行庫爲它支持的每種計算機結構都提供了一種或多種 JIT 編譯器,所以同一組 MSIL 能夠在所支持的任何結構上 JIT 編譯和運行。編程

CIL,公共中間語言(Common Intermediate Language)

CLI,簡稱微軟中間語言(MSIL)或者中間語言(IL)。CIL是編譯器將.NET代碼編譯成公共語言運行時(CLR)可以識別的中間代碼。它是一種介於高級語言(例如C#)和CPU指令之間的一種語言。當用戶編譯一個.NET程序時,編譯器(例如VisualStudio)將C#源代碼編譯轉換成中間語言 (MSIL),它是一種可以被CLR轉換成CPU指令的中間語言,當執行這些中間語言時,CLR提供的實時(JIT)編譯器將它們轉化爲CPU特定的代碼。因爲公共語言運行庫支持多種實時編譯器,所以同一段中間語言代碼能夠被不一樣的編譯器實時編譯並運行在不一樣的CPU結構上。從理論上來講,MSIL將消除多年以來業界中不一樣語言之間的紛爭。在.NET的世界中可能出現下面的狀況一部分代碼能夠用C++實現,另外一部分代碼使用C#或VB.NET完成的,可是最後這些代碼都將被轉換爲中間語言。這給程序員提供了極大的靈活性,程序員能夠選擇本身熟悉的語言,而且不再用爲學習不斷推出的新語言而煩惱了。安全

CTS,通用類型系統(Common Type System)

CTS是一種類型系統和語言規範,它可以確保CLR可以識別和處理的類型,全部.NET開發語言中的類型,不管時VS.NET類型仍是C#.NET類型最終都會被編譯成CLR可以識別的CTS類型,所以CTS是.NET平臺類型的抽象。例如VB.NET中的integer類型和C#中的int類型都編譯成CTS的System.Int32類型。若是某種語言編寫的程序可以在CLR上運行,並不能說明這種語言徹底符合CTS的規範。例如使用C++編寫的代碼,部分代碼並不符合CTS規範,在編譯時把這部分不符合CTS的代碼會被編譯成原始代碼本地CPU指令而非中間代碼。網絡

CLS,公共語言規範(Common Language Specification)

CLS是CTS的一個子集,全部.NET語言都應該遵循此規則才能建立與其餘語言可互操做的應用程序,但要注意的是爲了使各語言能夠互操做,只能使用CLS所列出的功能對象,這些功能統稱爲與CLS兼容的功能,它是在.NET平臺上運行語言的最小規範,正由於.NET上不一樣語言可以輕鬆交互同樣,例如C#編寫程序時能夠直接引用並使用VB.NET編寫的類庫。爲了達到這樣的交互,才制定出CLS規範,在.NET框架自己提供的全部類庫(並不是全部)都是與CLS兼容的,在查看MSDN文檔時,不兼容的類和方法都被特別標記爲不兼容,例如C#中的System.UInt32就標記爲」此API不兼容CLS。兼容 CLS的替代API爲 Int64。「,這說明並非全部的語言(例如VB.NET或J#)都支持無符號的數據類型,但這種數據類型與CLS不兼容的。架構

CLI,公共語言基礎架構(Common Language Infrastructure)

CLI是一個開放的技術規範。它是由微軟聯合惠普以及英特爾於2000年向ECMA倡議的。通用語言基礎架構定義了構成.NET Framework基礎結構的可執行碼以及代碼的運行時環境的規範,它定義了一個語言無關的跨體系結構的運行環境,這使得開發者能夠用規範內定義的各類高級語言來開發軟件,而且無需修正便可將軟件運行在不一樣的計算機體系結構上。CLI有時候會和CLR混用。但嚴格意義上說,這是錯誤的。由於CLI是一種規範,而CLR則是對這種規範的一個實現。框架

歐洲計算機制造商協會(ECMA)已經於2001年10月13日批准C#語言規範(ECMA-334)成爲一種新誕生的計算機產業標準。同時國際標準組織ISO也贊成該標準進入該組織的審批階段。而且,做爲.NET與CLR的核心部分,CLI與C#也同時得到了ECMA的批准(ECMA-335)。擁有了C#與CLI這兩項標準,你能夠本身寫出可以運行於任何操做系統上的.NET平臺(只要你願意)。如前所述,著名的MONO項目就是這麼幹的,MONO項目包括三個核心的部分:一個C#語言的編譯器,一個CLI和一個類庫。函數

BCL,基礎類庫(Base Class Library)

BCL是一個公共編程框架,稱爲基類庫,全部語言的開發者都能利用它。是CLI(Common Language Infrastructure,公共語言基礎結構)的規範之一,主要包括:執行網絡操做,執行I/O操做,安全管理,文本操做,數據庫操做,XML操做,與事件日誌交互,跟蹤和一些診斷操做,使用非託管代碼,建立與調用動態代碼等,粒度相對較小,爲全部框架提供基礎支持。學習

FCL,框架類庫(Framework Class Library)

FCL提供了大粒度的編程框架,它是針對不一樣應用設計的框架 ,FCL大部分實現都引用了BCL,例如咱們常說的開發框架:ASP.NET、MVC、WCF和WPF等等,提供了針對不一樣層面的編程框架 。操作系統

相關文章
相關標籤/搜索