亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

Metadata是.NET平臺(tái)的核心靈魂--

系統(tǒng) 1663 0

(轉(zhuǎn)載)Metadata .NET 平臺(tái)的核心靈魂

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

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

本來(lái)是以email的形式回復(fù)這位朋友的,但是寫著寫著發(fā)現(xiàn)寫得長(zhǎng)了,最后考慮將其以博文的形式登出。

其實(shí)個(gè)人無(wú)意參與這樣的論戰(zhàn),因?yàn)楹芏嗫谒⑶榫w貼. 我簡(jiǎn)單瀏覽了一下,發(fā)現(xiàn)論戰(zhàn)的各方( firelong , jeffreyzhao ,以及.NET社區(qū)眾網(wǎng)友),最后都情緒激動(dòng)了,情緒激 動(dòng)之下講的話大多都丟失了技術(shù)最扎實(shí)、最基本的原理。但是這些文章在口水之外,確實(shí)有一些深層次的技術(shù)問(wèn)題暴露出來(lái)——有些甚至跨越.NET,而延伸到更 廣泛的領(lǐng)域。但是,它們卻被口水淹沒(méi)了,沒(méi)有好好深入討論下去,非??上А_@便是我最后決定寫這篇文章的原因。我希望能夠?qū)ζ渲斜缓鲆暤囊恍┘夹g(shù)問(wèn)題,做 一些有意義的探討,與大家共享。

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

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

本文中,我想討論的是 《C# 會(huì)重蹈覆轍嗎?系列之2:反射及元數(shù)據(jù)的性能問(wèn)題》 一文的 整個(gè)推理過(guò)程中的一個(gè)基本論點(diǎn): .NET 平臺(tái)中 metadata 的目的 是為了支持反射。

在這個(gè)論點(diǎn)的基礎(chǔ)上,文中才有“反射并不常用,為了支持反射所創(chuàng)建的metadata卻帶來(lái)很多性能問(wèn)題。因此刪除反射,也就不需要?jiǎng)?chuàng)建 metadata,這樣.NET就不會(huì)為此再付出性能損失(就像C、C++那樣)”。

很不幸,這個(gè)基本論點(diǎn)是對(duì).NET平臺(tái)的極大誤解。換言之,在.NET平臺(tái)中metadata的存在絕對(duì)不僅僅只是支持反射。實(shí)際上,支持反射只是 metadata一個(gè)很小的用武之地,metadata是整個(gè).NET平臺(tái)非常核心的基礎(chǔ)支撐設(shè)施,它在.NET平臺(tái)中有著廣泛的應(yīng)用,是.NET平臺(tái)的 靈魂。

為什么這么講?這要從.NET創(chuàng)建時(shí)的整個(gè)軟件時(shí)代背景來(lái)談起,我們才能深刻理解這一點(diǎn)。.NET創(chuàng)建之前,Windows平臺(tái)的軟件技術(shù)經(jīng)歷了以 下幾個(gè)階段:DDE、OLE、ActiveX/COM。這些技術(shù)所努力解決的核心目標(biāo)是: 軟件組件的復(fù)用性 —— 這是軟件開(kāi)發(fā)的核心命題, 是軟件平臺(tái)廠商競(jìng)逐的焦點(diǎn)。 “軟件組件的復(fù)用性”有以下幾個(gè)含義:

1. 強(qiáng)調(diào)二進(jìn)制級(jí)的復(fù)用(黑盒復(fù)用),而不是源代碼級(jí)的復(fù)用(白盒復(fù)用)。
例如:我想在我的軟件中集成PDF閱讀器的能力,我不需要找Adobe要PDF閱讀器的源代碼,而是去找Adobe要一個(gè)支持PDF閱讀的二進(jìn)制組件—— 然后通過(guò)接口的方式來(lái)使用它。
2. 強(qiáng)調(diào)多語(yǔ)言創(chuàng)建的組件之間的復(fù)用,而不是單一語(yǔ)言創(chuàng)建的組件之間的復(fù)用。
例如:我在C++中寫一個(gè)Email收發(fā)組件,可以在VB中直接使用。

DDE、OLE、ActiveX/COM無(wú)一不是圍繞這個(gè)目標(biāo)。COM是這些技術(shù)發(fā)展進(jìn)程中的一個(gè)高峰。但是COM技術(shù)本身在發(fā)展過(guò)程中暴露出了很 多問(wèn)題。Don Box在《Essential .NET》一書(shū)的第一章“The CLR as a Better COM”對(duì)COM的問(wèn)題有非常深刻的解剖。

首先,要達(dá)致“組件復(fù)用”這一目標(biāo),必須有合同來(lái)規(guī)范組件與執(zhí)行環(huán)境、組件與組件之間的各種約定。COM使用的是IDL或TLB作為組件合同,但它 們有幾個(gè)根深蒂固的缺點(diǎn):

1. IDL/TLB規(guī)范的是物理語(yǔ)義(例如v-table偏移,棧幀,參數(shù),數(shù)據(jù)結(jié)構(gòu),對(duì)齊等內(nèi)存細(xì)節(jié)),且使用的是C++語(yǔ)言的一個(gè)子集約定。
2. IDL/TLB規(guī)范描述與組件代碼本身分離。
3. IDL/TLB規(guī)范較為混亂,沒(méi)有達(dá)成業(yè)界統(tǒng)一的標(biāo)準(zhǔn)(第三方難以擴(kuò)展開(kāi)發(fā))

其中第3點(diǎn)問(wèn)題是微軟對(duì)COM沒(méi)有前后一致的系統(tǒng)規(guī)劃導(dǎo)致——這一點(diǎn)如果假以時(shí)日是可以解決的。但是前面1、2點(diǎn)的問(wèn)題是COM根深蒂固的問(wèn)題,導(dǎo) 致了COM組件后期出現(xiàn)的各種難以解決的問(wèn)題——不同語(yǔ)言實(shí)現(xiàn)面向COM的編譯很難,因?yàn)闈M足了COM的復(fù)用模型,往往要打破該語(yǔ)言本身模型所約定的復(fù) 用。同時(shí)在一個(gè)語(yǔ)言中維護(hù)兩套編譯模型、和復(fù)用機(jī)制,步履維艱(在C++、VB、Delphi等語(yǔ)言中開(kāi)發(fā)COM組件的痛苦相信很多人深有體會(huì))。

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

1. Metadata描述的是邏輯結(jié)構(gòu),不涉及任何物理細(xì)節(jié)(例如v-table偏移,棧幀,參數(shù),數(shù)據(jù)結(jié)構(gòu),對(duì)齊,方法地址等物理細(xì)節(jié),直到在具體平臺(tái)上加 載、執(zhí)行時(shí),才被確定,比如IL代碼中經(jīng)??吹降腃ALL指令后面的 MyClass:MyMethod就是邏輯上的元數(shù)據(jù),而不是具體方法的物理地址)
2. Metadata本身與組件代碼合并在一個(gè)文件中(即程序集),包含了組件依賴,版本等信息
3. Metadata從一開(kāi)始就經(jīng)過(guò)系統(tǒng)、精心的設(shè)計(jì),是CLI業(yè)界標(biāo)準(zhǔn)的一部分(便于第三方開(kāi)發(fā)相關(guān)應(yīng)用)

這些特點(diǎn)使得metadata非常適合作為.NET組件與執(zhí)行環(huán)境(CLR)、組件與組件之間(不用語(yǔ)言開(kāi)發(fā)的組件)理想的合同規(guī)范。特別是第1 點(diǎn),“Metadata虛擬的邏輯屬性”使得組件合同專注于“邏輯語(yǔ)義層面”,而非“物理實(shí)現(xiàn)細(xì)節(jié)”。簡(jiǎn)單解釋一下:
1. 組件與組件的復(fù)用從此集中于“邏輯語(yǔ)義層面”,比如C1的方法M1中調(diào)用MyClass的方法MyMethod,用語(yǔ)義表達(dá)為:call MyClass:MyMethod?;蛘逤1類繼承C2類:用語(yǔ)義表達(dá)為:class C1 extends C2?;蛘哒{(diào)用虛方法:callvirt MyClass:VirtualMethod….
2. 組件與組件的復(fù)用不再糾纏于“物理實(shí)現(xiàn)細(xì)節(jié)”,例如:調(diào)用某個(gè)方法,必須知道它的入口點(diǎn)地址如jmp 0×000688;繼承某個(gè)類,必須清楚它的字段layout等等,調(diào)用虛方法,必須清楚v-table偏移規(guī)定…..

那為什么“專注于邏輯語(yǔ)義層面的合同”要優(yōu)于“專注于物理實(shí)現(xiàn)細(xì)節(jié)的合同”呢?

這就又要回到前面說(shuō)的“軟件組件的復(fù)用性”這一目標(biāo)上來(lái)。簡(jiǎn)單來(lái)說(shuō),如果要實(shí)現(xiàn)“軟件組件的復(fù)用性(注意二進(jìn)制、多語(yǔ)言兩個(gè)屬性)”,“專注于物理 實(shí)現(xiàn)細(xì)節(jié)”對(duì)于各個(gè)語(yǔ)言的編譯器廠商,要求太高了,各編譯器廠商要協(xié)調(diào)一個(gè)執(zhí)行體各個(gè)方面的物理細(xì)節(jié)(v-table偏移,棧幀,參數(shù),數(shù)據(jù)結(jié)構(gòu),對(duì)齊, 方法地址等等…..不一而足)——這么多細(xì)節(jié)的要求,使得大家極難協(xié)調(diào)——COM后期的弊端叢生就源于此。

而“專注于邏輯語(yǔ)義層面”來(lái)實(shí)現(xiàn)組件的復(fù)用性,各編譯器廠商生成的執(zhí)行體(即.NET里面的程序集)只需要“用metadata表達(dá)邏輯語(yǔ)義上的復(fù) 用規(guī)范”即可——這對(duì)于各編譯器廠商需要協(xié)調(diào)的規(guī)范的量級(jí)大大減少,實(shí)現(xiàn)起來(lái)相對(duì)容易得多。也不容易在各種細(xì)節(jié)上出現(xiàn)漏洞——因?yàn)榇罅康奈锢砑?xì)節(jié)全由 CLR執(zhí)行時(shí)來(lái)確定。

綜上所述, metadata 的根本性的作用是支持 基于邏輯語(yǔ)義的組件復(fù)用 ”—— 這是 .NET 致力于打造軟件開(kāi)發(fā)平臺(tái)的核心目標(biāo)。 支持反射僅僅是 metadata 一個(gè)很小的衍生功能,而非主要功能。

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

1. Metadata是JIT編譯、亦即實(shí)現(xiàn).NET跨平臺(tái)的基礎(chǔ)
說(shuō)明:IL代碼中大量引用著Metadata。在MethodDef元數(shù)據(jù)表里面存儲(chǔ)著一個(gè)方法的各種語(yǔ)義信息,許多IL指令就直接內(nèi)嵌了 Metadata Tokens。沒(méi)有Metadata,JIT也無(wú)法實(shí)現(xiàn)。

2. Metadata是.NET支持垃圾收集GC的基礎(chǔ)
說(shuō)明:metadata標(biāo)記了對(duì)象與對(duì)象間的引用關(guān)系,這是GC遍歷對(duì)象圖(判斷對(duì)象是否可以收集)的關(guān)鍵依據(jù)。沒(méi)有metadata,GC將不知道 0×000688是一個(gè)指針(需要繼續(xù)遍歷)?還是一個(gè)整數(shù)(不需要繼續(xù)遍歷)?

3. Metadata是描述類型契約、標(biāo)識(shí)、規(guī)范等的基本信息
說(shuō)明:強(qiáng)命名程序集(使用metadata描述)唯一標(biāo)識(shí)了編譯器當(dāng)初編譯時(shí)的組件,不至于導(dǎo)致運(yùn)行期仿冒、或者版本偷換(即DLL 地獄問(wèn)題)

4. Metadata是.NET管理組件安全的基礎(chǔ)(運(yùn)行時(shí)類型檢查,組件下載)
說(shuō)明:metadata會(huì)告訴CLR執(zhí)行環(huán)境一個(gè)組件的安全邊界,從而可以管理那些惡意代碼。

5. Metadata是.NET管理組件引用關(guān)系,加載的基礎(chǔ)
說(shuō)明:metadata會(huì)告訴一個(gè)組件需要引用哪些組件(哪些版本)?這是組件加載的基礎(chǔ)。

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

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

?

Metadata是.NET平臺(tái)的核心靈魂--


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

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

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦?。?!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 国产精品亚洲专一区二区三区 | 寂寞午夜影院 | 国产中文字幕一区 | 精品黑人一区二区三区 | 国产日产久久高清欧美一区 | 日本a中文字幕 | 天天擦天天干 | 国产精品伦理 | 国产剧情一区二区 | 天天射狠狠干 | 韩国美女高清爽快一级毛片 | 国产成人精品免费视频大 | 毛片毛片毛片毛片 | 涩涩色视频在线播放 | 欧美日韩国产综合一区二区三区 | 91在线看片 | 中文字幕在线视频观看 | 最新精品亚洲成a人在线观看 | 中文字幕日韩亚洲 | 青青99| 伊人久久大香线焦综合四虎 | 国产成年网站 | 日韩国产成人资源精品视频 | 色干综合| 97理论三级九七午夜在线观看 | 亚洲国产成人久久 | 国产一区曰韩二区欧美三区 | 亚洲天天网综合自拍图片专区 | 久久久久久久性 | 91精品日韩 | 青青草a免费线观a | 日韩一区二区在线免费观看 | 最刺激黄a大片免费观看下截 | 香蕉人人超人人超免费看视频 | 欧洲精品 | 国内永久第一免费福利视频 | 久久久国产麻豆 | 亚洲图片综合区 | 天天操天天操天天干 | 日日夜夜操操操 | 亚洲伊人精品综合在合线 |