欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

Metadata是.NET平臺的核心靈魂--

系統 1736 0

(轉載)Metadata .NET 平臺的核心靈魂

July 7th, 2010? jzli Leave a comment ? Go to comments

網友來信:李老師,您好!我參加過你去年到我們公司做的.NET深度培訓,也拜讀過你的譯作:《.NET框架程序設計(修訂版)》和 《Effective C#》,受益匪淺,非常佩服你這樣優秀的.NET技術專家。前幾天在博客園上的 C#大論戰 ,不知道您看過嗎?特別是其中一個網友 firelong 所寫的幾篇轟動的帖子,對.NET的性能提 出了許多批評。這個話題在我們項目組(大多數都參加過你去年的培訓)也引起了很多爭論,很想聽聽李老師對這些觀點的看法?……….

本來是以email的形式回復這位朋友的,但是寫著寫著發現寫得長了,最后考慮將其以博文的形式登出。

其實個人無意參與這樣的論戰,因為很多口水帖、情緒貼. 我簡單瀏覽了一下,發現論戰的各方( firelong jeffreyzhao ,以及.NET社區眾網友),最后都情緒激動了,情緒激 動之下講的話大多都丟失了技術最扎實、最基本的原理。但是這些文章在口水之外,確實有一些深層次的技術問題暴露出來——有些甚至跨越.NET,而延伸到更 廣泛的領域。但是,它們卻被口水淹沒了,沒有好好深入討論下去,非常可惜。這便是我最后決定寫這篇文章的原因。我希望能夠對其中被忽視的一些技術問題,做 一些有意義的探討,與大家共享。

首先我想就 《C# 會重蹈覆轍嗎?系列之2:反射及元數據的性能問題》 一文中的主要技術點來談談。這篇文章主要觀點如下(并且給了相應的分析):
1. 使用反射會有很高的性能成本
2. 即使不用反射,為支持反射而產生的metadata也有很高的性能成本

因此,作者才得出來在 《C 與C++社區混戰,C#會重蹈覆轍嗎?》 一文中“刪除反射”的結論。關于反射和metadata帶來的性能問題,我想沒有人會否認,只是其性能問 題到底有多糟?我后面有空的話也許會另文討論(firelong文章中有部分含糊其辭)。

本文中,我想討論的是 《C# 會重蹈覆轍嗎?系列之2:反射及元數據的性能問題》 一文的 整個推理過程中的一個基本論點: .NET 平臺中 metadata 的目的 是為了支持反射。

在這個論點的基礎上,文中才有“反射并不常用,為了支持反射所創建的metadata卻帶來很多性能問題。因此刪除反射,也就不需要創建 metadata,這樣.NET就不會為此再付出性能損失(就像C、C++那樣)”。

很不幸,這個基本論點是對.NET平臺的極大誤解。換言之,在.NET平臺中metadata的存在絕對不僅僅只是支持反射。實際上,支持反射只是 metadata一個很小的用武之地,metadata是整個.NET平臺非常核心的基礎支撐設施,它在.NET平臺中有著廣泛的應用,是.NET平臺的 靈魂。

為什么這么講?這要從.NET創建時的整個軟件時代背景來談起,我們才能深刻理解這一點。.NET創建之前,Windows平臺的軟件技術經歷了以 下幾個階段:DDE、OLE、ActiveX/COM。這些技術所努力解決的核心目標是: 軟件組件的復用性 —— 這是軟件開發的核心命題, 是軟件平臺廠商競逐的焦點。 “軟件組件的復用性”有以下幾個含義:

1. 強調二進制級的復用(黑盒復用),而不是源代碼級的復用(白盒復用)。
例如:我想在我的軟件中集成PDF閱讀器的能力,我不需要找Adobe要PDF閱讀器的源代碼,而是去找Adobe要一個支持PDF閱讀的二進制組件—— 然后通過接口的方式來使用它。
2. 強調多語言創建的組件之間的復用,而不是單一語言創建的組件之間的復用。
例如:我在C++中寫一個Email收發組件,可以在VB中直接使用。

