非官方觀點(diǎn) java vs .net 
本文作者:王森 
臺(tái)灣交通大學(xué)科技管理研究所 
[email protected] 
  
前言:   
    最近這半年的講師生涯之中,遇到不少從vb轉(zhuǎn)到j(luò)ava的學(xué)生,絕大大部分的工程師或新進(jìn)軟體開發(fā)領(lǐng)域的朋友都會(huì)問:"我該學(xué).net 還是java ?" "該學(xué)c# 還是java ?"相關(guān)的主題在網(wǎng)路上可謂暗潮洶涌,隨時(shí)可能擦槍走火,在發(fā)表本文之前, 自己把c# spec 深入地讀了一次 ,也大致研讀了.net的相關(guān)技術(shù)文章所以想想在此發(fā)表一心得,沒有什么預(yù)設(shè)立場,請(qǐng)大家多多包含。也感謝洪志鵬先生愿意讓這篇文章藉由java周報(bào)發(fā)表。 
  
本文適用對(duì)象: 
  
    "本文內(nèi)容只適用一般工程師,特殊情況不算!"何謂特殊情況呢?以我個(gè)人為例,明明知道delphi的原生語言是object pascal, 所以要用object pascal才能和delhpi融為一體的感覺.可是,開發(fā)project 的時(shí)候,我就是莫名其妙地喜歡用c++builder.當(dāng)"程式語言基本教義派"或"程式語言民族主義"遇到正常行為的時(shí)候,是怎么說也說不清的。(以上是李敖先生說的話,我只把關(guān)鍵字換了,希望不會(huì)被他告)另外一種特殊情況就是,如果您的思考方式與普通人不同,那么,本文亦不適用於您。  
首先想討論的是架構(gòu)的問題: 
      筆者并沒有深入研究過架構(gòu),也實(shí)在不清楚網(wǎng)路上諸位先賢所謂的架構(gòu)指的是什么.但是我憑一個(gè)工程師的直覺可以篤定,".net就根基架構(gòu)上一定比java的根基架構(gòu)還要好!"因?yàn)?net的推出比java晚了近5年,中間還有j++與wfc的發(fā)展,如果搞了個(gè)比java還鳥的東西,像話嗎?只要sun在這次帝國大反擊之後,沒有被ms弄得節(jié)節(jié)敗退,從此消失於市場,相信它若干年後還會(huì)推出個(gè)比.net還好的東西,然後若干年後ms又搞出一個(gè)更好的東西.事實(shí)上,科技的演進(jìn)就是如此.所以誰強(qiáng)誰不強(qiáng),純粹是歷史必然的結(jié)果.所以沒有什么好爭論的.至於將來誰會(huì)是市場的霸主,就看兩家龍頭太廠誰比較會(huì)行銷,誰比較親近工程師.雖然資訊界過去曾經(jīng)好幾次重復(fù)"好東西被干掉,次級(jí)品占領(lǐng)市場"的歷史.但是仍然沒有人敢斷言。 
