Sung in Blog

                     一些技術(shù)文章 & 一些生活雜碎
          對(duì)主流技術(shù)的分析和總結(jié)

          一、引言
          我為什么要寫這篇文章
          首先,我要限定我文章的范圍,我討論的問題局限于桌面應(yīng)用開發(fā)領(lǐng)域和企業(yè)應(yīng)
          用開發(fā)領(lǐng)域,所以我的結(jié)論并不適用于整個(gè)軟件開發(fā)界,比如我說C語言已經(jīng)退出
          歷史舞臺(tái),這對(duì)于寫嵌入式系統(tǒng)的人和編寫操作系統(tǒng)內(nèi)核的人來說顯然是錯(cuò)了。
          我寫這篇文章的目的主要是:
          * 簡(jiǎn)單的介紹并評(píng)價(jià)當(dāng)前主流技術(shù)
          * 比較當(dāng)前的主流技術(shù)
          * 預(yù)計(jì)技術(shù)的演變

          如果你想做程序員或者已經(jīng)是個(gè)程序員,你可能會(huì)面對(duì)這些困惑:
          * 學(xué)什么語言呢?Delphi、C++、VB、Java、C#、PHP、Python?
          * 選擇什么開發(fā)工具呢?Delphi、VC、C++Builder、JBuilder?
          當(dāng)你已經(jīng)入了門,有了一定的基礎(chǔ)之后(可能已經(jīng)通曉了幾種語言),你會(huì)面臨
          進(jìn)一步的困惑:
          * MFC和VCL之間是什么關(guān)系?
          * J2EE到底是什么?.Net到底是什么??jī)烧哂惺裁幢举|(zhì)的區(qū)別,我應(yīng)該學(xué)習(xí)哪一個(gè)呢?
          * COM那么復(fù)雜,為什么很多地方都用到它?我必須學(xué)習(xí)它嗎?


          如果是作為一個(gè)軟件公司,如果不是那么大,如果你的公司還沒有一個(gè)真正的技
          術(shù)上的靈魂人物,那么你也會(huì)面臨同樣的困惑。技術(shù)問題紛繁復(fù)雜,讓你不知所
          從,而且真正的精通每一項(xiàng)技術(shù)都需要巨大的時(shí)間和人力的投入,你怎么辦?選擇
          哪種技術(shù)作為公司的主流技術(shù)呢?選擇的方向是否正確是個(gè)關(guān)乎你的公司的生死存
          亡的問題。

          你面臨著這些困惑嗎?如果是,那么請(qǐng)讓我試著為你撥云見日。


          我的故事

          在我上大學(xué)之前,我從沒見過計(jì)算機(jī)。大學(xué)的時(shí)候,正是Dos和FoxBASE的年代,
          也正是計(jì)算機(jī)軟件開發(fā)世界幾件偉大的事情發(fā)上的時(shí)候:(Windows3.1、Borland
          C++ 3.1、Visual Basic 1.0 的推出也是偉大的事情,但那時(shí)候我還不知道計(jì)算機(jī)
          為何物)Widnows95推出,并開始應(yīng)用;Visual Basic 5.0推出,開發(fā)工具中第一次
          出現(xiàn)了成熟的、被廣泛應(yīng)用的Auto Code Completion技術(shù);Java推出;ASP技術(shù)開
          始盛行,Windows DNA技術(shù)被理解和接受;標(biāo)準(zhǔn)C++誕生;Visual C++6.0 推出;J2EE
          規(guī)范推出。
          成為一個(gè)程序員對(duì)我而言并不順利,因?yàn)槲也皇强瓢喑錾怼N胰腴T的程序語言是
          FoxBASE,這讓我一直對(duì)FoxBASE有種特殊的感情,我也正是通過Visual FoxPro3.0
          轉(zhuǎn)寫Windows程序的,如果沒有它,我也許就不會(huì)成為一個(gè)程序員了。后來,在大
          學(xué)期間接觸到了InterDEV,那是個(gè)寫ASP程序的開發(fā)工具,還有Java,也是那時(shí)候
          接觸的,當(dāng)時(shí)有點(diǎn)盲目崇拜的意思(我想我喜歡Java的一個(gè)原因可能是剛開始學(xué)C
          的時(shí)候很受挫折)。畢業(yè)之后,我就是憑借著自己寫的一個(gè)ASP網(wǎng)站找到了自己的
          第一份工作——說來慚愧,我從來也沒有成為一個(gè)C程序員。我真正的熟悉Java是在
          我翻譯了一本Java數(shù)據(jù)結(jié)構(gòu)的書和寫了一套完整的GIS系統(tǒng)之后(說起此事,我要
          感謝一下我的公司,但因?yàn)檫@些故事與本文的主題無關(guān),所以這里就不多說了)。
          再后來,我自己學(xué)習(xí)了標(biāo)準(zhǔn)C++和COM技術(shù)。
          有點(diǎn)像履歷表了是嗎?提到這些,我只是希望作為讀者的你能夠了解一下我的知
          識(shí)體系,從而能夠知道我大概要講些什么;同時(shí)也希望你能夠原諒我可能犯的錯(cuò)誤
          ——我在這里說的話,并不一定就是最后的結(jié)論,雖然“共同探討”這個(gè)詞幾乎是粗制
          濫造的書的作者專用語了,但我在這里引用它是真誠(chéng)的,我愿意看到你的反饋。


          要涉及的話題
          在開始文章的正題之前,我先大概地介紹這篇文章將會(huì)涉及到哪些知識(shí)。如果你
          是初學(xué)者,希望你不要被嚇倒,這雖然是一篇技術(shù)文章,但我不會(huì)過多的討論技術(shù)
          細(xì)節(jié),如果你不懂我說的這些東西,也沒關(guān)系,我本來就希望通過我的文章幫助你
          做出一個(gè)選擇,不再走很多人已經(jīng)走過的彎路,你這要記住結(jié)論就可以了,隨著你
          知識(shí)的增長(zhǎng),以后你會(huì)漸漸明白;如果你已經(jīng)通曉了這些技術(shù)或其中的大部分,那
          么我相信讀了這篇文章你會(huì)有一些另外的收獲。
          主流的程序設(shè)計(jì)語言: C++、Delphi(Object Pascal)、Java、C#
          桌面應(yīng)用程序框架:MFC、VCL、QT、Java AWT\SWING、.Net
          企業(yè)應(yīng)用程序框架:Windows DNA(ASP、COM、COM+)、J2EE、.Net Framework
          開發(fā)工具:Visual Basic、Delphi、Visual C++、C++ Builder 、Visual C#

          二、正文
          好了,現(xiàn)在讓我們開始我的正文吧。
          首先,我來完成這篇文章的第一個(gè)目標(biāo):介紹并評(píng)價(jià)當(dāng)前主流技術(shù)。我指的今天
          的主流技術(shù)是:
          * 程序設(shè)計(jì)語言:C++\Delphi(本來應(yīng)該是Object Pascal,但為了簡(jiǎn)單,我就語
          言和工具混為一談吧)\Java\C#(雖然他剛剛推出,但因?yàn)槲④洖橹畠A注了大量心
          血,一定會(huì)成為一種重要的開發(fā)語言)
          * 桌面應(yīng)用程序框架:MFC\VCL
          * 企業(yè)應(yīng)用程序框架:Windows DNA\J2EE\.Net
          * COM技術(shù):我單獨(dú)提出這項(xiàng)技術(shù),是因?yàn)樗鼰o法簡(jiǎn)單的被視為語言、桌面應(yīng)用程
          序框架或企業(yè)應(yīng)用程序框架,它與這些都有關(guān)系。
          2.1 程序設(shè)計(jì)語言
          2.1.1 C++
          語言的演進(jìn)最初要從二進(jìn)制代碼和匯編說起,但那太遙遠(yuǎn)了。我們就從面向過程的
          語言說起吧(包括Basic\C\Fortran\Pascal)。這種面向過程的高級(jí)語言終于把計(jì)
          算機(jī)帶入了尋常的應(yīng)用領(lǐng)域。其中的C語言因?yàn)樗暮?jiǎn)單和靈活造就了Unix和
          Windows這樣的偉大的軟件。面向?qū)ο蟮恼Z言是計(jì)算機(jī)語言的一個(gè)合乎邏輯的進(jìn)
          化,因?yàn)樵跊]有過多的影響效率、簡(jiǎn)單性的前提下提供了一種更好的組織數(shù)據(jù)的方
          法,可以程序更容易理解,更容易管理——這一點(diǎn)可能會(huì)引出不同意見,但事實(shí)勝于
          雄辯,C++終于讓C語言的領(lǐng)地越來越小,當(dāng)今還活著的計(jì)算機(jī)語言或多或少的都具
          備面向?qū)ο蟮奶卣鳎赃@一點(diǎn)并不會(huì)引起太多困惑。C++的成功很大程度要?dú)w因
          于C,C++成為它今天的樣子是合乎邏輯的產(chǎn)物。因?yàn)樵诿嫦蜻^程的時(shí)代,C幾乎已
          經(jīng)統(tǒng)一天下了。今天著名的語言象Java\C#都從C借鑒了很多東西,C#本來的意思就
          是C++++。
          其實(shí)C++曾經(jīng)很有理由統(tǒng)一面向?qū)ο蟪绦蛟O(shè)計(jì)語言的天下來著,但可惜的是,C++
          太復(fù)雜了。即使是一個(gè)熟練的程序員,要你很清楚的解釋一些問題你也會(huì)很頭痛。
          舉幾個(gè)還不是那么復(fù)雜的例子來說:
          對(duì)=的重載\成員轉(zhuǎn)換函數(shù)\拷貝構(gòu)造函數(shù)\轉(zhuǎn)化構(gòu)造函數(shù)之間有什么區(qū)別和聯(lián)系呢?
          這樣定義一個(gè)類成員函數(shù)private: virtual void MemFun() = 0; 是什么意義呢?
          int (*(*x(int))[4])(double); 是什么意思?
          還有其他的特征,比如說可以用來制造一種新語言的typedef和宏(雖然宏不是C+
          +的一部分,但它與C++的關(guān)系實(shí)在太密切了),讓你一不小心就摔跤的內(nèi)存問題
          (只要new 和delete就可以了嗎?有沒有考慮一個(gè)對(duì)象存放在容器中的情況?)……
          諸如此類,C++是如此的復(fù)雜以至于要學(xué)會(huì)它就需要很長(zhǎng)的時(shí)間,而且你會(huì)發(fā)現(xiàn)即
          使你用C++已經(jīng)好幾年了,你還會(huì)發(fā)現(xiàn)經(jīng)常有新東西可學(xué)。你想解決一個(gè)應(yīng)用領(lǐng)域
          的問題——比如說從數(shù)據(jù)庫(kù)里面查詢數(shù)據(jù)、更改數(shù)據(jù)那樣的問題,可是你卻需要首先
          為C++頭痛一陣子才可以,是的,你精通C++,你可以很容易的回答我的問題,可是
          你有沒有想過你付出了多大的代價(jià)呢?我不是想過分的譴責(zé)C++,我本人喜歡C++,
          我甚至建議一個(gè)認(rèn)真的開發(fā)普通的應(yīng)用系統(tǒng)的程序員也去學(xué)習(xí)一下C++,C++中的一
          些特性,比如說指針運(yùn)算\模板\STL幾乎讓人愛不釋手,宏可以用幾個(gè)字符代替很
          多代碼,對(duì)系統(tǒng)級(jí)的程序員來說,C++的地位是不可替代的,Java的虛擬機(jī)就是C++
          寫的。C++還將繼續(xù)存在而且有旺盛的生命力。


          2.1.2 Java和C#
          Java和C#相對(duì)于C++的不同最大的有兩點(diǎn):第一點(diǎn)是他們運(yùn)行在一個(gè)虛擬環(huán)境之
          中,第二點(diǎn)是語法簡(jiǎn)單。對(duì)于開發(fā)人員而言,在語法和語言機(jī)制的角度可以把Java
          和C#視為同一種語言。C#更多的是個(gè)政治的產(chǎn)物而不是技術(shù)產(chǎn)物。如果不是Sun為
          難微軟的話,我想微軟不會(huì)費(fèi)盡心力推出一個(gè)和Java差不多的C++++,記得Visual
          J++嗎,記得WFC嗎?看看那些東西就會(huì)知道微軟為Java曾經(jīng)傾注了多少心血。而且
          從更廣泛的角度來說,兩者也是非常相似的——C#和Java面對(duì)的是同樣的問題,面向
          應(yīng)用領(lǐng)域的問題:事務(wù)處理、遠(yuǎn)程訪問、Web service、Web頁(yè)面發(fā)布、圖形界面。
          那么在這一段中,我暫且用Java這個(gè)名字指代Java和C#兩種語言——盡管兩者在細(xì)節(jié)
          上確實(shí)有區(qū)別。
          Java是適合解決應(yīng)用領(lǐng)域的問題的語言。最大的原因Java對(duì)于使用者來說非常簡(jiǎn)
          單。想想你學(xué)會(huì)并且能夠使用Java需要多長(zhǎng)時(shí)間,學(xué)會(huì)并且能夠使用C++要多長(zhǎng)時(shí)
          間。由于Java很大程度上屏蔽了內(nèi)存管理問題,而且沒有那么多為了微小的性能提
          升定義的特殊的內(nèi)容(比如說,在Java里面沒有virtual 這個(gè)關(guān)鍵字,Java也不允
          許你直接在棧上創(chuàng)建對(duì)象,Java明確的區(qū)分bool和整型變量),他讓你盡量一致的
          方式操作所有的東西,除了基本數(shù)據(jù)類型,所有的東西都是對(duì)象,你必須通過引用
          來操作他們;除了這些之外,Java還提供了豐富的類庫(kù)幫助你解決應(yīng)用問題——因?yàn)?BR>它是面向應(yīng)用的語言,它為你提供了多線程標(biāo)準(zhǔn)、JDBC標(biāo)準(zhǔn)、GUI標(biāo)準(zhǔn),而這些標(biāo)
          準(zhǔn)在C++中是不存在的,因?yàn)镃++并不是直接面向解決應(yīng)用問題的用戶,有人試圖在
          C++中加入這些內(nèi)容,但并不成功,因?yàn)镃++本身太復(fù)雜了,用這種復(fù)雜的語言來實(shí)
          現(xiàn)這種復(fù)雜的應(yīng)用程序框架本人就是一件艱難的事情,稍后我們會(huì)提到這種嘗試——
          COM技術(shù)。漸漸的,人們不會(huì)再用C++開發(fā)應(yīng)用領(lǐng)域的軟件,象MFC\QT\COM這一類的
          東西最終也將退出歷史舞臺(tái)。

          2.1.3 Delphi
          Delphi是從用C++開發(fā)應(yīng)用系統(tǒng)轉(zhuǎn)向用Java開發(fā)應(yīng)用系統(tǒng)的一個(gè)中間產(chǎn)物。它比C++
          簡(jiǎn)單,簡(jiǎn)單的幾乎象Java一樣,因?yàn)樗暮?jiǎn)單,定義和使用豐富的類庫(kù)成為可能,
          而且Delphi也這么做了,結(jié)果就是VCL和其他的組件庫(kù)。而另一方面,它又比運(yùn)行
          于虛擬環(huán)境的java效率要高一些,這樣在簡(jiǎn)單性和效率的平衡之中,Delphi找到了
          自己的生存空間。而且預(yù)計(jì)在未來的一段時(shí)間之內(nèi),這個(gè)生存空間將仍然是存在
          的。可以明顯的看出,微軟放棄了這個(gè)領(lǐng)域,他專注于兩方面:系統(tǒng)語言C++和未
          來的Java(其實(shí)是.Net)。也許這對(duì)于Borland來說,是一件很幸運(yùn)的事情。如果我
          能夠給Borland提一些建議的話,那就是不要把Delphi弄得越來越復(fù)雜,如果那
          樣,就是把自己的用戶趕到了C++或Java的領(lǐng)地。在虛擬機(jī)沒有最終占領(lǐng)所有的應(yīng)
          用程序開發(fā)領(lǐng)域之前,Delphi和Delphi的用戶仍然會(huì)生存得很好。


          2.2 桌面應(yīng)用程序框架
          目前真正成功的桌面應(yīng)用程序框架只有兩個(gè),一個(gè)是MFC,一個(gè)是VCL,還有一些
          其他的,但事實(shí)上并未進(jìn)入應(yīng)用領(lǐng)域。遺憾的是我對(duì)兩個(gè)桌面應(yīng)用程序框架都不精
          通。但這部不妨礙我對(duì)他做出正確的評(píng)價(jià)。
          2.2.1 MFC
          MFC(還有曾經(jīng)的OWL)是SDK編程的正常演化的結(jié)果,就象是C++是C的演化結(jié)果一
          樣。MFC本身是一件了不起但不那么成功的作品,而且它過時(shí)了。這就是我的結(jié)論。
          MFC凝聚了很多天才的智慧——當(dāng)然,OWL和VCL也一樣,侯捷的《深入淺出MFC》把這些
          智慧擺在了我們的面前。但是這件東西用起來估計(jì)不會(huì)有人覺得很舒服,如果你一
          直在用Java、VB或者Delphi,再回過頭來用MFC,不舒服的感覺會(huì)更加強(qiáng)烈。我不
          能夠解釋MFC為什么沒有能夠最終發(fā)展成和VCL一樣簡(jiǎn)單好用的桌面程序框架,也許
          是微軟沒精力或者沒動(dòng)力,總之MFC就是那個(gè)樣子了,而且也不會(huì)再有發(fā)展,它已
          經(jīng)被拋棄了。我有時(shí)候想,也許基于C++這種復(fù)雜的語言開發(fā)MFC這樣的東西本身就
          是錯(cuò)誤的——可以開發(fā)這樣的一個(gè)框架,但不應(yīng)當(dāng)要求使用它的人熟悉了整個(gè)框架之
          后才能夠使用這個(gè)系統(tǒng),但很顯然,如果你不了解MFC的內(nèi)部機(jī)制,是不太可能把
          它用好的,我不能解釋清楚為什么會(huì)出現(xiàn)這種現(xiàn)象。
          2.2.2 VCL
          相比之下VCL要成功的得多。我相信很多使用VCL的人可能沒有像MFC的用戶研究MFC
          那樣費(fèi)勁的研究過VCL的內(nèi)部機(jī)制。但這不妨礙他們開發(fā)出好用好看的應(yīng)用程序,
          這就足夠了,還有什么好說的呢?VCL給你提供了一種簡(jiǎn)單一致的機(jī)制,讓你可以
          寫出復(fù)雜的應(yīng)用程序。在李維的Borland故事那篇文章中曾經(jīng)說過,在Borland
          C++3.1推出之后Borland就有人提出開發(fā)類似C++ Builder一類的軟件,后來竟未成
          行。是啊,如果C++Builder是在那個(gè)時(shí)候出現(xiàn)的,今天的軟件開發(fā)領(lǐng)域?qū)?huì)是怎么
          樣的世界呢?真的不能想象。
          也許再過一段時(shí)間,這些都將不再重要。因?yàn)樾律恼Z言如Java和C#都提供了類
          似于VCL的桌面應(yīng)用程序框架。那個(gè)時(shí)候,加上Java和C#本身的簡(jiǎn)單性,如果他們
          的速度有足夠塊,連Delphi這種語言也要消失了,還有什么好爭(zhēng)論的呢?只是對(duì)于
          今天的桌面程序開發(fā)人員來說,VCL確實(shí)是最好的選擇。
          2.3企業(yè)應(yīng)用程序框架
          2.3.1 Windows DNA
          Windows DNA的起源無從探究了。隨著.Net的推出,事實(shí)上Windows DNA將成為歷
          史的陳跡。Windows DNA雖然是幾乎所有的企業(yè)應(yīng)用程序開發(fā)人員都知道的一個(gè)名
          詞,但我相信Windows DNA事實(shí)上應(yīng)用的最廣泛的是ASP而不是COM+。真正的COM開
          發(fā)有多少人真正的掌握了呢,更不要提COM+(我有必要解釋一下:COM+是COM的執(zhí)行
          環(huán)境,它提供了一系列如事務(wù)處理、安全等基礎(chǔ)服務(wù),讓應(yīng)用程序開發(fā)人員盡量少
          在基礎(chǔ)架構(gòu)設(shè)計(jì)上花精力)——當(dāng)然我這里指的COM開發(fā)不是指VB下的COM開發(fā),所以
          要這么說,是因?yàn)槲矣X得如果不能理解用C++進(jìn)行COM開發(fā),也就不能真正的理解
          COM技術(shù)。如果以一種技術(shù)沒有被廣泛理解和應(yīng)用作為失敗的標(biāo)志,那么Windows
          DNA實(shí)際上是失敗了,但這不是它本身的錯(cuò),而是基于C++的COM技術(shù)的失敗造成
          的。多層應(yīng)用、系統(tǒng)開發(fā)角色分離的概念依然沒有過時(shí)。
          2.3.2 J2EE
          J2EE是第一套成功的企業(yè)應(yīng)用程序開發(fā)框架。因?yàn)樗咽聞?wù)處理、遠(yuǎn)程訪問、安全
          這些概念帶入了尋常百姓家。這種成功我認(rèn)為要?dú)w因于Java的簡(jiǎn)單性。Java的簡(jiǎn)
          單,對(duì)于J2EE容器供應(yīng)商來說一樣重要。開發(fā)一個(gè)基于Java的應(yīng)用服務(wù)器要比基于
          C++的更容易。而且由于Java的簡(jiǎn)單性,應(yīng)用系統(tǒng)開發(fā)者出錯(cuò)的機(jī)會(huì)也會(huì)少一些,
          不會(huì)像C++的開發(fā)者那樣受到那么多挫折。開發(fā)基于Java的企業(yè)應(yīng)用系統(tǒng)的周期會(huì)
          更短,這恐怕是不容爭(zhēng)辯的事實(shí)。不論如何,是J2EE讓事務(wù)處理、遠(yuǎn)程訪問、安全
          這些原來幾乎都是用在金融系統(tǒng)中的概念也被一般的企業(yè)用戶使用并從中獲得利益。
          2.3.3 .NET
          .Net有什么好說的呢?其實(shí),它不過是微軟的J2EE。事務(wù)處理、安全、遠(yuǎn)程訪
          問,這些概念在.Net中都找得到。更有力的說明是,微軟也利用了.Net實(shí)現(xiàn)了一個(gè)
          Pet Store。所以,.Net與J2EE幾乎是可以完全對(duì)等的。但微軟確實(shí)是一家值得尊
          敬的公司——我指從技術(shù)上,象Web form這種東西,我相信很多Web應(yīng)用開發(fā)者都?jí)?BR>想過甚至自己實(shí)現(xiàn)過,但Sun卻一直無動(dòng)于衷,而且似乎Borland也沒有為此作過太
          多努力,好像有過類似的東西,但肯定是不怎么成功——Borland已經(jīng)很讓人敬佩
          了,我們也許無法要求太多。
          2.4 COM技術(shù)
          COM應(yīng)當(dāng)是個(gè)更廣泛的詞匯,其實(shí)我覺得AxtiveX、OLE、Automation、COM+都應(yīng)當(dāng)
          提及,因?yàn)槿绻悴焕斫釩OM,上面的東西你是無法理解的。而且,我只是想說明
          COM是一種即將消亡的技術(shù),僅僅說說COM的復(fù)雜性和他的問題就夠了,所以不會(huì)提
          及那些東西。
          為什么會(huì)出現(xiàn)COM技術(shù)?COM的根本目標(biāo)是實(shí)現(xiàn)代碼的對(duì)象化的二進(jìn)制重用,進(jìn)而實(shí)
          現(xiàn)軟件的組件化、軟件開發(fā)工作的分工。這要求他做到兩點(diǎn):第一,能夠跨越不同
          的語言,第二,要跨越同一種語言的不同編譯器。COM技術(shù)為這個(gè)目標(biāo)付出了沉重
          的代價(jià),尤其是為了跨越不同的編譯器,以至于無論對(duì)于使用者而言還是開發(fā)者而
          言,他都是一個(gè)痛苦的技術(shù)。但幸運(yùn)的事,這一切終歸要結(jié)束了。
          讓我們從這個(gè)目的出發(fā)看看COM為什么會(huì)成為它現(xiàn)在的樣子。
          其實(shí)COM不是什么新玩意,最初的DLL就是重用二進(jìn)制代碼的技術(shù)。DLL在C的年代可
          能還不錯(cuò),但到了C++的年代就不行了。原因在于如果你在.h文件中改變了類定義
          (增加或者減少了成員變量),代碼庫(kù)用戶的代碼必須重新編譯才可以,否則用戶
          的代碼會(huì)按你的舊類的結(jié)構(gòu)為你的新類分配內(nèi)存,這將產(chǎn)生什么后果可想而知。這
          就是為什么通過接口繼承和通過接口操作對(duì)象成為COM的強(qiáng)制規(guī)范的原因,能夠通
          過對(duì)象的方式組織代碼是COM的重要努力。
          那么著名的IUnknown 接口又是怎么回事呢?這是為了讓使用不同編譯器的C++開發(fā)
          人員能夠共享勞動(dòng)成果。首先看QueryInterface,因?yàn)镃OM是基于接口的,那么一
          個(gè)類可能實(shí)現(xiàn)了幾個(gè)接口,而對(duì)于用戶來說,你又只能通過操作接口來操作類,這
          樣你必須把類造型成某個(gè)特定的接口,使用Dynamic_cast嗎?不行,因?yàn)檫@是編譯
          器相關(guān)的,那么,就只好把它放在類的實(shí)現(xiàn)代碼中了,這就是QueryInterface的由
          來。至于AddRef和Release,他們產(chǎn)生的第一個(gè)原因是delete這個(gè)操作要求一個(gè)類
          具有虛析構(gòu)函數(shù)(否則的話,他的父類的析構(gòu)函數(shù)將不會(huì)被調(diào)用),但不幸的是不
          同的編譯器中虛析構(gòu)函數(shù)在vtbl中的位置并不相同,這就是說你不能讓用戶直接調(diào)
          用delete,那么你的COM對(duì)象必須提供自己刪除自己的方法;另外的原因在于一個(gè)
          COM對(duì)象可能作為幾個(gè)接口在被用戶同時(shí)使用,如果用戶粗暴的刪掉了某個(gè)接口,
          那么其他的接口也就不能用了,這樣,只好要求用戶在想用一個(gè)接口的時(shí)候通過
          AddRef通知COM對(duì)象“我要使用你了,你多了一個(gè)用戶”,而在不用之后要調(diào)用
          Release告訴COM對(duì)象“我不用你了,你少了一個(gè)用戶”,如果COM對(duì)象發(fā)現(xiàn)自己沒有
          用戶了,它就把自己刪掉。
          再看看詭異的HRESULT,這是跨語言和跨編譯器的代價(jià)。其實(shí),異常處理是物競(jìng)天
          擇的結(jié)果——連一直用效率作標(biāo)榜的C++都肯犧牲效率來實(shí)現(xiàn)這個(gè)try-catch,可見它
          的意義,但COM為了照顧那些低級(jí)的語言居然拋棄了這個(gè)特征——產(chǎn)生的結(jié)果就是
          HRESULT。我們可以看看他是多么愚蠢的東西。首先,我們要通過一個(gè)整數(shù)來傳遞
          錯(cuò)誤信息,通過IErrorInfo來查找真正的錯(cuò)誤描述,本來在現(xiàn)代語言中一個(gè)try-
          catch可以解決的問題,現(xiàn)在我們卻需要讓用戶和開發(fā)者都走很多路才能解決,你
          怎么評(píng)價(jià)這個(gè)結(jié)果?其次,由于這個(gè)返回計(jì)算結(jié)果的位置被占用了,我們不得不用
          怪異的out參數(shù)來返回結(jié)果。想想一個(gè)簡(jiǎn)單的 int add(int op1,int op2)在COM中
          竟然要變成HRESULT add(int op1,int op2,int *result),我不知道你對(duì)此作何感
          想。而且由于COM的方法無法返回一個(gè)對(duì)象而只能返回一個(gè)指針,為了完成一個(gè)簡(jiǎn)
          單的std::string GetName()這一類的操作,你要費(fèi)多少周折——你需要先分配一塊
          內(nèi)存空間,然后在COM實(shí)現(xiàn)中把一個(gè)字符串拷貝到這個(gè)空間,用完了你要?jiǎng)h掉這個(gè)
          空間,不知道你是否覺得這種工作很幸福,反正我覺得很痛苦。
          還有COM為了照顧那些解釋性的語言,又加入了Automation技術(shù),你有沒有為此覺
          得痛苦?本來一個(gè)簡(jiǎn)單的方法調(diào)用,現(xiàn)在卻需要傳給你一個(gè)標(biāo)志變量,然后讓你根
          據(jù)這個(gè)標(biāo)志變量去執(zhí)行相應(yīng)的操作。(這一點(diǎn)我現(xiàn)在仍然不明白,為什么解釋性的
          語言需要通過這個(gè)方式來執(zhí)行一個(gè)方法)。
          “我受夠了,我覺得頭痛”,你會(huì)說,是啊,我想所有的人都受夠了,所有這些因素
          實(shí)際上是把COM技術(shù)變成了一頭讓人無法駕馭的怪獸。人對(duì)復(fù)雜事物的掌控能力終
          究是有限的,C++本身已經(jīng)夠復(fù)雜了, COM的復(fù)雜性已經(jīng)超出了我們大部分人的控
          制能力,你需要忍受種種痛苦得到的東西與你付出的代價(jià)相比是不是太不值得了?
          我們學(xué)習(xí)是為了解決問題,而現(xiàn)在我們卻需要為了學(xué)習(xí)這件事情本身耗費(fèi)太多的精
          力。這些痛苦的東西太多了,我在這里說到的,其實(shí)只是一小部分而已。計(jì)算機(jī)技
          術(shù)是為人類服務(wù)的,而不是少數(shù)人的游戲(我想COM技術(shù)可能是他的設(shè)計(jì)者和一部
          分技術(shù)作者的游戲),難道我們?cè)敢獬蔀橛?jì)算機(jī)的奴隸嗎?通過一種過于復(fù)雜的技
          術(shù)拋棄所有的人其實(shí)等于被所有的人拋棄,這么多年中選擇J2EE的人我相信不乏高
          手,你是不是因?yàn)镃OM的過于復(fù)雜才選擇J2EE的?因?yàn)樗梢杂煤?jiǎn)單的途徑實(shí)現(xiàn)差
          不多的目標(biāo)——軟件的“二進(jìn)制”重用、組件化、專業(yè)分工(容器開發(fā)商和應(yīng)用開發(fā)商
          的分工)。事實(shí)上,你是被微軟所拋棄的,同時(shí),你也拋棄了微軟。
          現(xiàn)在讓我們回來吧,我把你帶進(jìn)了COM的迷宮,現(xiàn)在讓我把你領(lǐng)回來。再讓我們看
          看COM到底想實(shí)現(xiàn)什么目標(biāo),其實(shí)很簡(jiǎn)單,不過是代碼的二進(jìn)制重用,也就是說你
          不必給別人源代碼,而且你的組件可以象計(jì)算機(jī)硬件那樣“即插即用”。我們回過頭
          來看看Java,其實(shí),這種二進(jìn)制重用的困難是C++所帶來的(這不是C++本身的錯(cuò),
          而是靜態(tài)編譯的錯(cuò)),當(dāng)Java出現(xiàn)的時(shí)候,很多問題已經(jīng)不存在了。你不需要一個(gè)
          頭文件,因?yàn)镴ava的字節(jié)碼是自解釋的,它說明了自己是什么樣子的,可以做什么
          事情,不像C++那樣需要一個(gè)頭文件來解釋這些事情;也不需要事先了解對(duì)象的內(nèi)
          存結(jié)構(gòu),因?yàn)閮?nèi)存是在運(yùn)行的時(shí)候才分配的。
          如果我們現(xiàn)在再回過頭來解決COM要解決的問題,你會(huì)怎么做呢?首先你會(huì)不再選
          擇C++這種語言來實(shí)現(xiàn)代碼的“二進(jìn)制”重用,其次,你會(huì)把所有的語言編譯成同樣
          的“二進(jìn)制” 代碼(實(shí)際上,應(yīng)當(dāng)說是字節(jié)碼),這顯然是更聰明的做法,從前COM
          試圖在源代碼的級(jí)別抹平二進(jìn)制層次的差異,這實(shí)際上是讓人在做本來應(yīng)當(dāng)由機(jī)器
          做的事情,很愚蠢是嗎?但他們一直做了那么多年,而且把這個(gè)痛苦帶給了整個(gè)計(jì)
          算機(jī)世界——因?yàn)樗麄冋莆罩聦?shí)的標(biāo)準(zhǔn),為了用戶,為了利潤(rùn),為了能夠在
          Windows上運(yùn)行,盡管你知道你在做著一個(gè)很不聰明的事情,但你還是做了。
          COM技術(shù)為了照顧VB這個(gè)小兄弟和實(shí)現(xiàn)統(tǒng)一二進(jìn)制世界的野心,實(shí)在浪費(fèi)了太多的
          精力。首先,落后的東西的消亡是必然的,就象C、Pascal在應(yīng)用領(lǐng)域的消亡一
          樣,Basic一點(diǎn)一點(diǎn)的改良運(yùn)動(dòng)是不符合歷史潮流的做法,先進(jìn)的東西和落后的東
          西在一起,要么先進(jìn)的東西被落后的東西拖住后腿,要么是同化落后的東西,顯然
          我們更愿意看見后者,現(xiàn)在Basic終于被現(xiàn)代的計(jì)算機(jī)語言同化了。其次,統(tǒng)一二
          進(jìn)制世界好像不是那么簡(jiǎn)單的事情,而且也沒什么必要,微軟的COM技術(shù)奮戰(zhàn)了10
          年,現(xiàn)在也只有他自己和Borland支持,.Net終于放棄了這個(gè)野心。這一切終于要
          結(jié)束了。過去J2EE高歌猛進(jìn)地占領(lǐng)著應(yīng)用開發(fā)的領(lǐng)地,COM在這種進(jìn)攻面前多少顯
          得蒼白無力。現(xiàn)在微軟終于也有了可以和J2EE一較長(zhǎng)短的.NET,對(duì)于開發(fā)人員來
          講,基于字節(jié)碼的組件的二進(jìn)制重用現(xiàn)在是天經(jīng)地義的事情;你不用再為了能夠以
          類方式發(fā)布組件做那么多亂七八糟的事情,因?yàn)楝F(xiàn)在所有的東西本來就是類了;實(shí)
          現(xiàn)軟件開發(fā)的分工也很自然,你是專業(yè)人員,就用C#吧,你是應(yīng)用開發(fā)人員,你喜
          歡用VB.Net,你就用吧,反正你們寫的東西最終都被翻譯成了一樣的語言(其實(shí)我
          覺得這一點(diǎn)意義不大,因?yàn)橐恍┎荒敲春糜玫恼Z言被淘汰是正常的事情,C風(fēng)格成
          為程序設(shè)計(jì)語言的主流風(fēng)格,肯定是有它的原因的,語言的統(tǒng)一其實(shí)是大勢(shì)所趨,
          就象中國(guó)人民都要說普通話一樣,所以我覺得Java不支持多語言算不上缺點(diǎn)——本來
          就是一種很好看很好用的語言了,為什么要把簡(jiǎn)單問題復(fù)雜化呢?)。
          COM不會(huì)在短期內(nèi)死去,因?yàn)槲夜烙?jì)微軟還不會(huì)馬上用C#開發(fā)Office和Windows的圖
          形界面部分,但我相信COM技術(shù)退出歷史舞臺(tái)的日子已經(jīng)不遠(yuǎn)了,作為一般的開發(fā)
          人員,忘了這段不愉快的歷史吧——你將不會(huì)在你的世界里直接和COM打交道。
          若干年以后,我想COM也許會(huì)成為一場(chǎng)笑話,用來諷刺那種野心過大、鉆牛角尖的
          愚蠢的聰明人。

          結(jié)論

          說了很多,應(yīng)該是有個(gè)結(jié)論的時(shí)候了。我似乎做了一件冒天下之大不韙的事情,
          因?yàn)槲以u(píng)價(jià)了主流技術(shù),還要試圖進(jìn)行比較,好像某個(gè)名人說過:“C++Builder也
          好,Visual C++也好,能在市場(chǎng)上立足,肯定都是有自己的過人之處的,而且一個(gè)
          人精通數(shù)種開發(fā)語言、數(shù)種開發(fā)工具是不可能的事情”,言下之意就是說你不要對(duì)
          這些東西妄加評(píng)論,但怎么可以不評(píng)論?好像高手都不屑于說哪種語言好、哪種語
          言壞,我不知道什么時(shí)候形成了這種風(fēng)氣。簡(jiǎn)單地說C++比Java好或者Java比C++好
          顯然是愚蠢的行為,但如果讓你用Java寫驅(qū)動(dòng)程序,用C++開發(fā)一個(gè)MIS系統(tǒng)是不是
          愚蠢的行為呢?顯然更愚蠢。我想,作為一個(gè)獨(dú)立的能思考的人,外界的東西對(duì)你
          而言總是有好有壞,而且你的生命有限,你還要享受你的生活,所以你必須做出選
          擇。所以,起碼評(píng)價(jià)這些東西對(duì)我自己而言是正確的——只要我有能力評(píng)價(jià),那我就
          說出我的評(píng)價(jià)吧。

          對(duì)于計(jì)算機(jī)語言來說,未來真正重要的語言只有三種C++、Java和C#。
          C++將更適合于專業(yè)的計(jì)算機(jī)公司編寫圖形界面系統(tǒng)(比如KDE)、虛擬機(jī)(比如
          Java虛擬機(jī)或者.Net運(yùn)行環(huán)境)、殺毒軟件或者其他的盒裝軟件(比如說
          Photoshop、Dream weaver)這一類的東西。而且C++適合程序員做學(xué)習(xí)之用,能對(duì)
          C++有一定理解的程序員往往也應(yīng)該能更深刻的理解Java、C#,這有助于編寫更好
          的軟件。
          如果是開發(fā)為客戶定制的應(yīng)用系統(tǒng)Java、C#是更好的選擇。包括桌面應(yīng)用和Web應(yīng)
          用。至于其他的語言比如VB.Net其實(shí)并沒有太大的意義。
          Delphi在未來一段時(shí)間將繼續(xù)存在,而且活得不錯(cuò)。最重要的原因在于,第一它有
          一套豐富的組件庫(kù),第二它效率相對(duì)算高的,第三它簡(jiǎn)單。如果虛擬機(jī)的執(zhí)行效率
          趕不上Delphi,它就有存在的理由,但從過去的Visual J++來看,微軟的虛擬機(jī)做
          得確實(shí)可以很好,加上.Net的組件庫(kù)和C#的簡(jiǎn)單性并不差,所以從長(zhǎng)遠(yuǎn)來看Delphi
          可能不那么樂觀。
          其實(shí)上面的比較也包含了桌面應(yīng)用程序框架的比較。在現(xiàn)在來說VCL無疑最好的,
          MFC已經(jīng)退出歷史舞臺(tái)。.Net中所帶的桌面應(yīng)用程序框架將最終統(tǒng)一桌面應(yīng)用領(lǐng)域
          (但不包括微軟和Borland這樣的專業(yè)公司,因?yàn)樗麄円鞒鲎詈糜枚倚首罡?BR>的軟件)。至于Java中所帶的桌面應(yīng)用程序框架,實(shí)在讓人哭笑不得。這個(gè)結(jié)論的
          變數(shù)是.Net運(yùn)行環(huán)境的執(zhí)行效率。如果.Net中的虛擬機(jī)象Java的一樣,那微軟就倒
          霉了,它等于放棄了桌面應(yīng)用開發(fā)工具領(lǐng)域,但根據(jù)微軟在Visual J++上的成就和
          他推廣.Net的背水一戰(zhàn)的駕式,.Net在桌面領(lǐng)域失敗的可能性不大(但不是沒有,
          起碼基于COM的技術(shù)在企業(yè)應(yīng)用領(lǐng)域幾乎可以說是全軍覆沒)。
          在企業(yè)應(yīng)用程序框架領(lǐng)域,最終只有J2EE和.Net可以決一雌雄。我沒有提到
          CORBA,它也可以算是企業(yè)應(yīng)用程序框架,但他的聲勢(shì)和J2EE或者.NET實(shí)在不能同
          日而語,而且最重要的是只有Borland一家大公司支持它(SUN、IBM、BEA、
          Borland支持J2EE,微軟就不用說了),所以就不詳細(xì)說他了。
          那么最終誰會(huì)贏呢?我想微軟贏的可能性大一些。這樣說可能讓很多人不快,而且
          IBM的厲害也是有目共睹的。但這并不是純技術(shù)問題,就象Windows NT蠶食Unix的
          領(lǐng)土那樣,那時(shí)候微軟也是孤軍作戰(zhàn)。J2EE的問題在于第一:混亂,第二,價(jià)高。
          我相信很多人都對(duì)這兩點(diǎn)有過不快的經(jīng)歷。你知道寫給Weblogic的應(yīng)用程序不是很
          順利地就可以移植到Websphere上的,反過來也一樣。但.Net就不一樣了,那是微
          軟一個(gè)人的作品,根本不存在移植的問題。如果J2EE陣營(yíng)不想敗在這一點(diǎn)上,有三
          個(gè)辦法,第一種就是通過制定統(tǒng)一的標(biāo)準(zhǔn)徹底消滅移植問題,第二種是開發(fā)一種好
          用的部署工具(不能象JBuilder那么大、那么慢:),屏蔽不同的應(yīng)用程序容器之
          間的區(qū)別,第三種,也是最不可能的,就是J2EE陣營(yíng)有人能夠一統(tǒng)天下。顯然,這
          三種解決辦法都不太現(xiàn)實(shí)。
          第二點(diǎn)價(jià)高,這是SUN、IBM、BEA、ORACLE傳統(tǒng),也是它們一直讓微軟的進(jìn)攻屢屢
          得手的軟肋。我一直不太能明白他們的西就為什么那么貴。這樣想一想:微軟的
          .Net SDK白送給你,BEA的Weblogic一個(gè)CPU的License兩萬,如果你兩種技術(shù)都
          會(huì),如果你給客戶的系統(tǒng)報(bào)價(jià)一樣,你選哪種開發(fā)技術(shù)?這一點(diǎn)實(shí)在讓人覺得無可
          奈何。J2EE有的東西,.Net也有(除了不能跨平臺(tái)),技術(shù)上的細(xì)微差別在巨大的
          價(jià)格差異面前還有什么意義呢?
          當(dāng)然,SUM、IBM這些大公司也不是等閑之輩。就象Windows NT沒有消滅Unix一樣,
          J2EE應(yīng)當(dāng)會(huì)像Windows NT和Unix的共存一樣和.Net共存,只是我想.Net恐怕會(huì)占上
          風(fēng)。
          閑話
          說完了該說的技術(shù)問題,說說閑話吧。有的話放在心里覺得不說出來不舒服,且讓
          我一吐為快:)
          給入門程序員的建議
          不知道我在學(xué)計(jì)算機(jī)的時(shí)候是不是走了彎路。但我想如果讓我重新開始學(xué)寫程序
          的話,我會(huì)采用一些不同的辦法。如果你也正在想成為一個(gè)程序員,這些也許會(huì)對(duì)
          你有幫助。
          我覺得可能大概要分幾個(gè)階段,第一個(gè)階段應(yīng)該是找一門簡(jiǎn)單的語言入門,比如
          Java或者C#都應(yīng)該比較合適,選一本簡(jiǎn)單的帶例子的書(最好不要太厚),按部就
          班的把書學(xué)完。這時(shí)候可能還有些懵懵懂懂,但沒關(guān)系,可以開始做個(gè)小小的軟件
          了,重要的事你要自己用那種語言的方式想思考,如果有項(xiàng)目做,當(dāng)然更好。之
          后,你會(huì)覺得有點(diǎn)感覺了。如果你象我一樣不是科班出身的,接下來應(yīng)當(dāng)補(bǔ)習(xí)一下
          計(jì)算機(jī)專業(yè)的課程,我覺得最重要的是數(shù)據(jù)結(jié)構(gòu)——那些東西你可能永遠(yuǎn)都不會(huì)自己
          做,C++中有漂亮的STL,Java中也為你實(shí)現(xiàn)了大部分東西,但我覺得真的有必要學(xué)
          習(xí)那些內(nèi)容,這會(huì)加強(qiáng)你用計(jì)算機(jī)語言思考問題的能力。在進(jìn)一步,如果你的入門
          語言不是C++,那你可以補(bǔ)習(xí)一下C++,盡管你可能永遠(yuǎn)都不會(huì)用C++開發(fā)程序。C++
          在現(xiàn)在的計(jì)算機(jī)世界就象是普通話一樣,而且它能讓你很容易的理解其他語言中難
          以理解的問題。
          學(xué)完了C++,那你應(yīng)當(dāng)就已經(jīng)不是一個(gè)初級(jí)程序員了,歡迎你進(jìn)入計(jì)算機(jī)軟件開發(fā)
          的世界。

          印度的軟件業(yè)
          我記得好像在CSDN上看見過一篇文章,極力的鼓吹印度的軟件業(yè)。而且我記得他
          好像說過一句很刻薄的話“我們公司那些B大的和T大的,一個(gè)一個(gè)特別牛,牛得看
          不見人……做起界面極盡奇跡淫巧之能事……”,諸如此類,總之認(rèn)為程序員只有象印
          度的高中生那樣乖乖的、懂得UML、會(huì)看Function Specification才算是真正的程
          序員。我當(dāng)時(shí)覺得很不舒服。我想這個(gè)人應(yīng)該不是B或T大的——哦,別誤會(huì),我也不
          是——但我覺得好像B大的T大的人沒象他說的那樣。而且我不明白為什么中國(guó)的軟件
          業(yè)為什么一定要向印度看齊?作為一家公司,你想獲取商業(yè)利潤(rùn),學(xué)習(xí)印度無可厚
          非,你大可以找一大堆高中生培訓(xùn)成編程藍(lán)領(lǐng)(我沒有輕視高中生的意思,我相信
          有很多“高中生”在技術(shù)領(lǐng)域取得的成就是讓我望塵莫及的),但你不應(yīng)該因此就把
          有血有肉有個(gè)性的程序員扁得一錢不值。說實(shí)話,所謂的編程藍(lán)領(lǐng)不過是工廠里面
          的裝配工,如果有一天工廠里面換了自動(dòng)化的設(shè)備,這些人就全成了廢人!而你要
          知道并不是這些裝配工發(fā)明了自動(dòng)化機(jī)器。我想這種話用不著多說,子曰“過猶不
          及”,你可以喜歡變成藍(lán)領(lǐng),但不要把問題推向極端,把問題推向極端往往就會(huì)犯
          錯(cuò)誤。我們中國(guó)可以在某種程度上學(xué)習(xí)印度,但好像我們更應(yīng)該學(xué)習(xí)美國(guó)——只是我
          們現(xiàn)在沒那么富裕——可是微軟也不是從一開始就是這樣一個(gè)偉大的帝國(guó)的,IBM也
          一樣。



          附錄
          參考書目
          閱讀如下圖書有助于理解本文內(nèi)容。而且這些書都是好書,值得一讀。
          * 《標(biāo)準(zhǔn)C++寶典》
          * 《C++編程思想》
          * 《深入淺出MFC2e》
          * 《COM技術(shù)內(nèi)幕》
          * 《COM本質(zhì)論》
          * 《Java編程思想》
          * 《精通EJB》第二版
          * 《J2EE編程指南》
          * 《Delphi 6開發(fā)人員指南》
          * 《C#寶典》
          * 《微軟 .Net戰(zhàn)略》
          posted on 2005-09-15 12:58 Sung 閱讀(394) 評(píng)論(0)  編輯  收藏 所屬分類: software Development
          主站蜘蛛池模板: 兰州市| 永修县| 桦甸市| 清原| 公安县| 镇康县| 拜城县| 娄烦县| 轮台县| 曲沃县| 台北市| 弥渡县| 宁南县| 固始县| 多伦县| 武定县| 长宁区| 离岛区| 嵊泗县| 齐齐哈尔市| 潜山县| 青川县| 牙克石市| 浦县| 北辰区| 浦城县| 修文县| 广灵县| 平遥县| 宁乡县| 彭州市| 正宁县| 四子王旗| 鄱阳县| 淮阳县| 青州市| 桐柏县| 竹溪县| 抚顺市| 沧州市| 玉屏|