DDE、OLE、ActiveX/COM無一不是圍繞這個目標。COM是這些技術發展進程中的一個高峰。但是COM技術本身在發展過程中暴露出了很 多問題。Don Box在《Essential .NET》一書的第一章“The CLR as a Better COM”對COM的問題有非常深刻的解剖。

首先,要達致“組件復用”這一目標,必須有合同來規范組件與執行環境、組件與組件之間的各種約定。COM使用的是IDL或TLB作為組件合同,但它 們有幾個根深蒂固的缺點:

1. IDL/TLB規范的是物理語義(例如v-table偏移,棧幀,參數,數據結構,對齊等內存細節),且使用的是C++語言的一個子集約定。
2. IDL/TLB規范描述與組件代碼本身分離。
3. IDL/TLB規范較為混亂,沒有達成業界統一的標準(第三方難以擴展開發)

其中第3點問題是微軟對COM沒有前后一致的系統規劃導致——這一點如果假以時日是可以解決的。但是前面1、2點的問題是COM根深蒂固的問題,導 致了COM組件后期出現的各種難以解決的問題——不同語言實現面向COM的編譯很難,因為滿足了COM的復用模型,往往要打破該語言本身模型所約定的復 用。同時在一個語言中維護兩套編譯模型、和復用機制,步履維艱(在C++、VB、Delphi等語言中開發COM組件的痛苦相信很多人深有體會)。

而這個時候,95-98年間名聲大噪的Java給了微軟相當大的啟發。特別是其中的metadata,微軟的技術精英發現metadata是最好的 組件合同定義體。Metadata有以下幾個非常好的特點(這些正好克服了COM組件描述IDL/TLB的缺點):

1. Metadata描述的是邏輯結構,不涉及任何物理細節(例如v-table偏移,棧幀,參數,數據結構,對齊,方法地址等物理細節,直到在具體平臺上加 載、執行時,才被確定,比如IL代碼中經常看到的CALL指令后面的 MyClass:MyMethod就是邏輯上的元數據,而不是具體方法的物理地址)
2. Metadata本身與組件代碼合并在一個文件中(即程序集),包含了組件依賴,版本等信息
3. Metadata從一開始就經過系統、精心的設計,是CLI業界標準的一部分(便于第三方開發相關應用)

這些特點使得metadata非常適合作為.NET組件與執行環境(CLR)、組件與組件之間(不用語言開發的組件)理想的合同規范。特別是第1 點,“Metadata虛擬的邏輯屬性”使得組件合同專注于“邏輯語義層面”,而非“物理實現細節”。簡單解釋一下:
1. 組件與組件的復用從此集中于“邏輯語義層面”,比如C1的方法M1中調用MyClass的方法MyMethod,用語義表達為:call MyClass:MyMethod。或者C1類繼承C2類:用語義表達為:class C1 extends C2。或者調用虛方法:callvirt MyClass:VirtualMethod….
2. 組件與組件的復用不再糾纏于“物理實現細節”,例如:調用某個方法,必須知道它的入口點地址如jmp 0×000688;繼承某個類,必須清楚它的字段layout等等,調用虛方法,必須清楚v-table偏移規定…..

那為什么“專注于邏輯語義層面的合同”要優于“專注于物理實現細節的合同”呢?

這就又要回到前面說的“軟件組件的復用性”這一目標上來。簡單來說,如果要實現“軟件組件的復用性(注意二進制、多語言兩個屬性)”,“專注于物理 實現細節”對于各個語言的編譯器廠商,要求太高了,各編譯器廠商要協調一個執行體各個方面的物理細節(v-table偏移,棧幀,參數,數據結構,對齊, 方法地址等等…..不一而足)——這么多細節的要求,使得大家極難協調——COM后期的弊端叢生就源于此。

而“專注于邏輯語義層面”來實現組件的復用性,各編譯器廠商生成的執行體(即.NET里面的程序集)只需要“用metadata表達邏輯語義上的復 用規范”即可——這對于各編譯器廠商需要協調的規范的量級大大減少,實現起來相對容易得多。也不容易在各種細節上出現漏洞——因為大量的物理細節全由 CLR執行時來確定。

