本章將對CLR中的IL、CTS和CLS進行一個大概的總結。下章將開始第二章的內容。
IL我們稱之為進階組合語言或者中繼語言,在我們編寫基於.NET架構下的程式(不論是C#、VB或者J#等)在被編譯成本地CPU指令前,都將被編譯成IL語言,再有CLR對IL語言進行編譯和控制。比如用VB在控制台應用程式寫入如下代碼:
Sub Main()
Console.WriteLine("VB")
End Sub
再用C#在控制台應用程式寫入如下代碼:
static void Main(string[] args)
{
Console.WriteLine("Test");
}
雖然文法完全不一樣(除了輸出比較相似外),但是如果我們用微軟的MSIL反組譯工具載入編譯完成後的exe檔案,
圖1.1
圖1.2
上面兩張圖中圖1.1為編譯完成後VB語言的代碼,圖1.2為編譯完成後C#的代碼,在我畫紅線的地方大家可以看出,出了第一行(紅線)不一樣為我們輸出的字串外,第二行(紅線)是完全一樣,也就是說不管在平台下什麼語言進行編程,編譯器最終都會把它編譯成統一的IL代碼(相同功能,比如樣本中的控制台輸出指令)。通過上面的樣本可以很容易的看出CLR是如何支援多語言整合的,只是需要不同的編譯器,把源檔案編譯成面向CLR的IL代碼,就可以在.NET架構下面運行。
什麼是CTS?
CTS(Common Type System 一般型別系統)是由微軟制定的一個規範,它表述了一個類型的定義和行為。既然CTS是一組規範,那麼都規定了什麼呢?
一、CTS規定一個類型可以包含零個或多個成員(欄位、屬性、方法、事件);
二、CTS規定了一個類型的可視原則。就是我們所說的許可權修飾符(public、private、protected、internal)
三、CTS規定任何類型都只能從一個類型中派生,即:System.Object類型。(雖然C++支援多整合,但是在.NET架構下,如果編譯器發現開發人員使用了多整合,違反了CTS的這一規定,編譯器就會報錯。)
什麼是CLS?
CLS(Common Language Specification Common Language Specification)是由微軟制定的一個各個語言間都支援的功能。也就是說,CLS是CTS的一個子集,而這個子集是.NET架構下面所有程式設計語言都必須遵守的(如果需要C#和VC++的應用程式進行通訊)。說的更詳細一點就是說,如果你想用C#調用C++的組件,那麼C++所使用的文法(如果該方法為public,如果方法不為public的話,CLS不進行約束),必須保證C#能夠操作。可是C++程式員不一定知道C#能不能操作他所寫的方法,這個時候就需要CLS進行約束,以保證C#能正常的調用C++的組件。
圖1.3
圖1.3中大家可以看出,CLR\CTS為.NET架構下的所有語言提供了一個大的功能集。每一個語言都使用了CLR\CTS的一個子集。但是這個子集中都包含了CLS這個最小的子集。也就是說所有語言的功能及都必須支援CLS最小的供能集。
到此這本書的第一章筆者只領悟到這些東西,可能還有更深層次的東西,由於筆者的水平有限,也只能到這裡了。如有不對的地方、不準確的地方,希望各位看官都能即時的提出。以便筆者學習和糾正博文中的錯誤,謝謝!