C#.NET中的CTS、CLS和CLR


在學習.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)。

參考:《.NET分布式編程——C#篇》


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM