Java和C++的基本差異
前言
Java群體每天都在擴(kuò)大,它既包括一些世界最大的ISV,也包括公司CIO、信息技術(shù)人員、系統(tǒng)分析人員、C/S開(kāi)發(fā)人員、編程人員、多媒體設(shè)計(jì)者、市場(chǎng)行銷(xiāo)人員、教育工作者、經(jīng)理、影視生產(chǎn)者甚至業(yè)余愛(ài)好者等廣泛的用戶。從傳統(tǒng)上看,這樣一些人在一起有效地工作是不多見(jiàn)的。當(dāng)我們談到開(kāi)放系統(tǒng)時(shí),我們往往是就已發(fā)表的API及規(guī)格,或者源碼的可得性,或者硬件、聯(lián)網(wǎng)及操作系統(tǒng)而言的,沒(méi)有一個(gè)人是從人的開(kāi)放意義上來(lái)談的。 Java完成了開(kāi)放系統(tǒng)的閉合鏈。它開(kāi)發(fā)了人力資源,而反過(guò)來(lái)又開(kāi)辟了共同工作的道路。
一談到Java,人們馬上會(huì)想起一種類(lèi)似于C++的、適用于分布環(huán)境的面向?qū)ο?a class="contentlabel" href="http://butianyuan.cn/news/listbylabel/label/編程語(yǔ)言">編程語(yǔ)言,想到這種語(yǔ)言的簡(jiǎn)單、穩(wěn)定、安全、與體系結(jié)構(gòu)無(wú)關(guān)、可移植、可解釋、高性能、多線程和動(dòng)態(tài)性等特征。這些都是Java作為一種程序設(shè)計(jì)語(yǔ)言的主要特征。
Java是由Sun公司的一個(gè)技術(shù)小組研制出來(lái)的。在實(shí)現(xiàn)Java語(yǔ)言的過(guò)程中,Sun小組的技術(shù)人員很快就意識(shí)到:C++無(wú)法成為一種完全面向?qū)ο蟮摹⒕W(wǎng)絡(luò)化的開(kāi)發(fā)語(yǔ)言。C++是通過(guò)給原先的C語(yǔ)言增加面向?qū)ο蠊δ芏_(kāi)發(fā)出來(lái)的,因此,它存在著先天不足。這主要體現(xiàn)在C++種類(lèi)繁多,功能大量冗余,同時(shí)又沒(méi)有任何一種C++編譯器能夠支持它的全部功能。鑒于這種情況,Sun公司的技術(shù)人員決定不擴(kuò)充C++,而開(kāi)發(fā)一種全新的計(jì)算機(jī)語(yǔ)言(Java的前身Oak)。但是,C++已經(jīng)成了大多數(shù)編程人員所熟練掌握的語(yǔ)言,Java的設(shè)計(jì)顯然不能無(wú)視這個(gè)現(xiàn)實(shí)。如果Java和C++之間的差別過(guò)大,那么程序員們?cè)趯W(xué)會(huì)這種語(yǔ)言的過(guò)程中無(wú)疑要花費(fèi)大量的時(shí)間和精力。因此,Java保留了盡可能多的C++風(fēng)格。
Java自誕生起,為網(wǎng)絡(luò)用戶創(chuàng)造了無(wú)數(shù)客戶端的小應(yīng)用程序,由于這類(lèi)應(yīng)用程序效果良好、數(shù)量巨大,以至于許多用戶想到Java編程語(yǔ)言時(shí),會(huì)在腦海中出現(xiàn)一個(gè)不完全正確的印象-Java 是用來(lái)編寫(xiě)小的客戶端程序的。其實(shí),隨著技術(shù)的進(jìn)步,Java語(yǔ)言正在逐步改變自己執(zhí)行效率較低、無(wú)法擔(dān)任企業(yè)關(guān)鍵計(jì)算任務(wù)的形象,不斷向計(jì)算技術(shù)的核心地帶前進(jìn)。今天的Java技術(shù)正沿著網(wǎng)絡(luò)滲入各個(gè)應(yīng)用領(lǐng)域。
企業(yè)計(jì)算:企業(yè)計(jì)算是Java最重要的技術(shù)主題。Sun公司已經(jīng)公布了企業(yè) JavaBean(EJB,Enterprise JavaBean)的規(guī)格,隨后眾多公司開(kāi)始開(kāi)發(fā)企業(yè)應(yīng)用領(lǐng)域的Java技術(shù)。IBM公司也已經(jīng)為Windows NT開(kāi)發(fā)了IBM HPCJ(High Performance Compiler for Java)12.0版,同時(shí)研制了IBM JDK(JavaDevelopment Kit)for Windows NT,Novell公司也在宣布了一個(gè)新的服務(wù)器端的企業(yè)Java平臺(tái),而Sun公司也在積極地升級(jí)自己的JDK系統(tǒng),這個(gè)形勢(shì)表明,Java正在穩(wěn)步走向企業(yè)高端計(jì)算。對(duì)于Java來(lái)說(shuō),與其它編程語(yǔ)言爭(zhēng)奪企業(yè)計(jì)算主力編程工具的優(yōu)勢(shì)在于:其一,Java在進(jìn)行面向?qū)ο蟮木幊坦ぷ鲿r(shí),比其它的編程語(yǔ)言如 C++更加簡(jiǎn)單,因此保證了編程的高效率,減少了編程投入;其二,Java虛擬機(jī)技術(shù)所提供的"一次編程,到處使用"的跨平臺(tái)能力非常適合網(wǎng)絡(luò)環(huán)境,這給 Java在網(wǎng)絡(luò)服務(wù)器端的發(fā)展提供了便利條件;其三,Java擁有強(qiáng)大的提供商和支持者隊(duì)伍,該隊(duì)伍包括IBM、Oracle、Novell、 Sybase和Netscape等公司。
提速運(yùn)行:許多企業(yè)的應(yīng)用開(kāi)發(fā)人員非常喜愛(ài)Java的語(yǔ)言特性,但是在開(kāi)發(fā)重要系統(tǒng)時(shí),語(yǔ)言特性和執(zhí)行效率之間的抉擇往往令人傷透腦筋。在關(guān)鍵計(jì)算中,用戶可能并不在乎數(shù)據(jù)如何壓縮或者運(yùn)行的延遲關(guān)系如何設(shè)置,但是對(duì)程序的運(yùn)行速度卻非常重視,這使廠商將Java的編譯策略開(kāi)發(fā)放在了首位?,F(xiàn)在的Java語(yǔ)言,其執(zhí)行方式已經(jīng)不僅僅是解釋執(zhí)行方式了,即時(shí)編譯器(JITC、just-in-time compiler)技術(shù)和原型編譯技術(shù)已經(jīng)被許多廠家采用,包括Sun、IBM、Oracle以及Netscape等公司在內(nèi)的技術(shù)提供商正在利用這些技術(shù)逐步提高Java的執(zhí)行速度,其中IBM公司早已將Java虛擬機(jī)(JVM,JavaVirtual Machine)、操作系統(tǒng)和硬件的特性有機(jī)的結(jié)合在一起,非常有效地提高了Java的執(zhí)行效率。
嵌入計(jì)算:嵌入式Java是一個(gè)潛力巨大的應(yīng)用技術(shù),該技術(shù)充分發(fā)揮了Java小巧靈活的特點(diǎn)。以HP公司為例,該公司以自己的方式制造編譯工具和Java虛擬機(jī),其目的是將Java嵌入各種設(shè)備,如打印機(jī)、醫(yī)學(xué)監(jiān)視器和自動(dòng)提款機(jī)等。嵌入設(shè)備依靠一個(gè)實(shí)時(shí)操作系統(tǒng)來(lái)處理某一個(gè)實(shí)時(shí)生效的事件,Java被嵌入這些設(shè)備后,通過(guò)實(shí)時(shí)擴(kuò)展(real -time extension)開(kāi)始發(fā)揮作用,使設(shè)備具備了一定的智能性,增強(qiáng)了嵌入設(shè)備的可管理性和可用性,大大提高了設(shè)備的工作效率。各廠商對(duì)這一潛力巨大的市場(chǎng)都非常重視,目前該市場(chǎng)缺乏的是一個(gè)標(biāo)準(zhǔn),如果存在標(biāo)準(zhǔn)的話,相信很快就會(huì)有大量使用嵌入Java技術(shù)的設(shè)備上市。
微軟剛剛發(fā)行的 Windows XP放棄了對(duì)Java的支持,但Java能夠獨(dú)立運(yùn)行于很多操作平臺(tái)上,其中也包括Linux,并且在某些特性上要比在Windows上發(fā)揮得更好,我們完全有理由拋棄Windows而選擇使用Linux來(lái)做Java開(kāi)發(fā)。現(xiàn)在,你可以左手拿著Linux,右手拿著Java,然后對(duì)面帶微笑手里拿著 Windows XP的Bill Gates說(shuō):"讓你的XP去見(jiàn)鬼吧!"
對(duì)于軟件開(kāi)發(fā)者來(lái)講,任何一種編程語(yǔ)言都不可能是完美的。如果希望更好地理解Java語(yǔ)言,最好的方法是把這種語(yǔ)言與其同類(lèi)型的語(yǔ)言相比較。既然Java類(lèi)似于C++,把它同C++進(jìn)行一番比較也是順理成章的事情, 哪一個(gè)好,哪一個(gè)不好,每個(gè)開(kāi)發(fā)人員都有各自的看法。我個(gè)人認(rèn)為Java開(kāi)發(fā)要比C++好一些。當(dāng)然每個(gè)人的看法和喜好是不同的。后面的文章將向大家介紹 Java和C++的不同和對(duì)其的改進(jìn)。孰強(qiáng)孰弱,大家自然就會(huì)明白了。
我們知道,Java一開(kāi)始采用C++的語(yǔ)法格式,基本上是為了讓程序設(shè)計(jì)者可以很快地熟悉 Java的語(yǔ)法格式,縮短學(xué)習(xí)Java的時(shí)間,畢竟C和C++仍舊是最多人會(huì)的一種程序語(yǔ)言。但是如果我們仔細(xì)檢查Java程序語(yǔ)言的許多細(xì)節(jié)設(shè)計(jì),我們可以發(fā)現(xiàn)Java去掉了不少C++的特點(diǎn),并且加入一些新的特性。這些與C++的差異包括:
1.不再有#define、#include等預(yù)處理程序(Preprocessor)的功能
C++語(yǔ)言很重要的一個(gè)特點(diǎn)就是它的預(yù)處理程序。有些其他程序語(yǔ)言雖然也加入了#include的功能,但是還是欠缺處理宏(Macro)的能力。 #define的功能在Java中我們可以用定義常數(shù)(constant)的方式來(lái)取代,而#include在Java中是不需要的,因?yàn)樵贘ava中程序在執(zhí)行時(shí),會(huì)把類(lèi)型數(shù)據(jù)記錄在對(duì)象實(shí)體之中,我們不需要靠一些標(biāo)頭文件(header file)來(lái)知道我們使用的對(duì)象或數(shù)值是屬于什么數(shù)據(jù)類(lèi)型。
如果你使用C++語(yǔ)言時(shí),只使用預(yù)處理程序的#include和#define功能的話,那么你大概不會(huì)覺(jué)得Java這樣的設(shè)計(jì)對(duì)你產(chǎn)生什么樣的困擾,但是如果你是使用C++語(yǔ)言預(yù)處理程序中宏功能的高手,你可能會(huì)覺(jué)得很不方便,進(jìn)而懷疑Java如此設(shè)計(jì)的意義何在。
使用預(yù)處理程序雖然可以很方便地達(dá)到許多功能,但是站在軟件工程的角度上看,對(duì)整個(gè)軟件的維護(hù)其實(shí)是很不利的。由于C++語(yǔ)言中預(yù)處理程序的功能太過(guò)強(qiáng)大,厲害的程序設(shè)計(jì)高手常會(huì)自行開(kāi)發(fā)一套只有自己看的懂的宏語(yǔ)言,一旦整個(gè)軟件要交給其他人去維護(hù),后繼者很難在短時(shí)間內(nèi)了解前一個(gè)人所寫(xiě)下的宏功能,增加軟件開(kāi)發(fā)時(shí)團(tuán)隊(duì)工作及日后維護(hù)的困難度。
另外一點(diǎn)則是C++語(yǔ)言的編譯器所看到的程序代碼,其實(shí)和程序設(shè)計(jì)者看到的程序代碼是不同的。程序設(shè)計(jì)者看到的是尚未經(jīng)過(guò)預(yù)處理程序處理過(guò)的程序代碼,而編譯器看到的則是預(yù)處理程序處理過(guò)的程序代碼,一旦交給預(yù)處理程序處理的宏內(nèi)容有誤,編譯器產(chǎn)生的錯(cuò)誤信息將不會(huì)是程序設(shè)計(jì)師所預(yù)料的。而這一點(diǎn)自然也增加了程序在排錯(cuò)時(shí)的困難度。
預(yù)處理程序的存在也造成了閱讀程序的不便。如果你想使用別人已經(jīng)完成的C++語(yǔ)言程序,那么通常你不但要閱讀他所寫(xiě)下的文件,還必須一并查閱上文件,才能了解其程序的全貌。如果換成是Java程序,只要查看java的程序文件就夠了。
2.不再有structure、union及typedef
事實(shí)上,早在C++中就可以去掉C語(yǔ)言中的structure和union等對(duì)復(fù)雜數(shù)據(jù)的自定結(jié)構(gòu)類(lèi)型,因?yàn)轭?lèi)(Class)的定義方式可以完全做到這項(xiàng)功能。而typedef也是不必要的,一切都用類(lèi)就可以了。雖然C++這樣的設(shè)計(jì)是為了和C語(yǔ)言兼容,但是使用多余的語(yǔ)言特點(diǎn)不但不必要,而且容易造成對(duì)程序認(rèn)識(shí)的混淆。
3.不再有函數(shù)
在Java程序語(yǔ)言中,去掉了程序向?qū)дZ(yǔ)言中最重要的單元--函數(shù) (Function)。如果我們以對(duì)象向?qū)У挠^念來(lái)看待函數(shù),就可以了解函數(shù)在對(duì)象向?qū)У母拍钪?,是不必要的。在?duì)象向?qū)У某绦蛴^念里,對(duì)象的數(shù)據(jù)才是真正的主體,而處理對(duì)象數(shù)據(jù)的方法則必須依附在對(duì)象內(nèi)才有意義。因此,去掉函數(shù)并不表示不再有子程序等模組化程序的概念,相反地,是利用對(duì)象中的方法來(lái)取代函數(shù),再一次強(qiáng)化對(duì)向?qū)У陌l(fā)展策。
4.不再有多重繼承(Multiplelnheritance)
在C++中,多重繼承是一項(xiàng)很強(qiáng)的功能,但也是一般人難以掌控的部分。去掉多重繼承雖然降低了Java語(yǔ)言的功能,但是也大幅簡(jiǎn)化撰寫(xiě)程序時(shí)的困難度。雖然移除了多重繼承的功能,但是Java提供了interface的方式,可以達(dá)到部分多重繼承的功用。所謂的interface基本上定義了一個(gè)類(lèi)的對(duì)外溝通的方法原型,以及類(lèi)內(nèi)部的常 數(shù),和多重繼承不同之處在于interface并不會(huì)定義類(lèi)方法的內(nèi)容,以及類(lèi)中的變量數(shù)據(jù)。
5.不再有Goto
在程序語(yǔ)言的發(fā)展史上,Goto一直是毀譽(yù)參半的一項(xiàng)功能。在很多時(shí)候使用Goto可以大幅減少不必要的程序代碼,但是也由于Goto可以很自由地改變程序的流程,如果冒然地使用,更可能造成程序結(jié)構(gòu)混亂的情況。一般來(lái)說(shuō),正確使用Goto的例子多出現(xiàn)在循環(huán)內(nèi)部,想要提早結(jié)束某一層循環(huán)。在C語(yǔ)言中,我們可以使用break 或contine來(lái)改變某一層循環(huán)的流程,但如果想要改變兩層以上的環(huán)執(zhí)行流程,不是使用Goto就是以多余的布爾(boolean)變量,配合上一串if-then-else的判斷來(lái)達(dá)成。
Java一方面移除了Goto的功能,而另一方面同時(shí)擴(kuò)大了break和continue的功能,可以允許多層循環(huán)的break或continue。如此一來(lái)不但避免了濫用Goto的可能性,同時(shí)也保存下Goto的好
評(píng)論