程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 為什麼會產生Java,它有哪些特點

為什麼會產生Java,它有哪些特點

編輯:關於JAVA

Java是一種可以編寫跨平台應用軟件的面向對象的程序設計語言,它最初是由Sun公司的James Gosling等人於1991年提出設想並開始設計開發的,第1個版本花費了大約18個月的時間,開始起名為Oak,於1995年更名為Java。到目前為止,Java已經成為一種廣泛使用的網絡編程語言。因為它所編寫的程序不但可以保證安全、穩健且和平台無關的通過網絡傳播,而且更容易編寫、管理和維護,代價也更低。

說起來多少有些令人吃驚,Java的最初推動力並不是網絡,而是源於對平台無關性的需要。Java的前身主要是作為一種用於小家用電器的編程語言,解決諸如電視機、電話、微波爐等家用電器的控制和通信問題。因為在這種小型家用電器中用作控制器的CPU芯片是多種多樣的,當時主流的編程語言C和C++所開發的程序只能一次應用於某一個特定的芯片。盡管可以為所有的CPU芯片編寫各自的程序,但是創建適用於各種CPU芯片的編譯器是一項非常費時費力的工作。為了找到一種簡單而且經濟的方案,Sun公司的Gosling 等人便開始一起致力於開發一種可移植、跨平台的語言,該語言能夠生成運行於不同環境、不同CPU芯片上的代碼。然而,由於這些智能化家電的市場需求沒有預期的高,Sun公司放棄了該項計劃。就在Oak語言幾乎夭折的時候,Internet技術得到了空前的發展,Gosling等人通過和Web技術的對比,看到了Oak語言在計算機網絡上的廣闊應用前景,於是改造了Oak,並在1995年5月23日正式以“Java”的名稱對外發布。同年,Sun公司決定免費向公眾發放Java的開發工具包,並和當時著名的網景公司合作,將Java的虛擬機加入到Nescape浏覽器當中。這一系列舉措都使得Java伴隨著Internet的迅猛發展而發展起來,並逐漸成為重要的Internet編程語言。

要想更好地了解Java為什麼會如此成功,就必須了解它產生的原因、推動它發展的動力,以及它對其他語言的繼承。Java的產生與過去40年中計算機語言的改進和不斷發展密切相關。而每一次語言設計的革新都是因為先前的語言不能解決目前遇到的基本問題而引起,Java也不例外。歸納起來,計算機語言的革新和發展需要兩個基本因素:第一就是它必須適應正在變化的環境和需求,第二就是它必須能夠實現編程藝術的完善與提高。

說到這裡,我們不得不提到C語言。20世紀70年代中期,C語言的出現深刻的影響了整個計算機界,並從根本上改變了編程的方法和思路。可以說,C語言是當時人們不斷追求結構化、高效率的直接結果。然而程序設計語言的發展在這之前又是怎樣的局面呢?主流的編程語言如:匯編語言雖然能夠寫出高效率的程序,但是不便於學習,而且使用和調試匯編程序也相當困難;BASIC語言雖然容易學習,但功能不夠強大,更不用說結構化,這使它根本無法應用到較大的程序中;FORTRAN語言在科學計算應用方面確實可以編寫出相當高效的程序,但它不適於編寫系統程序。盡管當時人們對編程語言實現結構化的要求非常強烈,然而BASIC和FORTRAN等程序設計語言都沒有考慮結構化問題,而是使用GOTO語句作為對程序進行控制的主要方法。這樣一來,用這些語言編寫的程序往往就成了“意大利面條式的程序代碼”,一大堆混亂的跳轉語句和條件分支語句使得程序難以理解,並且給調試工作也帶來了巨大的困難。Pascal語言正是為緩解這一矛盾而出現的,不過雖然Pascal是結構化語言,但是它的設計效率很低,仍然無法編寫系統程序代碼。而當時的情況是,早期的計算機語言開發軟件的效率和功能已經根本無法滿足人們對軟件的需求量日益增加的需要。也就是在這個時候,C語言出現了,它功能強大、高效、滿足結構化要求、簡單易學,而且它的設計、實現、開發是由真正從事編程工作的程序員在考慮了現實編程工作的實際需要後而完成的。它的特性經由實際運用該語言的人們不斷去提煉、測試、思考、再思考,使得C語言最終成為程序員們最喜歡使用的程序設計語言。幸運的是,Java也繼承了這個思想。

