天天看點

《Java 7程式設計入門經典》一1.4 Java語言

本書使用java語言來講解程式設計的基礎知識。雖然其他程式設計語言也可以用來達到此目的,但是由于以下兩個原因,本書選擇了java:首先,它是世界上使用最廣泛的計算機語言之一。是以從實際的觀點看,它是絕佳的學習語言。其次,它設計和實作了一些特性,這些特性使得對程式設計基礎知識的介紹變得簡單。

但是還有第三個原因。java展現了現代程式設計的許多特點。對java的了解可以使你像專業程式員一樣看待和思考程式設計工作。它是這個時代定義的語言之一。

計算機語言演進是一個正在進行的曆史過程,而java是其中的一個環節。它既從豐富的曆史積澱中繼承到其最佳元素,又因其獨一無二的地位激發出許多創新概念。本書的剩餘部分将在描述java的實用要點的同時,探究其創造的原因與使其成為現在這個樣子的驅動力,并考查它從前人所繼承來的寶貴财富。

java由sun microsystems的james gosling等人于1991年構思而成。最初,這種語言稱為“oak”。在1995年,它重命名為“java”。盡管java如今不可避免地與網絡環境聯系在一起,但是java誕生的原動力卻不是網際網路。其動力源于需要一種與平台無關的語言,由它建立的軟體要能嵌入進衆多消費電子裝置中(如微波爐、遙控器等)。也許你已猜到,不同種類的cpu均可用做消費電子裝置的控制器。但麻煩的是,在當時,幾乎所有的計算機語言設計成隻能編譯成某種特定cpu的機器指令。例如,另外一種語言c++就是如此,它在當時也十分流行(現在也很流行)。

盡管有可能針對任意一種cpu編譯c++程式,但這要求有為那種cpu設計的完整的c++編譯器。這是因為c++通常編譯成由cpu直接運作的機器指令。然而,建立編譯器代價高昂,費時衆多。為了找到更好的解決方案,gosling等人開始緻力于開發一種輕量級、跨平台的語言,能夠産生在不同環境各種cpu下運作的代碼。它們的努力最終導緻了java的誕生。

在詳細開發java的同時,另一股更加重要的力量同時誕生,在未來java的發展中起到了至關重要的作用。這股力量即是網際網路(world wide web)。如果web不與java的實作幾乎同時形成,java也許将還是一種有用但僅僅用于消費電子的不知名程式設計語言。由于web需要可移植的程式,随着web的興起,java也躍至計算機語言設計的風口浪尖。進一步的原因在于,網際網路由各種計算機組成,它們使用不同種類的cpu和作業系統。人們非常希望擁有讓各種各樣的計算機運作相同程式的方法。

直到1993年,java設計團隊的成員發現:為嵌入式控制器建立代碼時經常遇到的可移植性問題在試圖為網際網路建立代碼時也常常遇到。這個現實使得java的重心由消費電子轉移到網際網路程式設計上。是以,盡管java原本起源于開發與架構無關的程式設計語言的需求,但是其實是網際網路最終促使了java的大規模成功。

值得注意的是,java與兩種較早的程式設計語言直接相關。這兩種語言是c語言和c++語言。java從c語言繼承文法。其對象模型由c++改進而來。java與c和c++的關系十分重要。在建立java時,許多程式設計人員熟悉c和c++的文法。這使得c和c++程式員學習java更加容易。反過來說,也使得java程式員學習c和c++語言更加容易。更進一步,java設計人員不需要在許多已經做過的事情上重新白費力氣。它們隻需要移植、改善和充實那些已經成功運用的程式模闆。

由于java和c++的相似之處,特别是在于面向對象程式設計的相似之處,我們有可能會簡單地将java視作網際網路版的c++。但是這也許會帶來誤解。java有着重要的不同。盡管java受c++的影響,但它不是增強版的c++。例如,它不與c++前向或後向相容。另外,java也無意替代c++。java用來解決特定的一些問題,c++用來解決另一些特定的問題。兩者都會在許多年内共存。

《Java 7程式設計入門經典》一1.4 Java語言

網際網路幫助java躍升至程式設計的前沿,而java反過來又對網際網路有深遠的影響。java不但簡化了網際網路程式設計的一般過程,還創造了一種新的網絡程式形式,稱為applet(小應用程式)。在當時,它改變了網絡世界對内容的認識。java也專注于解決與網際網路有關的缺點:可移植性和安全性。下文将更詳細地介紹這兩點。

applet是一種特殊的java程式,它設計于在網際網路上傳輸,然後在與java相容的網絡浏覽器上自動執行。此外,applet可以按需下載下傳。如果使用者點選了含有applet的連結,applet将自動下載下傳并在浏覽器上運作。applet是為小型程式所設計的。它們一般用來顯示伺服器提供的資料、處理使用者輸入、提供在本地執行的(而不是在伺服器上執行的)簡單功能(如貸款電腦等)。本質上,applet允許我們将一些功能從伺服器轉移到用戶端上。它使得更多對象能夠在網絡空間中自由傳送。于是,applet的誕生改變了網際網路程式設計。

