冒號(hào)課堂§6.2:平臺(tái)語(yǔ)言
冒號(hào)課堂
6.2平臺(tái)語(yǔ)言——先搭臺(tái)后唱戲
大巧在所不為,大智在所不慮 ——《荀子·天論篇》
關(guān)鍵詞:平臺(tái)語(yǔ)言, Java,C#,C++
摘要:簡(jiǎn)談Java和C#
!預(yù)覽
· Java的目的是讓一種語(yǔ)言在多種平臺(tái)上運(yùn)行,而C# 的目的是讓多種語(yǔ)言在一種平臺(tái)上運(yùn)行
· 兩個(gè)平臺(tái)語(yǔ)言(Java和C#),一個(gè)重在語(yǔ)言,讓語(yǔ)言向平臺(tái)擴(kuò)散;一個(gè)重在平臺(tái),讓平臺(tái)來(lái)凝聚語(yǔ)言
· C++提供了一馬平川的大路,也提供了陷阱密布的小道;Java則在大路上鋪設(shè)水泥,同時(shí)封鎖了捷徑小道;C#同樣填平了大路上的坑坑洼洼,但把一些小道上“此路不通”的牌子悄悄換成了“此路危險(xiǎn)”
?提問(wèn)
- 在C++的基礎(chǔ)上,Java 與C#作了哪些改進(jìn)?
- Java與C#在設(shè)計(jì)理念上有何不同?
- Java與C#是如何互相借鑒的?
- Java與C#為什么擅長(zhǎng)企業(yè)應(yīng)用開(kāi)發(fā)?它們能作系統(tǒng)開(kāi)發(fā)語(yǔ)言嗎?
:講解
逗號(hào)提出:“現(xiàn)在應(yīng)該到了Java時(shí)間吧。”
冒號(hào)順?biāo)浦郏?#8220;下面談?wù)摰闹匦膹膭偛诺南到y(tǒng)語(yǔ)言轉(zhuǎn)到平臺(tái)語(yǔ)言——Java和C#。”
問(wèn)號(hào)聽(tīng)得一頭霧水:“平臺(tái)語(yǔ)言?Java不是平臺(tái)無(wú)關(guān)的語(yǔ)言嗎?”
“平臺(tái)的意義很廣,可以是硬件平臺(tái),可以是軟件平臺(tái),也可以是二者的結(jié)合。”冒號(hào)解釋道,“你說(shuō)的‘平臺(tái)’主要指硬件和操作系統(tǒng)平臺(tái),而我說(shuō)的‘平臺(tái)’指的是運(yùn)行環(huán)境平臺(tái)。當(dāng)然這兩種平臺(tái)是密不可分的,Java與C#之所以能獨(dú)立于前一種平臺(tái),正因?yàn)樗鼈冏詭Я撕笠环N平臺(tái)。具體地說(shuō),Java運(yùn)行于以Java Virtual Machine(JVM) 為核心的Java平臺(tái),而C#運(yùn)行于以Common Language Runtime(CLR)為核心的.NET平臺(tái)。”
句號(hào)打了個(gè)比方:“這就好比在不同的山路上鋪設(shè)相同的瀝青,車(chē)子跑到哪兒都沒(méi)區(qū)別了。”
“是這么個(gè)理兒。”冒號(hào)表示同意,“從傳承的角度看,二者皆為基于C++之上的改進(jìn),剔除了其中易于出錯(cuò)或不易掌握的語(yǔ)法特征。我們先來(lái)看看它們區(qū)別于C++的共同之處。首先,二者均編譯成與機(jī)器無(wú)關(guān)的托管碼(managed code)或稱(chēng)字節(jié)碼(bytecode),運(yùn)行于虛擬機(jī)(virtual machine)之上。其次,禁用或限用指針并支持自動(dòng)垃圾回收,由此極大地解放了程序員的生產(chǎn)力。起初這種做法并不是沒(méi)有爭(zhēng)議的,但隨著機(jī)器性能的提高以及軟件規(guī)模的擴(kuò)大,對(duì)軟件的健壯性、安全性和生產(chǎn)率的要求超過(guò)了對(duì)運(yùn)行效率的要求,屏蔽指針和自動(dòng)內(nèi)存管理逐漸得到認(rèn)同。盡管如此,指針運(yùn)算和手動(dòng)內(nèi)存管理對(duì)于系統(tǒng)軟件和在性能、實(shí)時(shí)性方面要求極高的軟件還是必不可少的。因?yàn)檫@個(gè)原因,C#還是留了一手:允許標(biāo)有修飾符unsafe的代碼包含指針操作。”
引號(hào)較起真來(lái):“這是否意味著C#也能作為系統(tǒng)語(yǔ)言呢?”
“或許吧。”冒號(hào)淡淡地說(shuō),“C#的胃口很大,上管天、下管地、中間還要管空氣。企業(yè)級(jí)應(yīng)用和桌面應(yīng)用自不必說(shuō),底層應(yīng)用也不放過(guò)。早在2003年,微軟研究院就開(kāi)始了用C#開(kāi)發(fā)的名為Singularity的操作系統(tǒng)研究項(xiàng)目,另外還有SharpOS、Cosmos等開(kāi)源操作系統(tǒng)。雖然它們目前僅用于研究,但不難看出C#的勃勃野心。說(shuō)起來(lái)這也不新鮮,1998年Sun就搞了個(gè)針對(duì)嵌入式系統(tǒng)的JavaOS,可惜沒(méi)能成功,為Java ME所取代。”
輪到嘆號(hào)糊涂了:“剛才還說(shuō)Java和C#是平臺(tái)語(yǔ)言,怎么又同C和C++一樣當(dāng)系統(tǒng)語(yǔ)言來(lái)用了呢?”
冒號(hào)釋疑:“Java可通過(guò)JNI調(diào)用C、C++等程序;C#可通過(guò)P/Invoke訪問(wèn)系統(tǒng)API,加之保留了指針操作,用于系統(tǒng)編程更加方便。其實(shí)一種語(yǔ)言勝任多種領(lǐng)域并不難,難的是在每個(gè)領(lǐng)域都獨(dú)占鰲頭??蓡?wèn)題是,有誰(shuí)不樂(lè)見(jiàn)自己支持的語(yǔ)言被廣泛應(yīng)用呢?無(wú)論是微軟還是Sun,他們都會(huì)竭盡所能地將自己的語(yǔ)言擴(kuò)張到每個(gè)角落。程序員作為語(yǔ)言的用戶(hù),雖然很多時(shí)候并沒(méi)有選擇語(yǔ)言的權(quán)力,但心中要有桿秤,可不要輕易被商家的廣告迷惑啊。”
逗號(hào)不無(wú)自嘲地說(shuō):“秤倒是有一桿,就是不太準(zhǔn)啊!”
有人“噗哧”笑出聲來(lái)。
“多學(xué)習(xí)、多實(shí)踐、多體悟,秤的精度自然會(huì)提高。” 冒號(hào)鼓勵(lì)道,“如果自己沒(méi)有足夠的鑒別商品能力,建議從商家的競(jìng)爭(zhēng)對(duì)手那里獲取真實(shí)的信息。要看Java的優(yōu)點(diǎn),不要聽(tīng)Sun的一面之詞,可以看看微軟的C#模仿了Java的哪些特征,因?yàn)槟7率亲罡叩馁潛P(yáng);要看Java的缺點(diǎn),可以看看C#擯棄了Java的哪些特征,可以聽(tīng)聽(tīng)微軟對(duì)Java的批判——雖然可能過(guò)激,但一般也不會(huì)太離譜。此法同樣適用于包括C#在內(nèi)的其他語(yǔ)言。”
句號(hào)有所感慨:“這既是程序員之幸——語(yǔ)言之間可以互相取長(zhǎng)補(bǔ)短,共同進(jìn)步;也是程序員之不幸——往往不得不在眾多語(yǔ)言中作艱難選擇,或者多花精力學(xué)更多的語(yǔ)言。”
冒號(hào)一邊點(diǎn)頭一邊接著說(shuō):“下面繼續(xù)看看Java與C#的共性。借著剛才的話(huà)題,我們來(lái)看看C#與Java是如何互相學(xué)習(xí)的。”
引號(hào)舉手插問(wèn):“C#到底更接近C++還是Java?”
“這是個(gè)有趣的問(wèn)題。不妨這么說(shuō):C#看起來(lái)像C++,用起來(lái)像Java。C#借鑒了包括Java、C++、Delphi等在內(nèi)的語(yǔ)言特征,其中Java的影響最大,但由于微軟與Sun在Visual J++上的過(guò)節(jié),寧愿強(qiáng)調(diào)與C++的關(guān)系而淡化與Java的關(guān)系。C#的設(shè)計(jì)者Hejlsberg以前是Delphi和Visual J++的架構(gòu)師,在一次訪談中首先聲明C#不是Java的克隆,但從此話(huà)本身和他本人的背景都暗示了與Java千絲萬(wàn)縷的聯(lián)系。例如,C#采用了大量與Java相同或相似功用卻不同拼寫(xiě)的關(guān)鍵字。”冒號(hào)投影出一張表格——
Java |
super |
import |
package |
synchronized |
instanceof |
deprecated |
final |
native |
boolean |
C# |
base |
using |
namespace |
lock |
is |
obsolete |
sealed |
extern |
bool |
“這是Java與C#關(guān)鍵字的不完全對(duì)照表。中立地看,C#的關(guān)鍵字似乎更簡(jiǎn)明,但明顯避嫌的意義大過(guò)改進(jìn)的意義。關(guān)鍵字只是一個(gè)縮影,那么C#究竟從Java那里學(xué)到了什么,相比于C++又有什么優(yōu)勢(shì)或特點(diǎn)呢?”冒號(hào)切換了幻燈片——
更加安全——限用或禁用指針;檢查字符串和數(shù)組的邊界;增加類(lèi)型安全;禁用未初始化的變量;增加了對(duì)資源的安全管理;
更加簡(jiǎn)單——自動(dòng)垃圾回收;廢除了頭文件和宏(macro);支持接口(interface);廢除多繼承以及非公開(kāi)繼承;摒棄了C++中一些生僻、難用的語(yǔ)法;
更加中性——編譯成機(jī)器無(wú)關(guān)代碼;運(yùn)行于統(tǒng)一平臺(tái);
更加OO——不支持全局變量和自由函數(shù);所有的類(lèi)都可上溯到Object類(lèi);對(duì)象一般通過(guò)new分配在堆(heap)上;
更加豐富——支持自?。?/span>reflection);支持并發(fā)編程;提供圖形界面、網(wǎng)絡(luò)編程、數(shù)據(jù)庫(kù)、XML等API;
更加標(biāo)準(zhǔn)——更好的Unicode支持;支持注釋性文檔;類(lèi)或方法可以被廢棄(deprecated);
問(wèn)號(hào)就勢(shì)而問(wèn):“Java向C#又借鑒了什么呢?”
冒號(hào)答道:“在Java1.5的增強(qiáng)特征中,有不少C#的影子。如增強(qiáng)版的for循環(huán);可變長(zhǎng)參數(shù)(varargs);自動(dòng)裝箱(autoboxing);類(lèi)型安全的枚舉(typesafe enum)等等。此外,支持元數(shù)據(jù)的的注釋?zhuān)?/span>annotation)與C#的特性(attribute)大同小異,C#從Delphi中引入的屬性(property)也出現(xiàn)在Java 7的提案中。”
逗號(hào)雙手一攤:“這么多相同之處,不如合并算了。”
“很傻很天真的想法。等它們合并了,估計(jì)世界也大同了。”冒號(hào)笑言,“它們之間的差別也不容忽視。C#重新?lián)炱鹆?/span>C++中被Java拋棄的一些特征,可謂是對(duì)C++的否定之否定——除了支持引用類(lèi)型(reference type)外,還支持值類(lèi)型(value type)[1];除了按值傳遞(pass-by-value)外,還可按引用傳遞(pass-by-reference);支持操作符重載(operator overloading);在一定條件下保留指針和指針運(yùn)算;所有的方法默認(rèn)是非虛的(non-virtual);訪問(wèn)權(quán)限默認(rèn)是私有的(private);將關(guān)鍵字‘extends’和‘implements’統(tǒng)一為‘:’;支持預(yù)處理指令(preprocessor directive)等等。公允地說(shuō),這些大都為明智之舉。”
引號(hào)追問(wèn):“C#有什么獨(dú)到之處嗎?”
“C#并非一味地效仿其他語(yǔ)言,也有創(chuàng)新之舉。曾在Visual J++中加入的委托(delegate)和相關(guān)的事件(event),如今可以堂而皇之地用在C#上,再不用擔(dān)心被Sun告了。”冒號(hào)語(yǔ)帶調(diào)侃,“C#還是第一個(gè)支持組件導(dǎo)向(Component-Oriented)的C族語(yǔ)言。除此之外,C#支持索引器(indexer)、版本控制(versioning)、XML注釋、特色指令如#region、特色關(guān)鍵字如checked、yield等等。還有一點(diǎn)不得不提,C#對(duì)函數(shù)式編程的支持力度逐漸加大:1.0的delegate可作為頭等函數(shù)(first-class function),2.0的匿名delegate可作為閉包,3.0又引入了λ表達(dá)式,幾乎可號(hào)稱(chēng)函數(shù)式語(yǔ)言了。及至C#4.0,進(jìn)一步向動(dòng)態(tài)語(yǔ)言靠攏,將引入關(guān)鍵字dynamic以支持動(dòng)態(tài)類(lèi)型和動(dòng)態(tài)操作。”
嘆號(hào)眉頭微蹙:“聽(tīng)起來(lái)C# 比Java復(fù)雜多了,好像大雜燴。”
“當(dāng)初Java對(duì)C++的改革的一個(gè)重要原則是:讓語(yǔ)言變得簡(jiǎn)單而有親和力,降低程序員門(mén)檻,提高軟件生產(chǎn)效率。但如今Java已經(jīng)不那么簡(jiǎn)單了,C#則更復(fù)雜,在某些方面較之C++也不遑多讓。” 冒號(hào)語(yǔ)調(diào)轉(zhuǎn)強(qiáng),“以前人們?cè)噲D在語(yǔ)言的威力(power)和生產(chǎn)率(productivity)中尋求最佳平衡點(diǎn),現(xiàn)在似乎更想魚(yú)與熊掌兼得。”
問(wèn)號(hào)再次提問(wèn):“Java與C# 最大的區(qū)別是什么?”
“雖然同為平臺(tái)語(yǔ)言,二者的設(shè)計(jì)理念還是有所不同的。Java的目的是讓一種語(yǔ)言在多種平臺(tái)上運(yùn)行,而C# 的目的是讓多種語(yǔ)言在一種平臺(tái)上運(yùn)行。”冒號(hào)鐘愛(ài)這種具有對(duì)稱(chēng)美的對(duì)比,“雖然理論上以C#為核心的.NET平臺(tái)可以用在任何操作系統(tǒng)上,但千萬(wàn)不要指望微軟會(huì)心甘情愿地提供Windows之外的實(shí)現(xiàn),原因不言自明。而Sun的Solaris無(wú)法與Windows抗衡,最大的王牌就是Java語(yǔ)言,當(dāng)然會(huì)致力于跨平臺(tái)和面向Internet的應(yīng)用,對(duì)桌面應(yīng)用的投入相對(duì)較少。因此兩個(gè)平臺(tái)語(yǔ)言,一個(gè)重在語(yǔ)言,讓語(yǔ)言向平臺(tái)擴(kuò)散;一個(gè)重在平臺(tái),讓平臺(tái)來(lái)凝聚語(yǔ)言。在此并不想對(duì)兩公司的商業(yè)策略評(píng)頭論足,而是認(rèn)為了解這種背景會(huì)對(duì)理解語(yǔ)言特征及其發(fā)展趨勢(shì)有所裨益。編程語(yǔ)言絕非象牙塔中之物,實(shí)乃技術(shù)和商業(yè)合力推動(dòng)的結(jié)果。”
逗號(hào)拖著怪腔:“原來(lái)如彼!”
眾人大笑。
句號(hào)深思后問(wèn)道:“可不可以這么理解:如果開(kāi)發(fā)僅限于Windows平臺(tái)的應(yīng)用,C#是更好的選擇,它一方面與Windows系統(tǒng)存在天然的紐帶,另一方面可有效地利用.NET的包括ASP.NET、VB.NET、ADO.NET、WinForms等在內(nèi)的各種軟件資源;如果開(kāi)發(fā)不限于Windows的企業(yè)應(yīng)用,則選擇Java更合適?”
冒號(hào)微微頷首:“有一定道理,平臺(tái)的確是語(yǔ)言選擇的一個(gè)考慮因素。不過(guò)說(shuō)起可利用的軟件資源,Java毫不遜色。除了形形色色的框架外,與動(dòng)態(tài)語(yǔ)言如Groovy、Scala、Ruby、Python等也能?chē)?yán)絲合縫。作為平臺(tái)語(yǔ)言,Java和C#均有極為豐富的資源和極強(qiáng)的整合能力,背后又有大公司不遺余力的支持和推廣,理所當(dāng)然地成為大型企業(yè)應(yīng)用的主流選擇。”冒號(hào)匆匆作結(jié),“關(guān)于Java與C#的比較暫時(shí)談到這里[2],由于時(shí)間關(guān)系,我們不可能面面俱到,難免掛一漏萬(wàn)。許多概念術(shù)語(yǔ)只是點(diǎn)到為止,具體細(xì)節(jié)留待以后展開(kāi),暫且按下不表。總而言之,每種語(yǔ)言都為解決問(wèn)題提供了一定的途經(jīng),C++、Java和C#的不同之處在于:C++提供了一馬平川的大路,也提供了陷阱密布的小道;Java則在大路上鋪設(shè)水泥,同時(shí)封鎖了捷徑小道;C#同樣填平了大路上的坑坑洼洼,但把一些小道上‘此路不通’的牌子悄悄換成了‘此路危險(xiǎn)’。”
,插語(yǔ)
[1] C#保留了C++中的struct關(guān)鍵字作為值類(lèi)型,以區(qū)別于class所代表的引用類(lèi)型。
[2] 參考文獻(xiàn)【3】對(duì)Java和C#進(jìn)行了非常詳盡的比較。
。總結(jié)
- 相比C++,Java與C#更加安全(限用指針、數(shù)組邊界檢查、類(lèi)型安全、資源管理等)、簡(jiǎn)單(自動(dòng)垃圾回收、廢除多繼承和頭文件等)、中性(編譯成機(jī)器無(wú)關(guān)的字節(jié)碼,運(yùn)行于虛擬機(jī))、OO(無(wú)全局變量和函數(shù)等)、豐富(支持自省和并發(fā)編程、更完備的API等)、標(biāo)準(zhǔn)(注釋性文檔、更好的Unicode支持等)。
- Java的目的是讓一種語(yǔ)言在多種平臺(tái)上運(yùn)行,而C# 的目的是讓多種語(yǔ)言在一種平臺(tái)上運(yùn)行。Java重在語(yǔ)言,讓語(yǔ)言向平臺(tái)擴(kuò)散;C#重在平臺(tái),讓平臺(tái)來(lái)凝聚語(yǔ)言。
- 雖然系統(tǒng)開(kāi)發(fā)并非Java與C#的禁區(qū),它們更多地還是用于企業(yè)級(jí)應(yīng)用開(kāi)發(fā)。豐富的資源、強(qiáng)大的整合能力和巨頭公司的鼎力支持是它們得天獨(dú)厚的優(yōu)勢(shì)。
- 編程語(yǔ)言的發(fā)展是技術(shù)和商業(yè)合力推動(dòng)的結(jié)果。
“”參考
[1] Jesse Liberty.Programming C#, 2nd ed..Sebastopol, CA:O'Reilly,2002
[2] Mads Torgersen.New features in C# 4.0.http://code.msdn.microsoft.com/csharpfuture/Release/ProjectReleases.aspx?ReleaseId=1686
[3] Dare Obasanjo.A COMPARISON OF MICROSOFT'S C# PROGRAMMING LANGUAGE TO SUN MICROSYSTEMS' JAVA PROGRAMMING LANGUAGE.
http://www.25hoursaday.com/CsharpVsJava.html
posted on 2009-02-15 22:41 鄭暉 閱讀(3275) 評(píng)論(3) 編輯 收藏 所屬分類(lèi): 冒號(hào)課堂