明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺(tái)!

看看也好:Java vs .NET 非官方觀點(diǎn)

[摘要]最近這半年的講師生涯之中,遇到不少?gòu)腣B轉(zhuǎn)到Java的學(xué)生,絕大大部分的工程師或新進(jìn)軟件開(kāi)發(fā)領(lǐng)域的朋友都會(huì)問(wèn):"我該學(xué).NET 還是Java ?" "該學(xué)C# 還是Ja...
最近這半年的講師生涯之中,遇到不少?gòu)腣B轉(zhuǎn)到Java的學(xué)生,絕大大部分
的工程師或新進(jìn)軟件開(kāi)發(fā)領(lǐng)域的朋友都會(huì)問(wèn):"我該學(xué).NET 還是Java ?"
"該學(xué)C# 還是Java ?"相關(guān)的主題在網(wǎng)路上可謂暗潮洶涌,隨時(shí)可能擦槍
走火,在發(fā)表本文之前, 自己把C# Spec 深入地讀了一次 ,也大致研讀了
.NET的相關(guān)技術(shù)文章所以想想在此發(fā)表一心得,沒(méi)有什么預(yù)設(shè)立場(chǎng),請(qǐng)大
家多多包含。

本文適用對(duì)象:

"本文內(nèi)容只適用一般工程師,特殊情況不算!"
何謂特殊情況呢?以我個(gè)人為例,明明知道Delphi的原生語(yǔ)言是Object
Pascal, 所以要用Object Pascal才能和Delhpi融為一體的感覺(jué).可是,
開(kāi)發(fā)Project 的時(shí)候,我就是莫名其妙地喜歡用C++Builder.當(dāng)"程式語(yǔ)
言基本教義派"或"程式語(yǔ)言民族主義"遇到正常行為的時(shí)候,是怎么說(shuō)
也說(shuō)不清的。(以上是李敖先生說(shuō)的話,我只把關(guān)鍵字換了,希望不會(huì)被
他告)另外一種特殊情況就是,如果您的思考方式與普通人不同,那么,
本文亦不適用於您。

首先想討論的是架構(gòu)的問(wèn)題:

筆者并沒(méi)有深入研究過(guò)架構(gòu),也實(shí)在不清楚網(wǎng)路上諸位先賢所謂的架
構(gòu)指的是什么.但是我憑一個(gè)工程師的直覺(jué)可以篤定,".NET就根基架
構(gòu)上一定比Java的根基架構(gòu)還要好!"因?yàn)?NET的推出比Java晚了近5
年,中間還有J++與WFC的發(fā)展,如果搞了個(gè)比Java還鳥(niǎo)的東西,像話嗎?
只要Sun在這次帝國(guó)大反擊之後,沒(méi)有被MS弄得節(jié)節(jié)敗退,從此消失於
市場(chǎng),相信它若干年後還會(huì)推出個(gè)比.NET還好的東西,然後若干年後MS
又搞出一個(gè)更好的東西.事實(shí)上,科技的演進(jìn)就是如此.所以誰(shuí)強(qiáng)誰(shuí)不
強(qiáng),純粹是歷史必然的結(jié)果.所以沒(méi)有什么好爭(zhēng)論的.至於將來(lái)誰(shuí)會(huì)是
市場(chǎng)的霸主,就看兩家龍頭太廠誰(shuí)比較會(huì)行銷,誰(shuí)比較親近工程師.雖
然資訊界過(guò)去曾經(jīng)好幾次重復(fù)"好東西被干掉,次級(jí)品占領(lǐng)市場(chǎng)"的歷
史.但是仍然沒(méi)有人敢斷言。

其次是壓寶誰(shuí)的問(wèn)題:

Sun的標(biāo)語(yǔ)是"網(wǎng)路即電腦",所以在Java的策略上,Sun假設(shè)這個(gè)世界
上充滿異質(zhì)平臺(tái),所以設(shè)計(jì)Java 的時(shí)候希望以單一一個(gè)Java程式語(yǔ)
言為中心,讓它可以在各種平臺(tái)上執(zhí)行.因此JVM要采stack machine
的設(shè)計(jì)方式,因?yàn)椴还苣闶钦l(shuí),都可以實(shí)作出stack machine.但是這
畢竟是一個(gè)不理想的世界,連Sun自己Solaris都要好幾個(gè)patch才能
使用新版的JDK.連Borland也花了三年以上的努力才讓 JBuilder可
以同時(shí)推出Windows , Linux , Solaris , Mac OS X 四種版本,可
見(jiàn)"Write once, run anywhere"的理想真的有其實(shí)際上的難度.
Borland除了證明Sun 的理想是有機(jī)會(huì)實(shí)現(xiàn)的禮運(yùn)大同篇,也證明經(jīng)
過(guò)精心的架構(gòu)設(shè)計(jì)和最佳化,加上工程師累積了許多經(jīng)驗(yàn)後,仍然可
以突破stack machine 先天上速度慢的原罪(雖然還是不理想,需要
用很多RAM來(lái)填補(bǔ)理想).Sun把其官方工具JDK搞的很難用,網(wǎng)路上老
是有人抱怨它是Java Developer Killer,雖然.NET Framework SDK
一樣難用,可是微軟至少還有Visual Studio.NET如果說(shuō)微軟的Visual
Studio.NET讓工程師感覺(jué)像在開(kāi)Benz,那么Forte就很像路上隨便一
臺(tái)前方貼著B(niǎo)enz標(biāo)記的爛公車.所以Sun實(shí)在需要多多加強(qiáng).不過(guò)這
也難怪,MS是純軟件起家,Sun是純硬體起家,Sun做軟件做不過(guò)MS是
正常的事情.

反觀MS,它假設(shè)世界上只有x86的CPU,或者廣泛的說(shuō)是Wintel 平臺(tái),
并假設(shè)世界上存在許多會(huì)各種語(yǔ)言的工程師們.因?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)來(lái)說(shuō),會(huì)偏向Java。
各位想, .NET的WinForm設(shè)計(jì)的那么漂亮,很可能累積了Anders離開(kāi)
Borland之後的許多好點(diǎn)子,如果.NET出來(lái),Borland大概真的只剩下
IDE可以做了.所以最後誰(shuí)的利益勝出,很可能就會(huì)決定輸贏,

因此筆者曰:"你想信耶穌就信耶穌,想信佛教就信佛教,你心中的神
自然會(huì)帶領(lǐng)你走向他口中的天堂."喔,對(duì)了,如果兩邊都要壓寶的人
當(dāng)然沒(méi)問(wèn)題,但是請(qǐng)一定要小心,不要到時(shí)候上不了其中一個(gè)神所謂
的天堂,卻同時(shí)下了兩個(gè)神口中的地獄啊!

再來(lái)是Programming Model的問(wèn)題:
記憶中,上一次給我驚艷感覺(jué)的時(shí)候是Delphi出來(lái)的時(shí)候,讓我第一
次覺(jué)得寫程式是很美好,很簡(jiǎn)單的事情,可是自從那次的美好經(jīng)驗(yàn)之
後,一直到目前為止,都沒(méi)有任何新意讓人有耳目一新的感覺(jué),總讓我
覺(jué)得軟件的開(kāi)發(fā)方式是不是已經(jīng)走到一個(gè)瓶頸了呢?Anders搞VCL的
時(shí)候,Borland說(shuō)它是VB Killer, Anders 搞.NET,MS 當(dāng).NET 是Java
Killer,怎么每次Anders出現(xiàn)的時(shí)候都會(huì)出現(xiàn)殺手呢? 我建議以後
改叫他enders算了,大家覺(jué)得如何?

