Java總是和C++聯(lián)系在一起,而C++則是從C語(yǔ)言派生而來(lái)的,所以Java語(yǔ)言繼承了這兩種語(yǔ)言的大部分特性。Java的語(yǔ)法是從C繼承的,Java許多面向?qū)ο蟮奶匦允艿紺++的影響。事實(shí)上,Java中幾個(gè)自定義的特性都來(lái)自于或可以追溯到它的前驅(qū)。而且,Java語(yǔ)言的產(chǎn)生與過(guò)去30年中計(jì)算機(jī)語(yǔ)言細(xì)致改進(jìn)和不斷發(fā)展密切相關(guān)。基于這些原因,本節(jié)將按順序回顧促使Java產(chǎn)生的事件和推動(dòng)力。正如你將看到的一樣,每一次語(yǔ)言設(shè)計(jì)的革新都是因?yàn)橄惹暗恼Z(yǔ)言不能解決目前遇到的基本問題而引起。Java也不例外。
Java是由James Gosling,Patrick Naughton,Chris Warth,Ed Frank和Mike Sheridan于1991年在Sun Microsystems公司設(shè)計(jì)出來(lái)的。開發(fā)第 一個(gè)版本花了18個(gè)月。該語(yǔ)言開始名叫“Oak”,于1995年更名“Java”。
從1992 的秋天Oak問世到1995的春天公開發(fā)布Java語(yǔ)言,許多人對(duì)Java的設(shè)計(jì)和改進(jìn)做出了貢獻(xiàn)。Bill Joy,Arthur van Hoff,Jonathan Payne,F(xiàn)rank Yellin和Tim Lindholm是主要的貢獻(xiàn)者,正是他們的貢獻(xiàn)使最初原型得以成熟。
說(shuō)起來(lái)多少有些令人吃驚,Java的最初推動(dòng)力并不是因特網(wǎng)!而是源于對(duì)獨(dú)立于平臺(tái)(也就是體系結(jié)構(gòu)中立)語(yǔ)言的需要,這種語(yǔ)言可創(chuàng)建能夠嵌入微波爐、遙控器等各種家用電器設(shè)備的軟件。用作控制器的CPU芯片是多種多樣的,但C和C++以及其他絕大多數(shù)語(yǔ)言的缺點(diǎn)是只能對(duì)特定目標(biāo)進(jìn)行編譯。盡管為任何類型的CPU芯片編譯C++程序是可能的,但這樣做需要一個(gè)完整的以該CPU為目標(biāo)的C++編譯器,而創(chuàng)建編譯器是一項(xiàng)既耗資巨大又耗時(shí)較長(zhǎng)的工作。因此需要一種簡(jiǎn)單且經(jīng)濟(jì)的解決方案。為了找到這樣一種方案,Gosling和其他人開始一起致力于開發(fā)一種可移植、跨平臺(tái)的語(yǔ)言,該語(yǔ)言能夠生成運(yùn)行于不同環(huán)境、不同CPU芯片上的代碼。他們的努力最終促成了Java的誕生。
在Java的一些細(xì)節(jié)被設(shè)計(jì)出來(lái)的同時(shí),第二個(gè)并且也是最重要的因素出現(xiàn)了,該因素將對(duì)Java的未來(lái)起著至關(guān)重要的作用。這第二個(gè)因素當(dāng)然就是萬(wàn)維網(wǎng)(WWW)。如果萬(wàn)維網(wǎng)(WWW)的成型和Java的實(shí)現(xiàn)不是同時(shí)發(fā)生的話,那么Java可能保持它有用、但默默無(wú)聞的用于電子消費(fèi)品編程語(yǔ)言的狀態(tài)。然而,隨著萬(wàn)維網(wǎng)的出現(xiàn),Java被推到計(jì)算機(jī)語(yǔ)言設(shè)計(jì)的最前沿,因?yàn)槿f(wàn)維網(wǎng)也需要可移植的程序。
絕大多數(shù)程序員在涉足編程領(lǐng)域時(shí)就知道可移植的程序像他們的理想一樣難以捉摸。 盡管人們對(duì)高效的、可移植的(獨(dú)立于平臺(tái))編程方式的追尋幾乎和編程歷史一樣久遠(yuǎn),但它總是讓位于其他的更為緊迫的問題。此外,因?yàn)橛?jì)算機(jī)業(yè)被Intel,Macintosh和UNIX 這3個(gè)競(jìng)爭(zhēng)對(duì)手壟斷,大多數(shù)程序員都在其中的某個(gè)領(lǐng)域內(nèi)長(zhǎng)期工作,所以對(duì)可移植語(yǔ)言的 需求就不是那么迫切。但是,隨著因特網(wǎng)和Web的出現(xiàn),關(guān)于可移植性語(yǔ)言的舊問題又被提了出來(lái)。畢竟,因特網(wǎng)由不同的、分布式的系統(tǒng)組成,其中包括各種類型的計(jì)算機(jī)、操作系統(tǒng)和CPU。盡管許多類型的平臺(tái)都可以與因特網(wǎng)連接,但用戶仍希望他們能夠運(yùn)行同樣的程序。曾經(jīng)是一個(gè)令人煩惱卻無(wú)需優(yōu)先考慮的問題現(xiàn)在變成了急需解決的問題。
1993年,Java設(shè)計(jì)小組的成員發(fā)現(xiàn)他們?cè)诰幹魄度胧娇刂破鞔a時(shí)經(jīng)常遇到的可移植性問題,在編制因特網(wǎng)代碼的過(guò)程中也出現(xiàn)了。事實(shí)上,開始被設(shè)計(jì)為解決小范圍問題的Java語(yǔ)言同樣可以被用在大范圍的因特網(wǎng)上。這個(gè)認(rèn)識(shí)使他們將Java的重心由電子消費(fèi)品轉(zhuǎn)移到Internet編程。因此,中立體系結(jié)構(gòu)編程語(yǔ)言的需要是促使Java誕生的源動(dòng)力,而Internet卻最終導(dǎo)致了Java的成功。
正如前面提到的,Java的大部分特性是從C和C++中繼承的。Java設(shè)計(jì)人員之所以故意這么做,主要是因?yàn)樗麄冇X得,在新語(yǔ)言中使用熟悉的C語(yǔ)法及模仿C++面向?qū)ο蟮奶匦?,將使他們的語(yǔ)言對(duì)經(jīng)驗(yàn)豐富的C/C++程序員有更大的吸引力。除了表面類似外,其他一些促使C和C++成功的因素也幫了Java的忙。首先,Java的設(shè)計(jì)、測(cè)試、精煉由真正從事編程工作的人員完成,它根植于設(shè)計(jì)它的人員的需要和經(jīng)驗(yàn),因而也是一個(gè)程序員自己的語(yǔ)言。
其次,Java是緊密結(jié)合的且邏輯上是協(xié)調(diào)一致的。最 后,除了那些Internet環(huán)境強(qiáng)加的約束以外,Java給了編程人員完全的控制權(quán)。如果你程序編的好,你編寫的程序就能反映出這一點(diǎn)。相反,如果你的編程手法拙劣,也能在你的程序中反映出來(lái)。換一種說(shuō)法,Java并不是訓(xùn)練新手的語(yǔ)言,而是供專業(yè)編程人員使用的語(yǔ)言。
由于Java和C++之間的相似性,容易使人將Java簡(jiǎn)單地想象為“C++的版本”。但其實(shí)這是一種誤解。Java在實(shí)踐和理論上都與C++有重要的不同點(diǎn)。盡管Java受到C++的影響,但它并不是C++的增強(qiáng)版。例如,Java與C++既不向上兼容,也不向下兼容。當(dāng)然,Java與C++的相似之處也是很多的,如果你是一個(gè)C++程序員,你會(huì)感覺到對(duì)Java非常熟悉。另外一點(diǎn)是:Java并不是用來(lái)取代C++的,設(shè)計(jì)Java是為了解決某些特定的問題,而設(shè)計(jì)C++是為了解決另外一類完全不同的問題。兩者將長(zhǎng)時(shí)間共存。
正如本章開始提到的,計(jì)算機(jī)語(yǔ)言的革新靠?jī)蓚€(gè)因素驅(qū)動(dòng):對(duì)計(jì)算環(huán)境改變的適應(yīng)和編程藝術(shù)的進(jìn)步。環(huán)境的變化促使Java這種獨(dú)立于平臺(tái)的語(yǔ)言注定成為Internet上的分布式編程語(yǔ)言。同時(shí),Java也改變了人們的編程方式,特別是Java對(duì)C++使用的面向?qū)ο蠓独M(jìn)行的增強(qiáng)和完善。所以,Java不是孤立存在的一種語(yǔ)言,而是計(jì)算機(jī)語(yǔ)言多年來(lái)的演變結(jié)果。僅這個(gè)事實(shí)就足以證明Java在計(jì)算機(jī)語(yǔ)言歷史上的地位。Java對(duì)Internet編程的影響就如同C對(duì)系統(tǒng)編程的影響一樣:革命的力量將改變世界。