新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 學習方法與實踐 > Java和C++的基本差異

Java和C++的基本差異

——
作者: 時間:2007-10-25 來源:嵌入式在線論壇 收藏

前言 


  群體每天都在擴大,它既包括一些世界最大的ISV,也包括公司CIO、信息技術(shù)人員、系統(tǒng)分析人員、C/S開發(fā)人員、編程人員、多媒體設計者、市場行銷人員、教育工作者、經(jīng)理、影視生產(chǎn)者甚至業(yè)余愛好者等廣泛的用戶。從傳統(tǒng)上看,這樣一些人在一起有效地工作是不多見的。當我們談到開放系統(tǒng)時,我們往往是就已發(fā)表的API及規(guī)格,或者源碼的可得性,或者硬件、聯(lián)網(wǎng)及操作系統(tǒng)而言的,沒有一個人是從人的開放意義上來談的。 完成了開放系統(tǒng)的閉合鏈。它開發(fā)了人力資源,而反過來又開辟了共同工作的道路。 

 
  一談到,人們馬上會想起一種類似于的、適用于分布環(huán)境的面向?qū)ο?a class="contentlabel" href="http://m.butianyuan.cn/news/listbylabel/label/編程語言">編程語言,想到這種語言的簡單、穩(wěn)定、安全、與體系結(jié)構(gòu)無關(guān)、可移植、可解釋、高性能、多線程和動態(tài)性等特征。這些都是Java作為一種程序設計語言的主要特征。 

 
  Java是由Sun公司的一個技術(shù)小組研制出來的。在實現(xiàn)Java語言的過程中,Sun小組的技術(shù)人員很快就意識到:無法成為一種完全面向?qū)ο蟮?、網(wǎng)絡化的開發(fā)語言。是通過給原先的C語言增加面向?qū)ο蠊δ芏_發(fā)出來的,因此,它存在著先天不足。這主要體現(xiàn)在C++種類繁多,功能大量冗余,同時又沒有任何一種C++編譯器能夠支持它的全部功能。鑒于這種情況,Sun公司的技術(shù)人員決定不擴充C++,而開發(fā)一種全新的計算機語言(Java的前身Oak)。但是,C++已經(jīng)成了大多數(shù)編程人員所熟練掌握的語言,Java的設計顯然不能無視這個現(xiàn)實。如果Java和C++之間的差別過大,那么程序員們在學會這種語言的過程中無疑要花費大量的時間和精力。因此,Java保留了盡可能多的C++風格。 


  Java自誕生起,為網(wǎng)絡用戶創(chuàng)造了無數(shù)客戶端的小應用程序,由于這類應用程序效果良好、數(shù)量巨大,以至于許多用戶想到Java時,會在腦海中出現(xiàn)一個不完全正確的印象-Java 是用來編寫小的客戶端程序的。其實,隨著技術(shù)的進步,Java語言正在逐步改變自己執(zhí)行效率較低、無法擔任企業(yè)關(guān)鍵計算任務的形象,不斷向計算技術(shù)的核心地帶前進。今天的Java技術(shù)正沿著網(wǎng)絡滲入各個應用領域。 


  企業(yè)計算:企業(yè)計算是Java最重要的技術(shù)主題。Sun公司已經(jīng)公布了企業(yè) JavaBean(EJB,Enterprise JavaBean)的規(guī)格,隨后眾多公司開始開發(fā)企業(yè)應用領域的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公司也在宣布了一個新的服務器端的企業(yè)Java平臺,而Sun公司也在積極地升級自己的JDK系統(tǒng),這個形勢表明,Java正在穩(wěn)步走向企業(yè)高端計算。對于Java來說,與其它爭奪企業(yè)計算主力編程工具的優(yōu)勢在于:其一,Java在進行面向?qū)ο蟮木幊坦ぷ鲿r,比其它的編程語言如 C++更加簡單,因此保證了編程的高效率,減少了編程投入;其二,Java虛擬機技術(shù)所提供的"一次編程,到處使用"的跨平臺能力非常適合網(wǎng)絡環(huán)境,這給 Java在網(wǎng)絡服務器端的發(fā)展提供了便利條件;其三,Java擁有強大的提供商和支持者隊伍,該隊伍包括IBM、Oracle、Novell、 Sybase和Netscape等公司。 


  提速運行:許多企業(yè)的應用開發(fā)人員非常喜愛Java的語言特性,但是在開發(fā)重要系統(tǒng)時,語言特性和執(zhí)行效率之間的抉擇往往令人傷透腦筋。在關(guān)鍵計算中,用戶可能并不在乎數(shù)據(jù)如何壓縮或者運行的延遲關(guān)系如何設置,但是對程序的運行速度卻非常重視,這使廠商將Java的編譯策略開發(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是一個潛力巨大的應用技術(shù),該技術(shù)充分發(fā)揮了Java小巧靈活的特點。以HP公司為例,該公司以自己的方式制造編譯工具和Java虛擬機,其目的是將Java嵌入各種設備,如打印機、醫(yī)學監(jiān)視器和自動提款機等。嵌入設備依靠一個實時操作系統(tǒng)來處理某一個實時生效的事件,Java被嵌入這些設備后,通過實時擴展(real -time extension)開始發(fā)揮作用,使設備具備了一定的智能性,增強了嵌入設備的可管理性和可用性,大大提高了設備的工作效率。各廠商對這一潛力巨大的市場都非常重視,目前該市場缺乏的是一個標準,如果存在標準的話,相信很快就會有大量使用嵌入Java技術(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ā)人員都有各自的看法。我個人認為Java開發(fā)要比C++好一些。當然每個人的看法和喜好是不同的。后面的文章將向大家介紹 Java和C++的不同和對其的改進。孰強孰弱,大家自然就會明白了。 


  我們知道,Java一開始采用C++的語法格式,基本上是為了讓程序設計者可以很快地熟悉 Java的語法格式,縮短學習Java的時間,畢竟C和C++仍舊是最多人會的一種程序語言。但是如果我們仔細檢查Java程序語言的許多細節(jié)設計,我們可以發(fā)現(xiàn)Java去掉了不少C++的特點,并且加入一些新的特性。這些與C++的差異包括: 


  1.不再有#define、#include等預處理程序(Preprocessor)的功能 


  C++語言很重要的一個特點就是它的預處理程序。有些其他程序語言雖然也加入了#include的功能,但是還是欠缺處理宏(Macro)的能力。 #define的功能在Java中我們可以用定義常數(shù)(constant)的方式來取代,而#include在Java中是不需要的,因為在Java中程序在執(zhí)行時,會把類型數(shù)據(jù)記錄在對象實體之中,我們不需要靠一些標頭文件(header file)來知道我們使用的對象或數(shù)值是屬于什么數(shù)據(jù)類型。

 
  如果你使用C++語言時,只使用預處理程序的#include和#define功能的話,那么你大概不會覺得Java這樣的設計對你產(chǎn)生什么樣的困擾,但是如果你是使用C++語言預處理程序中宏功能的高手,你可能會覺得很不方便,進而懷疑Java如此設計的意義何在。

 
  使用預處理程序雖然可以很方便地達到許多功能,但是站在工程的角度上看,對整個的維護其實是很不利的。由于C++語言中預處理程序的功能太過強大,厲害的程序設計高手常會自行開發(fā)一套只有自己看的懂的宏語言,一旦整個軟件要交給其他人去維護,后繼者很難在短時間內(nèi)了解前一個人所寫下的宏功能,增加軟件開發(fā)時團隊工作及日后維護的困難度。 

 
  另外一點則是C++語言的編譯器所看到的程序代碼,其實和程序設計者看到的程序代碼是不同的。程序設計者看到的是尚未經(jīng)過預處理程序處理過的程序代碼,而編譯器看到的則是預處理程序處理過的程序代碼,一旦交給預處理程序處理的宏內(nèi)容有誤,編譯器產(chǎn)生的錯誤信息將不會是程序設計師所預料的。而這一點自然也增加了程序在排錯時的困難度。 

 
  預處理程序的存在也造成了閱讀程序的不便。如果你想使用別人已經(jīng)完成的C++語言程序,那么通常你不但要閱讀他所寫下的文件,還必須一并查閱上文件,才能了解其程序的全貌。如果換成是Java程序,只要查看java的程序文件就夠了。 

 
  2.不再有structure、union及typedef 


  事實上,早在C++中就可以去掉C語言中的structure和union等對復雜數(shù)據(jù)的自定結(jié)構(gòu)類型,因為類(Class)的定義方式可以完全做到這項功能。而typedef也是不必要的,一切都用類就可以了。雖然C++這樣的設計是為了和C語言兼容,但是使用多余的語言特點不但不必要,而且容易造成對程序認識的混淆。

 
  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的好 



評論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