盡管applet令人滿意,但它們也在安全性和可移植性領域面臨着挑戰。顯然,應該阻止從客戶機上自動下載下傳和執行的程式做壞事。同時,它必須能夠在各種不同的環境和不同的作業系統下運作。你将會看到,java以一種有效而優雅的方式解決了這些問題。下文将逐一更詳細地介紹這些問題。

你很可能會意識到下載下傳每一個看似正常的程式都伴随着風險,因為下載下傳的代碼可能包括病毒、木馬或其他有害代碼。問題的關鍵在于:倘若惡意代碼能夠非法通路系統資源,它就能帶來損害。例如,病毒也許會通過搜尋計算機的本地檔案系統來收集私人資訊,如信用卡号、銀行賬号、密碼等。java為了能使applet在客戶機上安全下載下傳和執行,必須阻止applet發起這樣的攻擊。

java把applet限制在java執行環境中,不允許其通路計算機的其他部分。這樣就實作了保護功能。在後文将會說明這是怎樣實作的。保證applet能夠無害下載下傳的能力和堅不可摧的安全性是java最重要的特性之一。

在網際網路中,可移植性是一個主要因素。這是因為網絡上連接配接了許多不同種類的計算機和作業系統。java程式要想運作在幾乎所有的連入網際網路的計算機上,它就要有使程式在不同系統上執行的方法。例如,就applet而言,同一applet必須能夠在不同的cpu、作業系統和浏覽器上下載下傳和執行。為不同的計算機準備不同版本的applet是不現實的,同樣的代碼必須在所有的計算機上工作。于是,就需要有一些生成可移植代碼的方法。值得高興的是,幫助實作安全性的方法同樣也能實作可移植性。

允許java同時解決上述安全性和可移植性問題的關鍵是java編譯器并沒有直接輸出可執行的機器指令。與之相反,它輸出位元組碼。位元組碼(bytecode)是一種高度優化的指令集,可由java虛拟機(java virtual machine,jvm)執行。實際上,jvm最初用來做位元組碼的解釋器。由于jvm執行java程式,是以它解決了與web程式有關的主要可移植性和安全性問題。這就是java能夠解決網絡應用主要問題的原因。

将java程式編譯為位元組碼使得程式更容易在不同的環境下運作,因為隻有java虛拟機需要在每個平台上實作。一旦在某個給定系統中有jvm,在其上就可以運作java程式。盡管不同平台上jvm的實作細節并不相同,但是所有解釋器都解釋同一java位元組碼。如果把java程式編譯成本地代碼,同一程式的不同版本就會在連接配接網際網路的不同cpu上運作。這當然不是一個可行的解決方案。于是,由jvm執行位元組碼是建立真正可移植性程式的最簡單的方式。

由jvm執行java程式也能幫助保證安全性。因為jvm掌握着控制權,是以它能包含程式,防止其在系統外産生副作用。java語言的其他限制也增強了安全性。

一般情況下,用虛拟機運作程式會比運作編譯成可執行機器指令的相同程式要慢。但是對于java而言,這兩者的差别并不巨大。因為位元組碼已高度優化,使用位元組碼使jvm能夠運作的比想象中快得多。另外,也可以将位元組碼編譯成機器指令以提升性能。這個編譯過程是瞬時完成的,通過使用位元組碼的即時(just-in-time,jit)編譯器來實作。

jit編譯器是jvm的一部分。它根據需要選取位元組碼片段,将其實時編譯成可執行代碼。在此強調:jit編譯器并不一次性把整個java程式編譯成可執行代碼。此外,jit并不會編譯所有的位元組碼序列。它隻編譯那些能通過編譯獲得好處的代碼。甚至當動态編譯位元組碼時,可移植性和安全性特性依然存在,因為jvm仍然控制着執行環境。

最後說明一點:jvm是java運作時環境的一部分。java運作時環境稱為java runtime environment,其縮寫為jre。

1.4.7 java的演進

隻有一小部分語言組成了程式設計最本質的部分。在這樣的“精英團隊”裡,java由于其快速性和廣泛性鶴立雞群。可以毫不誇張地說,由sun microsystems公布的java 1.0的原始版本引發了程式設計的革命。java不僅使web變成一個高互動性的環境,它還為計算機語言設計樹立了新标準。

多年以來,java持續發展、演進,重新定義自己。不像那些緩慢支援新特性的其他語言,java總是走在計算機語言開發的前沿。其原因之一在于創新的文化和java周邊的變化。于是,java經過了多次更新,其中一些更新相對較小,另一些較重要。

在本書寫作時,java的目前版本稱為java se 7,其附帶的java開發工具包(java development kit)稱為jdk 7。java se 7中的“se”是标準版(standard edition)的意思。java se 7是oracle收購sun microsystems後的第一個主要版本。java se 7包含許多新特性。其中一些新特性将在本書中指出。

《Java 7程式設計入門經典》一1.4 Java語言