.NET中的CTS、CLS和CLR

來源:互聯網
上載者:User

標籤:中繼資料   成本   runtime   關鍵字   str   實現   利用   興趣   託管   

  MSDN的解釋:.NET Framework 是為其啟動並執行應用程式提供各種服務的託管執行環境。 它包括兩個主要組件:作為處理啟動並執行應用程式的執行引擎的通用語言執行平台 (CLR);以及 .NET Framework 類庫,此類庫提供開發人員可從其自己的應用程式中調用的已測試的可重用程式碼程式庫。

  CLR是.NET Framework的核心

  CLR的核心是CTS和CLS。任何程式設計語言,如果想要在.NET CLR上執行,就必需提供一個編譯器,將此語言的程式編譯成.NET CLR所認識的metadata以及IL,符合CTS的規定。
  CTS是一般型別系統(Common Type System)
  CLS是公用語言定義(Common Language Specification)
  CLR是通用語言執行平台(Common language runtime)

  

  任何程式設計語言,如果想要在.NET CLR上執行,就必需提供一個編譯器,將此語言的程式編譯成.NET CLR所認識的metadata以及IL,符合CTS的規定。並非所有的語言都能和C#一樣符合CTS的規範,畢竟許多語言出現在先,CTS出現在後,所以有一些舊的語言未能符合CTS的規定。這類的語言在.NET中有下列三種方式來符合CTS規範:

 

  - 改變語言本身以符合CTS的規定。例如Visual Basic 6就為此做了大幅度的擴充與改變,加上繼承的特性,這使得新版的Visual Basic .NET 差不多可以算是一個全新的語言了,猶如當年C衍生出C++一樣。

 

  - 擴充語言本身以接近CTS的規定,但仍保留不相容於CTS的文法,如此一來,程式中符合CTS規定的以CTS方式編譯,不符合CTS規定的則以傳統的方式編譯成native code。例如C++ with Managed Extension (簡稱MC++) 就是如此。

 

  - 語言本身盡量維持不變,一切都是通過超強的編譯器設計來達成和CTS的相容,Eiffel就是如此的作法。例如,CTS不支援多重繼承(multiple inheritance),但是Eiffel支援多重繼承,通過Eiffel的編譯器可以利用interface以及attribute來達到多重繼承(這樣的作法相當巧妙,有興趣的讀者不妨去研究一下)。

 

  好,現在讓我們來看一下它們三者的關係。


  1)CTS一般型別系統(Common Type System)

  CTS定義了一組語言編譯器必須遵循的規則,以定義、引用、使用和儲存參考型別和實值型別。因此,遵循CTS,在不同語言中編寫的對象才能彼此互動。但並不是所有的類型都可以用於所有的語言。

  CTS不但實現了COM的變數相容類型,而且還定義了通過使用者自訂類型的方式來進行類型擴充。任何以.NET平台作為目標的語言必須建立它的資料類型與CTS的類型間的映射。所有.NET語言共用這一類型系統,實現它們之間無縫的互操作。該方案還提供了語言之間的繼承性。例如,使用者能夠在VB.NET中派生一個由C#編寫的類。我們可以將CTS 看成是所有.NET 語言的superset (union),而符合CTS 的各種不同的語言,其實都只是CTS 的subset (intersection)。這些語言所寫出來的程式,如果想要有最佳的相容性,以便互相調用(invoke) 或繼承,這些語言之間就必需取得一個共同的subset,有共同遵守的規範,這就是CLS 。


  2)CLS通用語言規範(Common Language Specification)

  CLR整合了很多種語言,它們之間可以相互訪問,是因為CLR建立的標準的類型集、中繼資料、公用執行環境。由於各種語言間存在著極大的差別,如區分大小寫,有的不支援unsigned、操作符重載或者參數可變的方法,所以要想建立這種讓別的語言能訪問的程式,自己所用的程式設計語言只能使用其它語言都支援的那些特性。為了協助我們更好的做到這一點,Microsoft定義了一個"Common Language Specification(Common Language Specification,CLS)"

  很顯然,程式設計語言的區別不僅僅在於類型。例如,一些語言支援多繼承性,一些語言支援無符號資料類型,一些語言支援運算子多載。使用者應認識到這一點,因此.NET通過定義Common Language Specification(CLS:Common Language Specification),限制了由這些不同引發的互通性問題。CLS制定了一種以.NET平台為目標的語言所必須支援的最小特徵,以及該語言與其他.NET語言之間實現互通性所需要的完備特徵。認識到這點很重要,這裡討論的特徵問題已不僅僅是語言間的簡單文法區別。例如,CLS並不去關心一種語言用什麼關鍵字實現繼承,只是關心該語言如何支援繼承。CLS是CTS的一個子集。這就意味著一種語言特徵可能符合CTS標準,但又超出CLS的範疇。例如:C#支援無符號數字類型,該特徵能通過CTS的測試,但CLS卻僅僅識別符號數字類型。因此,如果使用者在一個組件中使用C#的無符號類型,就可能不能與不使用無符號類型的語言(如VB.NET)設計的.NET組件實現互操作。

 

  3)CLR公用語言運行庫(Common Language Runtime)

  簡單地說,CLR是CTS的實現,也就是說,CLR是應用程式的執行引擎和功能齊全的類庫,該類庫嚴格按照CTS規範實現。作為程式執行引擎,CLR負責安全地載入和運行使用者程式碼,包括對不用對象的記憶體回收和安全檢查。在CLR監控之下啟動並執行代碼,稱為Managed 程式碼(managed code)。

 

  CLR的執行模型

  1、將原始碼(vb、cs)編譯成 Managed 程式碼塊。Managed 程式碼塊由中繼語言和中繼資料組成。

  2、將Managed 程式碼合并成程式集,也叫組件(dll)。程式集中包含了一張叫做“清單”的模組,記錄了構成程式集模組構成的資訊包括資源檔及需要引用自己的資訊。
  3、載入公用語言運行庫。
  4、執行程式集的代碼。
  5、產生本地代碼(Unmanaged 程式碼)。

   CLR的執行模型

  

  Language complier:語言編譯器,每種語言基於.net的語言都會有一個面向CLR的託管模組,也可以理解為語言編譯器,把對應的語言編譯成MSIL
MSIL:微軟中繼語言,CLR負責把中繼語言編譯成為執行程式的電腦可以理解的語言,是一種介於介於進階語言和組合語言的偽組合語言.
JIT(Just In-Time compile):即時編譯,將MSIL解釋為程式可以理解的語言.

 

.NET中的CTS、CLS和CLR

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.