正當C語言成為主流的計算機編程語言的時候,問題又出現了,也就是在20世紀80年代初,隨著軟件規模的增大,軟件設計和開發的復雜性日益突出,對於軟件的管理甚至需要依賴於工程學的方法才能夠實現。此時,C語言已經顯得力不從心。因為,許多工程項目的復雜性都超過了結構化方法的極限。為了對程序的復雜性更好地進行管理,面向對象編程(OOP)方法誕生了,這種方法的核心思想是通過使用繼承、封裝和多態性來幫助組織復雜的程序。C++是這一時期非常重要的面向對象程序設計語言,它是在C語言的基礎之上通過增加面向對象的特性來擴充C語言,因此它包括了C語言的所有特征、屬性和優點。這也是C++作為編程語言成功的一個關鍵因素。因為C++的發明並不是企圖創造一種全新的編程語言,而是對一個已經高度成功的編程語言進行改進。正是由於C++既有面向對象的特征,又有C語言高效和格式上的優點,使得它直到現在也是一種可以被廣泛應用的編程語言。然而,語言的發展並沒有結束,互聯網的迅猛發展使得程序設計語言又產生了新的變化,這一變化最終導致了Java的出現。

導致Java出現的根本力量是對程序可移植性的迫切要求。盡管這種要求並不是在互聯網出現之後才有的,而是和程序設計語言的出現幾乎同步,但是由於各種原因,這種需求並不是那麼迫切。然而,隨著Internet和Web技術的出現和繁榮,對程序可移植性的要求變得重要且緊迫起來。這是因為,互聯網中存在著大量不同的、分布式的系統,這其中包括了各種類型的計算機、操作系統和CPU芯片。人們雖然實現了各種類型的平台都可以和互聯網進行連接,共享資源,但是還無法在各種平台上運行同樣的程序。因此,可以這麼說,中立體系結構編程語言的需要是促使Java誕生的主要動力,而Internet最終導致了Java的成功。

實際上,Java的大部分特性都是從C和C++中繼承而來的,這也是Java成功的一個方面。Java的設計人員覺得,在新語言中使用熟悉的C語法及模仿C++面向對象的特性,將使他們的編程語言對經驗豐富的C和C++程序員有更大的吸引力。而且,Java的設計和測試工作是由真正從事編程工作的人員完成,它源於設計它的人員的需要和經驗,因而也是一種程序員自己的語言。可以說,Java是一種在各方面性能表現都很好的編程語言,它的特點可以表現在以下幾個方面。

1 / 簡單

Java是一種面向對象的程序設計語言,只要學過C或者C++,那麼學習Java也會非常容易,因為Java繼承C和C++的語法以及許多C++面向對象的特性。當然,即使沒有學過其他程序設計語言,學習Java也不是很難,因為Java的設計目的就是讓程序員或者准程序員覺得既易學又好用。Java簡單的另一個方面是它摒棄了C++中許多容易出錯和混淆的概念,如指針、運算符重載、多重繼承等,取而代之的是通過其他更清楚、更易理解的方式來實現。此外,Java還通過實現自動垃圾回收機制而大大簡化了程序設計人員對內存的管理工作,減少了錯誤的發生。

2 / 面向對象

Java語言借鑒了近幾十年來所有面向對象程序設計語言的優點。提供了簡單的類機制和動態靈活的接口模型,使得開發工作完全集中於對象本身和接口的設計。通過對對象狀態以及行為的封裝實現了信息的有效隱藏和模塊化要求。通過類的繼承機制實現了向上對問題域的高度抽象以及向下對程序代碼的有效復用。可以說,Java保證了對象模型既簡單又容易擴展。

3 / 穩健性與安全性

在設計Java的時候,最優先考慮的就是怎樣才能創建出穩健的、安全可靠的程序,這是因為在網絡這個多平台的環境中,程序必須得到可靠的執行。為了實現這個目標,Java被設計成一種嚴格類型檢查的語言,它不但在編譯時對代碼進行檢查,而且在運行程序時也會對可能出現的問題進行檢查,這樣就可以及早地發現錯誤並進行消除。其實,程序失敗的原因無外乎以下兩種:內存管理錯誤和誤操作引起的異常情況。

使用C和C++編寫的程序雖然效率很高,但是很多復雜的工作都需要程序員自己來實現。比如內存的管理,C和C++的程序員必須手工分配並且釋放所有的動態內存,這樣做就會導致一些問題,如程序員可能忘記釋放原來分配過的內存,或者釋放了其他部分程序正在使用的內存。為了從根本上消除這些問題,Java提供了自動垃圾回收機制來幫助程序員管理內存的分配和釋放,從而將程序員從復雜、乏味的內存管理工作中解脫出來。

此外,類似於“被零除”、“數組下標越界”或者“文件未找到”這樣的誤操作也經常在程序中發生。如果程序員在C或者C++中要避免這類問題發生,必須編寫一大堆難以理解的指令。而Java完全不必這樣去做,它通過集成的面向對象的異常處理機制來對可能出現但未被處理的異常進行提示,從而更好的對運行時錯誤進行管理以防止系統崩潰。另外,Java在編譯時還可以捕獲類型聲明中的許多常見錯誤,從而防止動態運行時不匹配問題的出現。