其次是壓寶誰的問題: 
  
    sun的標(biāo)語是"網(wǎng)路即電腦",所以在java的策略上,sun假設(shè)這個(gè)世界上充滿異質(zhì)平臺(tái),所以設(shè)計(jì)java 的時(shí)候希望以單一一個(gè)java程式語言為中心,讓它可以在各種平臺(tái)上執(zhí)行.因此jvm要采stack machine的設(shè)計(jì)方式,因?yàn)椴还苣闶钦l,都可以實(shí)作出stack machine.但是這畢竟是一個(gè)不理想的世界,連sun自己solaris都要好幾個(gè)patch才能使用新版的jdk.連borland也花了三年以上的努力才讓 jbuilder可以同時(shí)推出windows , linux , solaris , mac os x 四種版本,可見"write once,run anywhere"的理想真的有其實(shí)際上的難度.borland除了證明sun 的理想是有機(jī)會(huì)實(shí)現(xiàn)的禮運(yùn)大同篇,也證明經(jīng)過精心的架構(gòu)設(shè)計(jì)和最佳化,加上工程師累積了許多經(jīng)驗(yàn)後,仍然可以突破stack machine 先天上速度慢的原罪(雖然還是不理想,需要用很多ram來填補(bǔ)理想).sun把其官方工具jdk搞的很難用,網(wǎng)路上老是有人抱怨它是java developer killer,雖然.net framework sdk一樣難用,可是微軟至少還有visual studio.net如果說微軟的visual studio.net讓工程師感覺像在開benz,那么forte就很像路上隨便一臺(tái)前方貼著benz標(biāo)記的爛公車.所以sun實(shí)在需要多多加強(qiáng).不過這也難怪,ms是純軟體起家,sun是純硬體起家,sun做軟體做不過ms是正常的事情. 
  
    反觀ms,它假設(shè)世界上只有x86的cpu,或者廣泛的說是wintel 平臺(tái),并假設(shè)世界上存在許多會(huì)各種語言的工程師們.因?yàn)橐源思僭O(shè)為策略中心,所以設(shè)計(jì).net的時(shí)候clr可以針對(duì)x86 cpu 作最佳設(shè)計(jì),有些指令甚至可以和op code達(dá)到1 to 1的mapping,所以速度自然跑的快.但是叫他移到sparc或as/400上就麻煩大了..就工程師的角度,自然會(huì)偏向.net,因?yàn)檫x擇很多(喔,這點(diǎn)有待商榷,後面會(huì)提到),但是就3rd party 廠商的利益和老板不想被特定平臺(tái)綁死的觀點(diǎn)來說,會(huì)偏向java。各位想, .net的winform設(shè)計(jì)的那么漂亮,很可能累積了anders離開borland之後的許多好點(diǎn)子,如果.net出來,borland大概真的只剩下ide可以做了.所以最後誰的利益勝出,很可能就會(huì)決定輸贏,因此筆者曰:"你想信耶穌就信耶穌,想信佛教就信佛教,你心中的神自然會(huì)帶領(lǐng)你走向他口中的天堂."喔,對(duì)了,如果兩邊都要壓寶的人當(dāng)然沒問題,但是請(qǐng)一定要小心,不要到時(shí)候上不了其中一個(gè)神所謂的天堂,卻同時(shí)下了兩個(gè)神口中的地獄啊! 
  再來是programming model的問題: 
    記憶中,上一次給我驚艷感覺的時(shí)候是delphi出來的時(shí)候,讓我第一次覺得寫程式是很美好,很簡單的事情,可是自從那次的美好經(jīng)驗(yàn)之後,一直到目前為止,都沒有任何新意讓人有耳目一新的感覺,總讓我覺得軟體的開發(fā)方式是不是已經(jīng)走到一個(gè)瓶頸了呢?anders搞vcl的時(shí)候,borland說它是vb killer, anders 搞.net,ms 當(dāng).net 是java killer,怎么每次anders出現(xiàn)的時(shí)候都會(huì)出現(xiàn)殺手呢? 我建議以後改叫他enders算了,大家覺得如何? 
      總之,元件架構(gòu)不管是vcl, javabean, wfc, .net framework,搞了搞去都是setxxx()與getxxx()那一套,進(jìn)步也只是小邁步,不是大躍進(jìn).以前語言里頭不支援,所以要搞特殊語法,現(xiàn)在搞個(gè)新語言來支援,然後把他標(biāo)準(zhǔn)化罷了.自從jordon退休之後,nba就變得有點(diǎn)不熱鬧了,但我還真希望既anders之後,有新一代的鬼才提出另外讓我們工程師輕松的programming model呀!! 
