1. 程式人生 > >解讀經典-《C#高階程式設計》第七版-Chapter1-.Net體系結構-Page6-13

解讀經典-《C#高階程式設計》第七版-Chapter1-.Net體系結構-Page6-13

01

中間語言(IL)

.Net中間語言(IL)的特性,很大程度上來自於要支援多語言互操作性。要支援多語言互操作性,是因為微軟想搞一個大事情,將它的老產品線VB和VC++,VJ++都裝入.Net架構中。要支援多語言互操作,就需要實現這些基本功能:

1) 繼承:一種語言的類能繼承另一種語言編寫的類。

2) 組合:一種語言的類可以包含另外一種語言的類的例項。

3) 呼叫:一個物件能夠呼叫其他語言編寫的物件的方法。

4) 傳遞:值和物件應該能在不同類的方法之間傳遞(傳遞資料)。

5) 除錯:偵錯程式應能支援跨語言除錯。

 

這裡特別說明下:繼承和組合。我們在學習所謂的“面向物件”的程式設計的時候,往往會用力過度,覺得物件化程式設計關鍵是“繼承”,然後就設計出一堆繼承關係。然而你要提醒自己,“組合”才是你應該多用的,因為繼承觀念雖好,但它有限制且複雜,因為.Net,Java是單一繼承,而C++的多繼承又特別複雜,概念雖美,但我們的目標是:更高效的寫程式碼。舉個例子,當你考慮B類繼承A類時,考慮一下:B類包含A類,如何?這例子可以類比為:當你要繼承你爸爸時,你考慮下,你包含你爸爸和你媽媽?我覺得後者更合適。因為你還要繼承你媽媽,所以單一繼承你爸爸不合適,而且你還會有你爸爸沒有的技能,所以用包含挺好。

回到話題,上述如此巨集偉的規劃,.Net實現了。這就需要中間語言要提供強力支援。很顯然我們可以想到,中間語言必須有相當程度的“物件化”特性,才能很好的支援這一點。我們來看看它的特徵:

1) 面對物件和使用介面

面對物件相當於為不同語言建立了底層的“基本物件”,使不同語言有了相同的底層基礎。使用介面使得不同語言可以遵循統一的“契約”(介面即契約)。

2) 區分值型別和引用型別

與其他程式語言一樣,中間語言提供了預定義的基本資料型別。它分為值型別和引用型別,值型別儲存在堆上,引用型別的例項則儲存在堆疊上,堆和堆疊是兩種不同的記憶體區域。

3) 強資料型別化

強資料型別化非常重要,它使得在不同語言間的資料傳遞變得簡單而高效。中間語言通過“通用型別系統(CTS)”來預定義通用型別,通過“公共語言規範(CLS)”來確保語言的互操作性。

強資料型別化也使得中間語言可以實現物件化管理,從而實現了.Net的垃圾回收機制。中間語言通過“託管堆”儲存物件,當託管堆滿時呼叫垃圾回收器清理物件。

“應用程式域”也是個.Net的一個重要特性,傳統的應用程式通過COM進行元件呼叫,此時應用程式和元件使用的是同一塊記憶體,這容易因為COM元件的Bug而導致整個應用程式崩潰。而傳統的通過比如CGI程序的方式來隔離記憶體,又存在程序開銷比較大,程序間資料交換效率低的問題。而應用程式域很好的解決了這個問題。這依賴於中間語言的“強資料型別化”,強資料型別化隔絕了對記憶體的跨域訪問,以及通過強型別化,使得資料可以以“物件”的方式傳輸,極大的提高了資料交換效能。當然應用程式域很少被應用,我自己幾乎沒用到,一般只在做類似開發工具Eclipse之類的外掛式應用時才需要考慮。

4) 使用異常來處理錯誤

因為執行在中間語言之上的高階語言都使用了異常處理機制,所以中間語言需要支援異常的基礎結構,使得異常能夠在不同語言間傳遞必要的除錯資料資訊。

同Java一樣,異常在C#中非常重要。因為歷史原因,程式設計師們看到太多的程式碼都是使用更老舊的語言編寫的,比如C,C++等,在這些傳統語言中,一般使用方法的返回值來表示錯誤,比如返回-1表示錯誤型別1,返回-2表示錯誤型別2。這在.Net時代已經過時,我看到太多的人在錯誤的使用異常機制,還在走老舊的錯誤處理方式。這真是埋沒了.Net優秀的異常機制,也是給自己程式設計挖坑的典範。記住一句話:你壓根兒不應該在.Net框架下,考慮用返回值來表示錯誤!如果你發現在這麼想,那麼應該立即反省和思考。.Net下的返回值,只需要用於真正要返回的值,如果你的方法沒有想要返回的值,那麼方法的返回值就應該是void。

5) 使用特性(attribute)

中間語言也支援特性。在傳統的C++編寫COM時會使用特性,它一般是用於給編譯器提供一些額外的資訊。中間語言對特性進行了功能的拓展。我們可以自定義特性,可以使用反射來應用特性。這在ASP.Net MVC中體現的非常多,它實現了“面向切面程式設計”,使得程式碼能得到更好的複用。

 

附文:

https://www.cnblogs.com/aidd2008/archive/2012/01/14/2322603.html
https://www.cnblogs.com/Caceolod/articles/812761.html

 

後面將繼續講述“程式集”,“名稱空間”等中間語言特性。

我們下回分解。

 

上一篇:解讀經典-《C#高階程式設計》第七版-Chapter1-.Net體系結構-Page1-6

歡迎關注本人微信公眾號,更及時的關注最新文章(每週兩篇原創文章):