在Java中,限制對指針的使用也是保證程序安全可靠的重要原因之一。Java規定一切對內存的訪問都必須通過對象的實例變量來實現,實例變量中的內容其實就是指針,只不過Java不允許程序員對其進行刪除和計算,這樣一來就可以避免從外部在未授權的情況下訪問對象的私有成員,也可以避免由於對指針的錯誤操作而引起的不必要的麻煩。

下載小應用程序並能確保它對客戶機的安全性不會造成危害也是Java安全可靠的一個重要的方面。也就是說,每當使用一個兼容Java的Web浏覽器時,你可以安全地下載Java小應用程序。這是因為,Java將小應用程序限制在Java的運行環境中,不允許它訪問客戶機的其他部分,就像是在網絡應用程序和計算機之間提供了一道防火牆,從而不必擔心病毒的感染或其他惡意的企圖了。

4 / 多線程

Java的設計目標之一是為了滿足人們能夠在互聯網上創建運行平穩的交互式程序的需要,這就要求Java編寫的應用程序能夠同時執行多個任務。為了更好地管理多任務,Java提供了對多線程編程的內嵌支持。多線程使應用程序能夠並行執行,而且同步機制保證了對共享數據的正確操作。通過使用多線程,程序設計人員可以分別用不同的線程完成特定的功能,而不需要采用全局的事件循環機制,這樣就能很容易地實現網絡上的實時交互功能。而且,多線程還能夠最大限度地利用CPU資源。這在用Java操作交互的、網絡環境下的應用程序時也顯得非常重要。

5 / 體系結構中立和可移植性

程序員面臨的一個主要問題是,不能保證今天編寫的程序明天能否在同一台機器上順利運行,更不能保證在這台機器上編寫的程序能否在其他機器上順利運行。這是因為操作系統升級、處理器升級以及核心系統資源的變化,都可能導致程序無法繼續運行。Java通過虛擬機的實現來保證Java語言編寫的程序對每種計算機都一樣的運行。比如,簡單的類型都是不變的:整數總是32位,長整數總是64位。令人奇怪的是,諸如C及C++等主流的編程語言卻不是這樣。由於這些語言定義如此自由,每種編譯器及開發環境便各有不同了,這使程序的移植成為非常棘手的問題。Java程序的移植卻很容易,而且不需要進行重新編譯。這是因為Java能夠通過自身的編譯器將源程序生成與體系結構無關的字節碼指令,只要安裝了Java虛擬機,這種字節碼指令就可以根據對應於Java虛擬機中的表示,轉換成本地的機器碼,然後就可以在任意的平台上運行了。

與平台無關的特性使Java程序可以方便地被移植到網絡上的不同機器。同時,Java的類庫中也實現了與不同平台的接口,使這些類庫可以自由地移植。可以這麼說,Java真正實現了“一次編譯、到處運行”的設計目標,使程序的可移植性從夢想變成了現實。

6 / 解釋性和高性能

當運行Java程序時,它首先被編譯成字節碼,然後通過Java解釋器直接對Java字節碼進行解釋執行。雖然這個過程是解釋執行的,但是由於字節碼的設計並不專門針對任何一種特定的機器,而是非常類似於機器指令的指令編碼。因而通過Java的虛擬機就可以很容易的直接將字節碼轉換成對應於特定CPU的機器碼,從而得到較高的性能。這種轉換的效率比其他解釋性語言如Basic、Perl等要高得多,甚至在非常低檔的CPU上也能順利運行。不過Java畢竟是解釋性的語言,它解釋執行的意義在於能夠實現程序一經編譯便可在眾多不同的計算機上執行的跨平台運行。雖然這比C程序慢了許多,但在大多數應用中都是可以接受的。而且,現在Java也已經有了專門的代碼生成器,可以很容易使用JIT編譯技術將字節碼直接轉換成高性能的本機代碼。值得一提的是,Java運行時系統在提供這個特性的同時仍具有平台獨立性,因而“高效且跨平台”對Java來說不再矛盾。

7 / 分布式

能夠在Internet的分布式環境中運行Java程序也是Java的設計目標之一。特別是它提供了用於處理TCP/IP協議的專用類庫,這樣用戶就可以通過URl地址存取資源,並且還可以很方便的在網絡上訪問其他對象。

8 / 動態性

Java從一開始就被設計成動態地、可擴展的面向對象程序設計語言,這一優勢可使它適合於一個不斷發展的環境。程序員可以在類庫中自由地加入新的方法和實例變量而不會影響用戶程序的執行。並且Java通過接口來支持多重繼承,使之比嚴格的類繼承具有更靈活的方式和擴展性。此外,Java的動態性特征也為小應用程序在運行時可以動態地更新提供了保障。

