.NET中的CTS、CLS、CLR

1、解釋1編程

一、CLR(Common Language Runtime) :公共語言運行庫安全

CLR 是CTS(Common Type System:通用類型系統)的實現,編程語言

便是說:CLR是應用程序的執行引擎和功能齊全的類庫,學習

該類庫嚴格按照CTS規範實現。做爲程序執行引擎,CLR測試

負責安全地載入和運行用戶程序代碼,包括對不用對象的垃圾回收spa

和安全檢查。在CLR監控之下運行的代碼成爲託管代碼(managed code)。.net

二、CTS(Common Type System):通用類型系統設計

CTS不但實現了COM的變量兼容類型,並且還定義了經過用戶自定義類型code

的方式來進行類型擴展。任何以.net平臺做爲目標的語言必須創建它的數據對象

類型與CTS的類型間的映射。

全部.NET語言共享這一類型系統,實現它們之間無縫的互操做。該方案還提供

了語言之間的繼承性。例如:用戶可以在VB.NET中派生一個由C#編寫的類。

能夠將CTS當作是全部.NET語言的superset(union),而符合CTS的各類

不一樣的語言,其實都只是CTS的subset(intersection)。這些語言所寫出來的程序,

如想要有最佳的相容性,以便互相調用(invoke)或繼承,這些語言之間就必需取得

一個共同的subset,有共同遵照的規範,這就是CLS.

三、CLS(Common Language Specification):通用語言規範。

很顯然,編程語言的區別不只僅在於類型。例如,一些語言支持多繼承性,

一些語言支持無符號數據類型,一些語言支持運算符重載。

用戶應認識到這一點,所以.NET經過定義公共語言規範(CLS:Common Language Specification),
限制了由這些不一樣引起的互操做性問題。CLS制定了一種以.NET平臺爲目標的語言所必須

支持的最小特徵,以及該語言與其餘.NET語言之間實現互操做性所須要的完備特徵。

認識到這點很重要,這裏討論的特徵問題已不只僅是語言間的簡單語法區別。

例如,CLS並不去關心一種語言用什麼關鍵字實現繼承,只是關心該語言如何支持繼承。

CLS是CTS的一個子集。這就意味着一種語言特徵可能符合CTS標準,但又超出CLS的範疇。
例如:C#支持無符號數字類型,該特徵能經過CTS的測試,但CLS卻僅僅識別符號數字類型。
所以,若是用戶在一個組件中使用C#的無符號類型,就可能不能與不使用無符號類型的語言

(如VB.NET)設計的.NET組件實現互操做。

 

2、解釋2

在學習.NET的過程當中,都會不可避免地接觸到這三個概念,那麼這三個東西是什麼以及它們之間的關係是怎樣的呢?咱們在學習的過程當中可能比較過多的會去關注CLR,由於CLR是.NET Framework的核心,可是我要說的是CTS和CLS更爲重要,由於他們是CLR的核心。任何編程語言,若是想要在.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不但實現了COM的變量兼容類型,並且還定義了經過用戶自定義類型的方式來進行類型擴展。任何以.NET平臺做爲目標的語言必須創建它的數據類型與CTS的類型間的映射。全部.NET語言共享這一類型系統,實現它們之間無縫的互操做。該方案還提供了語言之間的繼承性。例如,用戶可以在VB.NET中派生一個由C#編寫的類。咱們能夠將CTS 當作是全部.NET 語言的superset (union),而符合CTS 的各類不一樣的語言,其實都只是CTS 的subset (intersection)。這些語言所寫出來的程序,若是想要有最佳的相容性,以便互相調用(invoke) 或繼承,這些語言之間就必需取得一個共同的subset,有共同遵照的規範,這就是CLS 。

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

很顯然,編程語言的區別不只僅在於類型。例如,一些語言支持多繼承性,一些語言支持無符號數據類型,一些語言支持運算符重載。用戶應認識到這一點,所以.NET經過定義公共語言規範(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 code)。

3、解釋3

縮寫的全稱:    

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

 CLR是公共語言運行時(Common language runtime)     

 CLS是公共語言定義(Common Language Specification)
      全部類型均可以在 CTS中聲明。CTS定義了一組語言編譯器必須遵循的規則,以定義、引用、使用和存儲引用類型和值類型。

所以,遵循CTS,在不一樣語言中編寫的對象才能彼此交互。但並非全部的類型均可以用於全部的語言。要創建能夠在全部.NET語言中訪問的組件,

就要使用CLS。有了CLS,編譯器就能夠根據CLS規範檢查代碼是否有效。
      任何支持.NET的語言都不只僅侷限於CLS定義的公共功能子集。甚至有了.NET,仍能夠建立不能在不一樣語言中使用的組件。

這就是說,利用.NET支持全部的語言比利用COM簡單得多。若是把本身限制在CLS以內,就能夠保證組件能夠在全部的語言中使用。

第三方編寫的庫極可能限制在CLS以內,以確保該庫能夠在全部的語言中使用。
      .NET Framework是爲了支持多種語言而設計的。在設計.NET的階段中,Microsoft讓許多編譯器開發商創建它們本身的.NET語言。

Microsoft本身就發佈了VB.NET、Managed C++、C#、J#和JScript.NET。另外,不一樣開發商開發了40多種語言,

例如Cobol、Smalltalk、Perl和 Eiffel。每種語言都有其特有的優勢和許多不一樣的功能。這些語言的編譯器都進行了擴展,以支持.NET。

提示:      

CLS是一種語言必須支持的最小規範要求。若是把公共方法限制爲CLS,那麼支持.NET的全部語言就均可以使用咱們的類!
在.NET Framework中,幾乎全部(但不是全部)的類都是與CLS兼容的。在MSDN文檔說明中,不兼容的類和方法都被特別標記爲不兼容,

例如System命名空間中的UInt32結構。UInt32表示32位無符號整數。並非全部的語言(例如Visual Basic.NET或J#)都支持無符號的數據類型,

這種數據類型是與CLS不兼容的。

相關文章
相關標籤/搜索