總之,元件架構(gòu)不管是VCL, JavaBean, WFC, .NET Framework,搞了
搞去都是setXXX()與getXXX()那一套,進(jìn)步也只是小邁步,不是大躍
進(jìn).以前語(yǔ)言里頭不支援,所以要搞特殊語(yǔ)法,現(xiàn)在搞個(gè)新語(yǔ)言來(lái)支援,
然後把他標(biāo)準(zhǔn)化罷了.自從Jordon退休之後,NBA就變得有點(diǎn)不熱鬧了,
但我還真希望既Anders之後,有新一代的鬼才提出另外讓我們工程師
輕松的Programming Model呀!!

最後是語(yǔ)言上的問(wèn)題:

C#比Java復(fù)雜多了,多了很多關(guān)鍵字,讓我覺(jué)得很復(fù)雜,先說(shuō)型態(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感覺(jué)上還真是熱鬧哩!!c#之中我們還可以利
用unsafe關(guān)鍵字對(duì)指標(biāo)直接做存取.存取權(quán)限修飾字除了固有的public,
protected , private之外,也加了internal , protected internal.
在多型上,除了以前的virtual之外,也加了override關(guān)鍵字.喔,當(dāng)然有
人會(huì)說(shuō)我何必庸人自擾,但是如果您的汽車有類似霹靂車可以Turbo的功
能,我想任何有好奇心的人都會(huì)想找機(jī)會(huì)試看看他的極限在哪里,才不管
會(huì)不會(huì)粉身碎骨.Java程式語(yǔ)言的功能有限,工程師遇到特定問(wèn)題通常會(huì)
找其他特定的解決方案,這么一來(lái)程式在維護(hù)上會(huì)比較容易.但是語(yǔ)言復(fù)
雜了,同一件事情有好多種做法,自由度變大了,工程師發(fā)揮的好,就可以
突破很多限制,實(shí)現(xiàn)自己夢(mèng)想.但是維護(hù)上呢?

君不見(jiàn)有些天才可以用C簡(jiǎn)單幾行程式寫出求PI值的程式,但是有多少人
看的懂?個(gè)人主義和團(tuán)隊(duì)合作之間是有一些gap存在。語(yǔ)言的簡(jiǎn)單與復(fù)雜
之間,實(shí)在是個(gè)dilemma.如果程式語(yǔ)言里頭都是宣告,回圈,函式呼叫這
三種基本要素,那么要設(shè)計(jì)出很復(fù)雜,功能超強(qiáng)的程式語(yǔ)言都沒(méi)問(wèn)題的,
不是嗎?Sun大可在Java里頭開(kāi)始引進(jìn)很多C++的功能,可是它沒(méi)有,原因
何在?C#的復(fù)雜度,如果加上operator和template,那么和C++可有的拼哩!

每次上Java課程時(shí)有好多好多的VB Programmer跟我說(shuō)他無(wú)法提升上來(lái),
雖然我要負(fù)大部分的責(zé)任,但是我開(kāi)始懷疑如何把VB Programmer提升到
.NET的層級(jí)呢?我說(shuō)的VB Programmer當(dāng)然不是少數(shù)精通各種語(yǔ)言,用VB
只是純粹好玩的工程師,而是指目前臺(tái)灣資訊業(yè)界的許多中堅(jiān)分子和SOHO
族,當(dāng)然,有人會(huì)叫我去用VB.NET, COBOL.NET,問(wèn)題是,大家有沒(méi)有想過(guò)
為什么C++那么強(qiáng)大,可是還是很多人喜歡用C ?為什么開(kāi)始有人改用Java ?
為什么雖然Pascal不是主流,可是大家還是喜歡用Delphi ?

現(xiàn)在打出MS的行銷廣告告訴所有工程師一個(gè)訊息:"各種語(yǔ)言的工程師都
可以廣納在.NET之下."相信去參加過(guò)微軟或其他研討會(huì)之後的朋友,除了
發(fā)現(xiàn).NET很不錯(cuò),很棒,有很多功能是自己過(guò)去夢(mèng)寐以求的功能之外,也發(fā)
現(xiàn)他們被MS騙了(有人跟我說(shuō)他覺(jué)得他被MS拋棄了),因?yàn)樗麄儼l(fā)現(xiàn)過(guò)去學(xué)
的根本沒(méi)用,啥米VB.NET,要他去學(xué)那種VB,他寧愿去學(xué)C#,反正比起VB.NET
的語(yǔ)法,C#也沒(méi)難到哪里.

