.NET 本質(zhì)論 讀書筆記 - COM 與CLR作者:ifreely0204 COM 全稱Component Object Mode 組件對象模型。 很慶幸剛?cè)胄熊浖_發(fā)的時候沒有去寫COM組件,也很遺憾沒有去做一些底層的事情。 一開始接觸.NET的時候就被灌輸一個模糊的理念,.NET中有一個叫中間語言的東西,一個模糊的說法,ASP.NET第一次運行的時候會比較慢,不過那時候就埋頭去學(xué)C#了,沒有深入研究.net framework的機制,某種意義上說就是純粹的代碼工人,干體力活的,人家搬磚我搬字母,一個重點用肩扛手拉一個輕點用腦子和指頭敲敲打打,其實還真是同行,呵呵。
不過一個人的知識總是有限的,但總是有大師給我們指路解惑,Don Box 的這本書讀著真的是感覺大腦做了一次升級,以前亂七八糟的知識在這里一串就全通了。
讀一章寫一點,結(jié)合著另一本Jeffrey Richter寫的《Microsoft .NET 框架程序設(shè)計》一起來對.NET做一個深入的了解。
.NET 本質(zhì)論 第一章 CLR是一個更好的COM
首先要知道組件的概念:一個可復(fù)用的代碼塊,可以將多個獨立函數(shù)的功能進行組合,從而擴充成諸如Office Word 這樣的應(yīng)用程序。就像兒童玩的積木一樣,一塊塊的積木就是一個個的組件,搭出來的東西就是應(yīng)用程序。組件之間有各種約定,這些約定表現(xiàn)為簡單的函數(shù)入口點,這樣不同組件之間就可以通過這些約定進行相互之間的調(diào)用 而COM 的設(shè)計規(guī)范就是將組件約定表示為類型定義。所以多數(shù)COM下的問題都能追溯到組件間約定的本性上。COM 用類型的形式表示組件約定,但是第一COM規(guī)范特別避免強制用于約定定義的交換格式,所以組件間的約定無法以標準化的方式描述;第二MS定義和支持的COM交換格式有兩個,一個是接口定義語言IDL 和類型庫TLB,但是自家兄弟之間不同心,這兩種格式不是同構(gòu)的,即互相之間無法互相支持,而且互相不能成為對方的子集,這樣一來子集內(nèi)部就會有兩種交換格式,而且沒有一種是權(quán)威的或是標準的。 COM沒有描述組件之間的依賴性dependency,說白了就是部署時候不知道哪個DLL是必須要調(diào)用的哪些可以不調(diào)用,所以似乎就是把所有的DLL都包括進去就是最保險的了,但是同一個組件的版本也沒法靜態(tài)的確定,所以版本問題的診斷液很難。 第二個大問題是COM約定描述格式缺乏擴展性,這和MS事務(wù)服務(wù)器有關(guān)系。 上面的兩個大問題是COM問題的一方面,最重要的是COM約定本身是面向物理的physical,也稱二進制約定。即COM對于組件調(diào)用有著嚴格的規(guī)定, 1、每一個方法都有精確的vtable(虛函數(shù)表)偏移量; 2、在調(diào)用的時候COM約定使用明確的堆棧規(guī)則; 3、COM約定強制每一個作為方法參數(shù)傳遞的數(shù)據(jù)結(jié)構(gòu)的明確偏移量,即傳參的時候參數(shù)順序也不能有錯誤; 4、COM約定強制命令具體使用哪一個為被調(diào)用者分配內(nèi)存的分配器; 5、COM約定強制對象引用的明確格式,成為接口指針。 所以綜上實際上COM約定最終就是形成了一個堆棧結(jié)構(gòu)的協(xié)議,確定了每一個方法、變量如何在內(nèi)存中分配,基本上就是告訴機器如何分配組件的每一部分,而沒有描述一些語義上的內(nèi)容,我的理解就是低級語言。這樣一來,對程序的可控性確實大大提高,但是過分的控制就會降低開發(fā)的效率,用“難以接受的不可靠性為代價”換取“高效的代碼”,這個確實不合算。
CLR的歷史經(jīng)過了幾次命名,從COM3 ->公共對象運行庫COR(Component Object Runtime -> COM+ ->通用運行庫URT(Universal Runtime) ->CLR。 和COM 相比,CLR也關(guān)注組件間的約定,這些約定也是基于類型的,這是兩者相同的地方。
本質(zhì)不同的在于: 1、CLR有完全規(guī)范的格式描述組件之間的約定,即我們熟悉而又陌生的元數(shù)據(jù)(metadata)。元數(shù)據(jù)是機器可讀的,其格式是遵循規(guī)范的。在開發(fā)中也會接觸到元數(shù)據(jù),而且是可讀寫的,實際上這是CLR提供的一些實用部件,使我們可以對元數(shù)據(jù)進行操作。此外,元數(shù)據(jù)包括了組件間的依賴關(guān)系和版本關(guān)系,這就避免了前面提到的那些惱人的問題。 2、第二個區(qū)別是約定本身。先說說COM,在COM中組件約定“暗示了堆棧約定、虛函數(shù)表,以及作為方法參數(shù)傳遞的數(shù)據(jù)結(jié)構(gòu)在內(nèi)存中的表示形式”,于COM 這種物理約定相比,CLR的約定是一種描述邏輯結(jié)構(gòu)的約定,沒有暗示訪問字段或者方法的精確的代碼順序,也沒有約定任何數(shù)據(jù)的內(nèi)存表示形式。CLR使用名字與簽名代替偏移量引用字段和方法,所有對于數(shù)據(jù)結(jié)構(gòu)的內(nèi)存表示形式都被延期,直到在運行類型被加載以及初始化時才確定。實現(xiàn)這種延期的方法就是采用了公共中間語言CIL(Common Intermediate Language)機制來延期那些偏移量的解析。
所以可以看到COM和CLR的本質(zhì)區(qū)別就在于是否對數(shù)據(jù)結(jié)構(gòu)進行內(nèi)存分配。CLR將這個操作延期的優(yōu)勢在于在部署的時候可以根據(jù)部署機器上的目標處理架構(gòu)生成與之匹配的物理耦合,這樣開發(fā)著不必關(guān)系部署機器的架構(gòu),只要編寫好了程序,通過CIL可以將程序翻譯為適合任何部署機器架構(gòu)的實際運行代碼,當然,任何程序最終運行時都要翻譯成相應(yīng)的部署機器的機器語言,使得部署機器可以執(zhí)行程序。CLR通過這種延期機制,實現(xiàn)了程序的任意遷移。
CLR做的所有這些虛擬化工作可以大大降低與機器交互的難度,可以讓我們使用任何我們喜歡的高級語言來進行程序的編寫。
以上是根據(jù)我自己的理解并摘寫原書中的一些描述來寫的,讀完這一章的東西,個人感覺,總有一天,人人都會寫程序的!呵呵
------Study is never too later! |
|