由於Java和C++之間的相似性,容易使人們將Java簡單地想象為“C++的增強版本”。但其實這是一種誤解。Java在各個方面都與C++有重要的不同。Java的出現也並不是用來取代C++的,設計Java是為了解決某些特定的問題,而設計C++是為了解決另外一類完全不同的問題。兩者將長時間共存。那麼Java和C++都有哪些區別呢?下面僅列出一些比較明顯的區別:

1 / 數據類型及類

Java是完全面向對象的語言,所有函數和變量必須是類的一部分。除了基本數據類型之外,其余的都作為類對象,包括數組和字符串。對象將數據和方法結合起來,把它們封裝在類中,這樣每個對象都可擁有自己的屬性和行為。而C++允許將函數和變量定義為全局的。此外,Java中取消了C/C++中的結構體和聯合,消除了不必要的麻煩。

2 / 類型轉換 

Java和C/C++都具有自動類型轉換的機制,但是在強制類型轉換方面,則有所不同。例如,在C++中可以隱含的將浮點數賦予整型變量,通過去掉其尾數來實現。Java則不支持這種自動強制類型轉換,如果需要,必須由程序顯式進行強制類型轉換。

3 / 指針

Java語言讓程序設計人員無法直接訪問和修改指針,而且通過自動內存管理功能有效地防止類似於C/C++語言中對指針的誤操作。但是這並不是說Java沒有指針,而是這種指針只能供Java虛擬機內部使用,而不能由程序員使用罷了,這些限制都大大增強了Java程序的安全性。

4 / 預處理功能 

C/C++在編譯過程中都有一個預編譯階段。預處理階段可以為開發人員提供方便,但增加了編譯的復雜性。但是Java不支持預處理功能,Java虛擬機通過提供引入語句(import)來實現和C/C++的預編譯功能相似的作用。

5 / 多重繼承 

C++支持多重繼承,它允許一個類繼承多個父類。盡管多重繼承功能很強,但使用復雜,而且會引起許多麻煩,編譯程序實現它也很不容易。Java為了避免這些問題,取消了對多重繼承的支持,為了平衡對語言本身造成的損失,Java通過允許一個類可以實現多個接口的方式來達到類似於C++多重繼承的功能。

6 / 自動內存管理

Java程序中所有的對象都是用new操作符建立在內存的堆中,這個操作符類似於C++的new操作符,但是對無用對象的刪除方式卻是完全不同的。在Java中,當一個對象不再被使用時,不用程序員自己來進行刪除,Java會自動進行無用內存回收操作,這個操作是以線程的方式在後台運行的。而C++中必須由程序員自己編寫代碼來釋放內存資源,這顯然會增加程序設計人員的負擔。

7 / 字符串

在C/C++中不支持字符串變量,Java中雖然有字符串類型,但是是以對象的形式存在的。這樣做有許多好處,比如:我們在整個系統中對建立字符串和訪問字符串元素的方法時一致的;以類對象的方式存在,可以在程序執行時進行有效的檢查,並有助於排除運行時錯誤的發生;對字符串可以通過“+”進行連接操作,從而便於字符串和非字符串之間的合並。

8 / 異常 

Java提供了強大的異常處理機制用於捕獲程序運行時錯誤,但是卻不需要程序員編寫非常復雜的代碼。因為,幾乎程序中所有可能遇到的異常都被Java自動地進行處理,我們只需要在可能發生異常的代碼前後用try…catch語句聲明就可以了,顯然這種處理工作增強了系統的容錯能力。而C++則沒有如此方便的針對異常的處理機制。

9 / 操作符重載

Java不支持操作符重載。操作符重載被認為是C++的突出特征。在Java中,雖然類大體上可以實現這樣的功能,但操作符重載的方便性仍然丟失了不少。Java不支持操作符重載是為了保持Java盡可能簡單。

無論怎樣,Java和C++都是面向對象語言。也就是說,它們都能夠實現面向對象的思想(封裝、繼承和多態)。由於C++為了照顧大量的C語言使用者而兼容了C,使得自身僅僅成為了帶類的C語言,多多少少影響了其面向對象的徹底性。Java則是完全的面向對象語言,它語法更清晰,規模更小,更易學。它是在對多種程序設計語言進行了深入細致研究的基礎上出現的,不但摒棄了其他語言的不足之處,而且從根本上解決了C++語言中所固有的缺陷。

可以這麼說,環境的變化促使Java這種獨立於平台的語言注定成為Internet上的分布式編程語言。同時,Java也改變了人們的編程方式,特別是Java對C++使用的面向對象范例進行的增強和完善。所以,Java不是孤立存在的一種語言,而是計算機語言多年來的演變結果。僅這個事實就足以證明Java在計算機語言歷史上的地位。Java對Internet編程的影響就如同C語言對系統編程的影響一樣,因而有人預言:“Java語言的出現,將會引起一場軟件革命”一點也不為過。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved