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