http://www.vbqa.com/discuss/vb.net/read.asp?id=11

這個(gè)論壇里頭,ChrisTorng先生說(shuō)的很好:
"況且 vb.net與c#的相似度,依我看比vb.net與vb6的相似度還高…^_^"

任何語(yǔ)言,要能夠在CLR上發(fā)揮功能,就必須符合CLS的規(guī)范,意思就是說(shuō),
VB.NET不會(huì)因?yàn)樗那懊嬗蠽B兩個(gè)字,就可以讓過(guò)去用VB的朋友仍然有著
絕佳的生產(chǎn)力.如果語(yǔ)法沒(méi)有擴(kuò)充,您相信VB.NET寫的component可以被C#
用嗎?我是指"優(yōu)美的用法",而不是旁門走道繞了一大圈之後的用法.
MS在.NET Framework SDK beta 2里頭,據(jù)說(shuō)把VB改回來(lái)了,雖然不知道修
正的幅度多大,那么這個(gè)新生代的VB可以發(fā)揮多少CLR的能力呢? 大家就
拭目以待羅!

我只能打個(gè)比喻,同樣的馬力,扭力以及內(nèi)部裝潢,載女朋友的時(shí)候你要用
的車子是長(zhǎng)的像BMW的樣子? 還是長(zhǎng)的像電子花車?用VB用到很精通的情況
之下,所以的工程師都會(huì)發(fā)現(xiàn),要打破任督二脈,就必須去了解COM,否則永
遠(yuǎn)無(wú)法突破,這個(gè)在.NET里頭一樣適用,要發(fā)揮.NET的能力,最後一定往C#走.
所以要在.NET上發(fā)展程式,我絕對(duì)選原生語(yǔ)言C#,不會(huì)用VB.NET.因?yàn)?車子
也不會(huì)因?yàn)樗L(zhǎng)的像飛碟,就可以不用輪子行走呀!

那么,同樣是交通工具,臺(tái)北車站到天瓏,你會(huì)選飛機(jī)還是計(jì)程車?
所以有些事情,在Windows平臺(tái)上,
Java或許做得到,但是做起來(lái)很復(fù)雜又不美觀的時(shí)候,我用.NET.
寫GUI程式的時(shí)候我會(huì)選VB或Delphi,至少不會(huì)像JBuilder和Visual.NET
一樣,只是個(gè)簡(jiǎn)單的GUI,改了點(diǎn)property,竟然跑出一大堆讓我不知道從
何改起的程式碼.每次看到這些無(wú)聊又重復(fù)的程式碼,讓我久久無(wú)法言語(yǔ)。

結(jié)語(yǔ):

不管是大陸還是臺(tái)灣的工程師,都存在著"廣義中國(guó)人"的劣根性,東西還
沒(méi)出來(lái),就可以諸多猜測(cè),跟我們電視上那些算命的半仙沒(méi)啥兩樣..而且
,大家還真喜歡算命耶!難怪我媽看到我在讀The Art of Computer
Programming的時(shí)候跟我說(shuō),程式設(shè)計(jì)師和巫師沒(méi)啥兩樣,只不過(guò)他們靠
烏龜殼和咒語(yǔ),而我們靠的是程式語(yǔ)言.我們總是人家在煮米粉,我們?cè)?br>喊燒,一大堆會(huì)寫病毒的高手,一大票善於破解的高手.但是就是做不出
世界級(jí)的軟件.當(dāng)然,這也罵到我自己了,但是我真的是對(duì)軟件業(yè)沒(méi)啥貢
獻(xiàn)就是了。

非官方觀點(diǎn),歡迎大家來(lái)信討論.
moli.mt88g@nctu.edu.tw