最後是語言上的問題: 
  
    c#比java復(fù)雜多了,多了很多關(guān)鍵字,讓我覺得很復(fù)雜,先說型態(tài)好了,c#提供value type與reference type,value type還分成simple type ,enum type , struct type,reference type還分成class type , interface type , delegate type , array type.這些型態(tài)如果在配上傳遞參數(shù)時(shí)可以選用純粹的by value ,by reference(ref) , ouput(out) , parameter array感覺上還真是熱鬧哩!!c#之中我們還可以利用unsafe關(guān)鍵字對(duì)指標(biāo)直接做存取.存取權(quán)限修飾字除了固有的public, protected , private之外,也加了internal , protected internal.在多型上,除了以前的virtual之外,也加了override關(guān)鍵字.喔,當(dāng)然有人會(huì)說我何必庸人自擾,但是如果您的汽車有類似霹靂車可以turbo的功能,我想任何有好奇心的人都會(huì)想找機(jī)會(huì)試看看他的極限在哪里,才不管會(huì)不會(huì)粉身碎.java程式語言的功能有限,工程師遇到特定問題通常會(huì)找其他特定的解決方案,這么一來程式在維護(hù)上會(huì)比較容易.但是語言復(fù)雜了,同一件事情有好多種做法,自由度變大了,工程師發(fā)揮的好,就可以突破很多限制,實(shí)現(xiàn)自己夢想.但是維護(hù)上呢? 
  
    君不見有些天才可以用c簡單幾行程式寫出求pi值的程式,但是有多少人看的懂?個(gè)人主義和團(tuán)隊(duì)合作之間是有一些gap存在。語言的簡單與復(fù)雜之間,實(shí)在是個(gè)dilemma.如果程式語言里頭都是宣告,回圈,函式呼叫這三種基本要素,那么要設(shè)計(jì)出很復(fù)雜,功能超強(qiáng)的程式語言都沒問題的,不是嗎?sun大可在java里頭開始引進(jìn)很多c++的功能,可是它沒有,原因何在?c#的復(fù)雜度,如果加上operator和template,那么和c++可有的拼哩! 
  
    每次上java課程時(shí)有好多好多的vb programmer跟我說他無法提升上來,雖然我要負(fù)大部分的責(zé)任,但是我開始懷疑如何把vb programmer提升到.net的層級(jí)呢?我說的vb programmer當(dāng)然不是少數(shù)精通各種語言,用vb只是純粹好玩的工程師,而是指目前臺(tái)灣資訊業(yè)界的許多中堅(jiān)分子和soho族,當(dāng)然,有人會(huì)叫我去用vb.net,cobol.net,問題是,大家有沒有想過為什么c++那么強(qiáng)大,可是還是很多人喜歡用c ?為什么開始有人改用java ?為什么雖然pascal不是主流,可是大家還是喜歡用delphi ? 
  
    現(xiàn)在打出ms的行銷廣告告訴所有工程師一個(gè)訊息:"各種語言的工程師都可以廣納在.net之下."相信去參加過微軟或其他研討會(huì)之後的朋友,除了發(fā)現(xiàn).net很不錯(cuò),很棒,有很多功能是自己過去夢寐以求的功能之外,也發(fā)現(xiàn)他們被ms騙了(有人跟我說他覺得他被ms拋棄了),因?yàn)樗麄儼l(fā)現(xiàn)過去學(xué)的根本沒用,啥米vb.net,要他去學(xué)那種vb,他寧愿去學(xué)c#,反正比起vb.net的語法,c#也沒難到哪里.   
    http://www.vbqa.com/discuss/vb.net/read.asp?id=11 
  
    這個(gè)論壇里頭,christorng先生說的很好:"況且 vb.net與c#的相似度,依我看比vb.net與vb6的相似度還高…^_^" 
  
    任何語言,要能夠在clr上發(fā)揮功能,就必須符合cls的規(guī)范,意思就是說,vb.net不會(huì)因?yàn)樗那懊嬗衯b兩個(gè)字,就可以讓過去用vb的朋友仍然有著絕佳的生產(chǎn)力.如果語法沒有擴(kuò)充,您相信vb.net寫的component可以被c#用嗎?我是指"優(yōu)美的用法",而不是旁門走道繞了一大圈之後的用法.ms在.net framework sdk beta 2里頭,據(jù)說把vb改回來了,雖然不知道修正的幅度多大,那么這個(gè)新生代的vb可以發(fā)揮多少clr的能力呢? 大家就拭目以待羅! 
  
    我只能打個(gè)比喻,同樣的馬力,扭力以及內(nèi)部裝潢,載女朋友的時(shí)候你要用的車子是長的像bmw的樣子? 還是長的像電子花車?用vb用到很精通的情況之下,所以的工程師都會(huì)發(fā)現(xiàn),要打破任督二脈,就必須去了解com,否則永遠(yuǎn)無法突破,這個(gè)在.net里頭一樣適用,要發(fā)揮.net的能力,最後一定往c#走.所以要.net上發(fā)展程式,我絕對(duì)選原生語言c#,不會(huì)用vb.net.因?yàn)?車子也不會(huì)因?yàn)樗L的像飛碟,就可以不用輪子行走呀! 
  
    那么,同樣是交通工具,臺(tái)北車站到天瓏,你會(huì)選飛機(jī)還是計(jì)程車?所以有些事情,在windows平臺(tái)上,java或許做得到,但是做起來很復(fù)雜又不美觀的時(shí)候,我用.net.寫gui程式的時(shí)候我會(huì)選vb或delphi,至少不會(huì)像jbuilder和visual.net一樣,只是個(gè)簡單的gui,改了點(diǎn)property,竟然跑出一大堆讓我不知道從何改起的程式碼.每次看到這些無聊又重復(fù)的程式碼,讓我久久無法言語。 
  
結(jié)語:   
    不管是大陸還是臺(tái)灣的工程師,都存在著"廣義中國人"的劣根性,東西還沒出來,就可以諸多猜測,跟我們電視上那些算命的半仙沒啥兩樣..而且,大家還真喜歡算命耶!難怪我媽看到我在讀the art of computer programming的時(shí)候跟我說,程式設(shè)計(jì)師和巫師沒啥兩樣,只不過他們靠烏龜殼和咒語,而我們靠的是程式語言.我們總是人家在煮米粉,我們?cè)俸盁?一大堆會(huì)寫病毒的高手,一大票善於破解的高手.但是就是做不出世界級(jí)的軟體.當(dāng)然,這也罵到我自己了,但是我真的是對(duì)軟體業(yè)沒啥貢獻(xiàn)就是了。 
  
非官方觀點(diǎn),歡迎大家來信討論. 
[email protected]