綜上所述, metadata 的根本性的作用是支持 基于邏輯語義的組件復用 ”—— 這是 .NET 致力于打造軟件開發平臺的核心目標。 支持反射僅僅是 metadata 一個很小的衍生功能,而非主要功能。

事實上除了支持“基于邏輯語義的組件復用”這一核心目標外,metadata在.NET平臺中還起著其他重要作用(有些是組件復用的延伸需求,比如 JIT與跨平臺):

1. Metadata是JIT編譯、亦即實現.NET跨平臺的基礎
說明:IL代碼中大量引用著Metadata。在MethodDef元數據表里面存儲著一個方法的各種語義信息,許多IL指令就直接內嵌了 Metadata Tokens。沒有Metadata,JIT也無法實現。

2. Metadata是.NET支持垃圾收集GC的基礎
說明:metadata標記了對象與對象間的引用關系,這是GC遍歷對象圖(判斷對象是否可以收集)的關鍵依據。沒有metadata,GC將不知道 0×000688是一個指針(需要繼續遍歷)?還是一個整數(不需要繼續遍歷)?

3. Metadata是描述類型契約、標識、規范等的基本信息
說明:強命名程序集(使用metadata描述)唯一標識了編譯器當初編譯時的組件,不至于導致運行期仿冒、或者版本偷換(即DLL 地獄問題)

4. Metadata是.NET管理組件安全的基礎(運行時類型檢查,組件下載)
說明:metadata會告訴CLR執行環境一個組件的安全邊界,從而可以管理那些惡意代碼。

5. Metadata是.NET管理組件引用關系,加載的基礎
說明:metadata會告訴一個組件需要引用哪些組件(哪些版本)?這是組件加載的基礎。

從這里大家可以看出來,Metadata是.NET平臺實實在在的基石。Metadata之于.NET平臺,就像維他命至于生物體一樣。換言之,刪 除反射,并不能消除metadata。如果要消除metadata,.NET平臺的整個設計基礎(組件復用,以及上述的其他種種功能)將不復存在。

最后,指出 《C# 會重蹈覆轍嗎?系列之2:反射及元數據的性能問題》 一文中的核心論據錯誤,并非為了追求駁倒firelong。建議 firelong,jeffreyzhao以及這場辯論的眾多技術領域的網友(不管是firelong,jeffreyzhao支持者還是反對者),拋掉 “非要辯個勝負,分個高低”的怪誕氛圍,而是來一些扎扎實實的技術說理過程,相信會更有意義——如是,則國內技術社區成長可待!

?

Metadata是.NET平臺的核心靈魂--


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 国产精品久久久久久久四虎电影 | 一级做a爰片久久毛片看看 欧美日韩精品国产一区二区 | 国产日韩欧美在线观看 | A片扒开双腿猛进入免费观看 | 91精品国产色综合久久 | 亚洲精品福利一区二区三区 | 日韩国产三级 | 亚洲精品美女久久777777 | 色之综合天天综合色天天棕色 | 日韩欧美黄色片 | 国产日产久久 | 一区二区播放 | 精品国产视频 | 日本高清va不卡视频在线观看 | 99精品免费视频 | 精久久久 | 91中文在线观看 | 久草福利在线观看 | 日韩欧美一区二区在线观看 | 91短视频免费 | 天天舔天天射天天操 | 粉嫩粉嫩芽的虎白女18在线视频 | 欧美四虎 | 午夜深夜福利网址 | 夜夜爽日日澡人人 | 青娱乐网站 | 国产一级影视 | 亚洲视频观看 | 免费黄色小视频 | a黄视频| 日本精品久久久久护士 | 无码免费人妻A片AAA毛 | 亚洲免费人成 | 亚洲欧美精品 | 色黄网站aaaaaa级毛片 | 91茄子在线观看 | 中文字幕一区二区三区四区五区 | 午夜影院在线免费观看 | 国产欧美一区二区三区在线看 | 精品视频导航 | 亚洲综合色站 |