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