| Java | |
|---|---|
| 編程范型: | Object-oriented, structured, imperative |
| 面市時間: | 1990年代 |
| 設計者: | 昇陽電腦 |
| 型態系統: | Static, strong, safe, nominative |
| 主要實作產品: | Numerous |
| 啟發語言: | Objective-C, C++, Smalltalk, Eiffel, C#[1] |
| 影響語言: | C#, D, J#, PHP, Ada 2005 |
| 作業系統: | 跨平臺 |
| 網站: | http://www.java.com/ |
Java,是一種可以撰寫跨平臺應用軟體的物件導向的程式語言,由昇陽(Sun Microsystems)公司的詹姆斯·高斯林(James Gosling)等人於1990年代初開發。它最初被命名為Oak,目標設定在家用電器等小型系統的程式設計語言,來解決諸如電視機、電話、鬧鐘、烤麵包機等家用電器的控制和通訊問題。由於這些智慧型家電的市場需求沒有預期的高,Sun放棄了該項計劃。就在Oak幾近失敗之時,隨著網際網路的發展,Sun看到了Oak在電腦網路上的廣闊應用前景,於是改造了Oak,在1995年5月以「Java」的名稱正式發佈了。Java伴隨著網際網路的迅猛發展而發展,逐漸成為重要的網路程式語言。
Java 程式語言的風格十分接近C++語言。繼承了 C++ 語言物件導向技術的核心,Java捨棄了C++語言中容易引起錯誤的指標(以參照取代)、運算符重載(operator overloading)、多重繼承(以介面取代)等特性,增加了垃圾回收器功能用於回收不再被參照的對象所佔據的內存空間。在 Java SE 1.5 版本中Java又引入了泛型程式設計(Generic Programming)、類型安全的枚舉、不定長參數和自動裝/拆箱等語言特性。
Java不同於一般的編譯執行電腦語言和解釋執行電腦語言。它首先將原始碼編譯成位元組碼(bytecode),然後依賴各種不同平臺上的虛擬機來解釋執行位元組碼,從而實現了「一次編譯、到處執行」的跨平臺特性。不過,這同時也在一定程度上降低了 Java 程序的運行效率。但在J2SE1.4.2發佈後,Java的執行速度有了大幅提升。
與傳統程序不同,Sun 公司在推出 Java 之際就將其作為一種開放的技術。全球數以萬計的 Java 開發公司被要求所設計的 Java 軟體必須相互兼容。「Java 語言靠群體的力量而非公司的力量」是 Sun 公司的口號之一,並獲得了廣大軟體開發商的認同。這與微軟公司所倡導的注重精英和封閉式的模式完全不同。
Sun公司對Java程式語言的解釋是:Java程式語言是個簡單、物件導向、分散式、解釋性、健壯、安全與系統無關、可移植、高性能、多執行緒和動態的語言。
Java平臺是基於Java語言的平臺。這樣的平臺目前非常流行,因此微軟公司推出了與之競爭的.NET平臺以及模仿Java的C#語言。
目錄 |
Java平臺和語言最開始只是昇陽公司在1990年12月開始研究的一個內部項目。昇陽公司的一個叫做派屈克·諾頓的工程師被昇陽自己開發的C++和C語言編譯器搞得焦頭爛額,因為其中的API極其難用。派屈克決定改用NeXT,同時他也獲得了研究公司的一個叫做「Stealth 計劃」的項目的機會。
「Stealth 計劃」後來改名為「Green計劃」,詹姆斯·高斯林和麥克·舍林丹也加入了派屈克的工作小組。他們和其他幾個工程師一起在加利福尼亞州門羅帕克市沙丘路的一個小工作室裡面研究開發新技術,瞄準下一代智能家電(如微波爐)的程序設計,昇陽公司預料未來科技將在家用電器領域大顯身手。團隊最初考慮使用C++語言,但是很多成員包括昇陽的首席科學家比爾·喬伊,發現C++和可用的API在某些方面存在很大問題。
工作小組使用的是內嵌類型平臺,可以用的資源極其有限。很多成員發現C++太複雜以至很多開發者經常錯誤使用。他們發現C++缺少垃圾回收系統,還有可移植的安全性、分佈程序設計、和多執行緒功能。最後,他們想要一種易於移植到各種設備上的平臺。
根據可用的資金,比爾·喬伊決定開發一種集C語言和Mesa語言大成的新語言,在一份報告上,喬伊把它叫做「未來」,他提議昇陽公司的工程師應該在C++的基礎上,開發一種物件導向的環境。最初,高斯林試圖修改和擴展C++的功能,他自己稱這種新語言為 C++ ++ --,但是後來他放棄了。他將要創造出一種全新的語言,被他命名為「Oak」(橡樹),以他的辦公室外的樹而命名。
就像很多開發新技術的秘密的工程一樣,工作小組沒日沒夜地工作到了1992年的夏天,他們能夠演示新平臺的一部分了,包括Green作業系統,Oak的程式語言,類庫,和其硬體。最初的嘗試是面向一種類PDA設備,被命名為Star7,這種設備有鮮艷的圖形界面和被稱為「Duke」的智能代理來幫助用戶。1992年12月3日,這台設備進行了展示。
同年11月,Green計劃被轉化成了「FirstPerson有限公司」,一個昇陽公司的全資子公司,團隊也被重新安排到了帕洛阿爾托。FirstPerson團隊對建造一種高度互動的設備感興趣,當時代華納發佈了一個關於電視機頂盒的徵求提議書時(Request for proposal),FirstPerson改變了他們的目標,作為對徵求意見書的響應, 提出了一個機頂盒平臺的提議。但是有線電視業界覺得FirstPerson的平臺給予用戶過多地控制權,因此FirstPerson的投標敗給了SGI。與3DO 公司的另外一筆關於機頂盒的交易也沒有成功,由於他們的平臺不能在電視工業產生任何效益,公司再並回昇陽公司。
1994年6月、7月間,在經歷了一場歷時三天的頭腦風暴的討論後,約翰·蓋吉、詹姆斯·高斯林、比爾·喬伊、派屈克·諾頓、韋恩·羅斯因和埃里克·斯庫米,團隊決定再一次改變了努力的目標,這次他們決定將該技術應用於全球資訊網。他們認為隨著Mosaic瀏覽器的到來,網際網路正在向同樣的高度互動的遠景演變,而這一遠景正是他們在有線電視網中看到的。作為原型,派屈克·諾頓寫了一個小型全球資訊網瀏覽器,WebRunner,後來改名為HotJava。
同年,Oak改名為Java。商標搜索顯示,Oak已被一家顯示卡製造商註冊,因此團隊找到了一個新名字。這個名字是在很多成員常去的本地咖啡館中杜撰出來的。名字是不是首字母縮寫還不清楚,很大程度上來說不是。雖然有人聲稱是開發人員名字的組合:James Gosling(詹姆斯·高斯林)+Arthur Van Hoff(阿瑟·凡·霍夫)+Andy Bechtolsheim(安迪·貝克托克姆),或「Just Another Vague Acronym」(只是另外一個含糊的縮寫)。還有一種比較可信的說法是這個名字是出於對咖啡的喜愛,所以以Java咖啡來命名。類文件的前四個位元組如果用十六進位閱讀的話,分別為CA FE BA BE, 就會拼出兩個單詞「CAFE BABE」(咖啡寶貝)[2]。
1994年10月,HotJava和Java平臺為公司高層進行演示。1994年,Java 1.0a版本已經可以提供下載,但是Java和HotJava瀏覽器的第一次公開發佈卻是在1995年3月23日SunWorld大會上進行的。昇陽公司的科學指導約翰·蓋吉宣告Java技術。這個發佈是與網景公司的執行副總裁馬克·安德森的驚人發佈一起進行的,宣佈網景將在其瀏覽器中包含對Java的支持。1996年1月,昇陽公司成立了Java業務集團,專門開發Java技術。
在流行幾年之後,Java在瀏覽器中的地位被逐步侵蝕。它在簡單交互性動畫方面的用途已經完全被Adobe公司的Flash排擠,2005年Java傾向只被用於雅虎遊戲那樣的更為複雜的應用程序。Java同時遭受到來自微軟的反對,他們決定在新版本的Internet Explorer和Windows中不再附帶Java平臺。
與此相反。在全球資訊網的伺服器端和手持設備上,Java變得更加流行。很多網站在前端使用JSP和其他的Java技術。
在桌面系統上,獨立的Java程序還是相對少見,這是因為Java平臺的運行開銷較大,而許多人的電腦上沒有安裝Java,由於網路頻寬在以前較小,下載Java曾經是個耗時的事情。但是隨著電腦計算能力、網路頻寬在10年中取得了很大的進步,同時虛擬機和編譯器的質量得到了越高,許多應用程序得到了廣泛的使用,包括:
開源軟體:
閉源軟體:
還有許多用Java寫的軟體,可以在 http://www.java.com 找到。 在以下網頁可以看到非常多用Java寫的程序: http://java.sun.com/products/ 下面有大量用Java Swing開發的桌面Java程序 http://java.sun.com/products/jfc/tsc/sightings/ 目前Java提供以下三個版本:
以上為Java各種版本的SUN公司官方中文翻譯方式:http://cn.sun.com/press/jun2005/20050627-6.html
Java之所以被開發,是要達到以下五個:
Java技術主要分成幾個部分:Java語言、運行環境JVM、類庫。一般情況下說Java時並不區分指的是哪個部分。
Java的特點之一就是物件導向,是程序設計方法的一種。「物件導向程式語言」的核心之一就是開發者在設計軟體的時候可以使用自定義的類型和關聯操作。代碼和數據的實際集合體叫做「對象」。一個對象可以想象成綁定了很多「行為(代碼)」和「狀態(數據)」的物體。對於資料結構的改變需要和代碼進行通信然後操作,反之亦然。物件導向設計讓大型軟體工程的計劃和設計變得更容易管理,能增強工程的健康度,減少失敗工程的數量。
物件導向設計另外一個目標就是能產生很多的有關聯的類,可以讓軟體的再開發變得簡單。舉例來說,很多軟體工程都有同樣的功能,尤其是很多應用了同一原理組織的軟體工程。軟體的二次開發者想自己為軟體開發外掛程式以增強功能的時候,絕對不想看到混亂的開發代碼和管理計劃。物件導向的目的就是不生產難懂且難以使用的代碼,為軟體各個功能群之間建立有效的通信通道。很多開源軟體社區正在計劃給軟體作者提供更多的類來讓軟體的二次開發變得簡便
Java語言的第二個特性就是跨平臺性,也就是說使用Java語言編寫的程序可以在編譯後不用經過任何更改,就能在任何硬體設備條件下運行。這個特性經常被稱為「一次編譯,到處運行」。
實現跨平臺性的方法是大多數編譯器在進行Java語言程序的編碼時候會生成一個用位元組碼(Bytecode)寫成的「半成品」,這個「半成品」會在Java虛擬機(解釋層)的幫助下運行,虛擬機會把它轉換成當前所處硬體平臺的原始代碼。之後,Java虛擬機會打開標準庫,進行數據(圖片、執行緒和網路)的存取工作。主要注意的是,儘管已經存在一個進行代碼翻譯的解釋層,有些時候Java的位元組碼代碼還是會被JIT編譯器進行二次編譯。
有些編譯器,比如GCJ,可以自動生成原始代碼而不需要解釋層。但是這些編譯器所生成的代碼只能應用於特定平臺。並且GCJ目前只支持部分的Java API。
昇陽對於Java的許可是「全兼容的」,這也導致了微軟和昇陽關於微軟的程序不支持RMI和JNI介面、並且增加特性為己所用的法律爭端。昇陽最終贏得了官司,獲得了大約兩千萬美元的賠償,法院強制要求微軟執行昇陽公司關於Java的許可要求。作為回應,微軟不再在Windows系統中捆綁Java,最新的Windows版本,Windows Vista和Internet Explorer 7.0版本也不再提供對於Java應用程序和控制項的支持。但是昇陽公司和其他使用Java運行時系統的公司對於微軟的操作對用戶提供無償的第三方外掛程式和程序支持。
Java語言使用解釋層最初是為了輕巧性。所以這些程序的運行效率比C語言和C++要低很多,用戶也對此頗有微詞。很多最近的調查顯示Java的程序運行速度比幾年前要高出許多,有些同樣功能的程序的效率甚至超過了C++和C語言編寫的程序。
Java語言在最開始應用的時候是沒有解釋層的,所有需要編譯的代碼都直接轉換成機器的原始代碼。這樣做的後果就是獲得了最佳的性能,但是程序臃腫異常。從JIT技術開始,Java的程序都經過一次轉換之後才變成機器碼。很多老牌的第三方虛擬機都使用一種叫做「動態編譯」的技術,也就是說虛擬機實時監測和分析程序的運行行為,同時選擇性地對程序所需要的部分進行編譯和優化。所有這些技術都改善了代碼的運行速度,但是又不會讓程序的體積變得失常。
程序的輕便性事實上是軟體編寫很難達到的一個目標,Java雖然成功地實現了「一次編譯,到處運行」,但是由於平臺和平臺之間的差異,所編寫的程序在轉換代碼的時候難免會出現微小的、不可察覺的錯誤和意外。有些程式設計師對此非常頭疼,他們嘲笑Java的程序不是「一次編譯,到處運行」,而是「一次編譯,到處調試」。
平臺無關性讓Java在伺服器端軟體領域非常成功。很多伺服器端軟體都使用Java或相關技術建立。
C++語言被用戶詬病的原因之一就是大多數C++編譯器不支持垃圾收集機制。通常使用C++程式設計的時候,程式設計師所創建的對象在創建時在本地堆疊上分配一塊內存地址,當不需要這個對象,進行析構或者刪除的時候再釋放分配的內存地址。如果對象是在堆上分配的,而程式設計師又忘記進行地址刪除,那麼就會造成內存泄漏(Memory Leak)。長此以往,程序運行的時候可能會生成很多不清除的垃圾,浪費了不必要的內存空間。更糟糕的是,如果同一內存地址被刪除兩次的話,程序會變得不穩定,甚至崩潰。因此有經驗的C++程式設計師都會在刪除之後將指標重置為0,然後在刪除之前先判斷指標是否為0。
Java語言則不同,上述的情況被自動垃圾收集功能自動處理。對象的建立和放置都是在內存堆上面進行的。程序或者其他的對象可以鎖定一塊堆地址來進行其他對象的參照。當一個對象沒有任何參照的時候,Java的自動垃圾收集機制就發揮作用,自動刪除這個對象所占用的空間,釋放內存以避免內存泄漏。但是內存泄漏並不是就此避免了,當程式設計師疏忽大意地忘記解除一個對象不應該有的參照的時候,內存泄漏仍然不可避免,不過發生的幾率要比不啟用垃圾收集機制的C++程序少很多。但是總體來講,自動垃圾收集機制要安全和簡單許多。
不同廠商、不同版本的JVM中的內存垃圾回收機制並不完全一樣,通常越新版本的內存回收機制越快,IBM、BEA、SUN等等開發JVM的公司都曾宣稱過自己製造出了世界上最快的JVM, JVM性能的世界紀錄也在不斷的被打破並提高。
IBM有一篇有關Java內存回收機制比不啟用垃圾收集機制的C++內存處理快數倍的技術文章,可在如下網址找到:
http://www-128.ibm.com/developerworks/cn/java/j-jtp09275.html
而著名的Java技術書籍《Java程式設計思想》(《Thinking in Java》)也有一段論述Java內存及性能達到甚至超過C++的章節:
http://www.sdau.edu.cn/support/thinkinjava/chapter/appe.htm
但是應該注意到,C++中也可以使用「智能指標」(Smart Pointer)或者使用C++托管擴展編譯器的方法來實現自動化內存釋放,智能指標可以在標準類庫中找到,而C++托管擴展被微軟的Visual C++ 7.0及以上版本所支持。智能指標的優點是不需引入緩慢的垃圾收集機制,而且可以不考慮執行緒安全的問題,但是缺點是如果不善使用智能指標的話,性能有可能不如垃圾收集機制,而且不斷地分配和釋放內存可能造成內存碎片,需要手動對堆進行壓縮。除此之外,由於智能指標是一個基於模板的功能,所以沒有經驗的程式設計師在需要使用多態特性進行自動清理時也可能束手無策。
當然,作為一個「負責任」的程式編撰員,在程式完結前應該手動清理不再需要的變數和物件,令效能有點提升。以Java為例,finalize方法位於 Java.Object 內,而Object 這個類是每一個類自動承繼的。因此清理需要的便是覆寫finalize便行了
protected void finalize() throws Throwable{
super.finalize();
}
當中若有任何變數要清理,可以在super.finalize() 前加上 <變數> = null; 或 <所屬的Class>.<變數> = null;
不過事實上,就算使用了 finalize(),你還是不能保證你在堆疊中所使用的空間會馬上被回收,垃圾回收機制只有在你的你堆疊已經毫無空間可以使用的情況下,才會真的去進行回收的動作,因此在程式設計上,還是要避免記憶體空間的浪費。
Java自帶了創建介面的類別,可以這樣使用:
public interface Deleteable {
void delete();
}
這段代碼的意思是任何實現(implement)Deleteable介面的類別都必須實現delete()方法。每個類別對這個方法的實現可以自行定製。由此概念可以引出很多種使用方法,下面是一個類別的例子:
public class Fred implements Deleteable {
//Must include the delete () method to satisfy the Deleteable interface
public void delete() { //code implementation goes here
}
//Can also include other methods
public void doOtherStuff() {
}
}
在另外一個類別中,可以使用這樣的代碼:
public void deleteAll (Deleteable [] list) {
for (int i = 0; i < list.length; i++) {
list[i].delete();
}
}
因為隊列中所有的對象都可以使用delete()方法。Deleteable隊列中包含Fred對象的參照,而這個類別和其他Deleteable類別在使用deleteAll()方法時候不需要進行任何改變。
之所以這樣做就是為了在介面的執行和其代碼之間進行區別。舉例來說,一個名叫Collection的介面可以包含任何對象所需要的引入、轉換和存儲數據的方法,其他的類都可以使用這個介面。但是這個介面可以是一個可重定義大小的隊列、一個鏈表或者是其他功能的集合。
這種特性其實是一種折中的辦法。Java的設計者們不想讓Java有多重繼承的特性,因為C++的多重繼承顯示了這種特性的困難。Java的介面功能可以提供同樣的功能,但是又不會很複雜。
沒有自動裝箱/拆箱:
int int1 = 1; Integer integer2 = new Integer(int1); int int3 = integer2.intValue();
有自動裝箱/拆箱:
int int1 = 1; Integer integer2 = int1; // 自動裝箱 int int3 = integer2; // 自動拆箱
泛型就像是C++的模板。原有的Collection API加上泛型支援後,增加對型別的檢查,減少程式錯誤的機會。
沒有泛型:
HashMap hm = new HashMap(); int i=1; String tt="test"; hm.put(new Integer(i), tt);
使用Generic:
HashMap <Integer, String>hm = new HashMap<Integer, String>(); int i=1; String tt = "test"; hm.put(i, tt); // 在這裏對int自動裝箱成Integer,也使用了參數的型別檢查
自動裝箱的新功能,可能是從C#語言身上學習來的,Java 已經越來越像C#。然而Java對自動裝箱/拆箱的支援,僅是利用編譯器實現,在Java Bytecode 中,並無自動裝箱/拆箱的操作碼 (opcode)。
Annotation全名是Program Annotation Facility ,是Java SE 5.0的新功能。Java 的 Annotation 類似於 .NET 的屬性 (Attribute)。Java 的註釋是一種介面 (interface),繼承自 java.lang.annotation.Annotation。Class File 則貼上 ACC_ANNOTATION 標籤。
// JDK 1.4
/**
* @todo to be implemented
**/
void gimmeSomeLoving() {
throw new Exception("not implemented");
}
// JDK 1.5
@todo void gimmeSomeLoving() {
throw new Exception("not implemented");
}
枚舉類型也是J2SE 5.0的新功能。過去 Java 認為 enum 的關鍵字是不必要的功能,因為用 public static int field 就可以取代 enum,因此過去一直不用。J2SE 5.0中的 class 如果是 enum,在 class file 中會被貼上一個 ACC_ENUM 標籤。
// JDK 1.4
class JavaTech {
public static final int J2ME = 1;
public static final int J2SE = 2;
public static final int J2EE = 3;
}
// JDK 1.5
public enum NewJavaTech {
J2ME, J2SE, J2EE
}
試試用位於 java.io 套件 (package) 內的BufferedReader。請緊記要 import java.io.*;。尾部"*"是指示要 import 所有位於 java.io 內的類別,。
import java.io.*;
public class TestRead{
public static void main(String[] args) throws IOException{
BufferedReader bufread = new BufferedReader(System.in);
String str;
System.out.print("請輸入一句字串");
str = bufread.readLine();
System.out.println(str);
}
}
程式碼解說: import java.io.* 是把整個套件「打開」,那麼你便可以承繼該套件的類別,用內裡的類別創建一個物件。其實 java.io.* 是預設 import 的,不過 Eclipse 會要求 import java.io 所以功夫不可小!
public class TestRead 是宣告一個「公開」的 class(類別),而名字是TestRead 。
public static void main(String[] args) 是一個主程式。雖然是 Method ,但 main method 對於 Java 執行器來說是第一個執行程式的地方,同樣離開了 main method 就等如離開了程式。main method 的宣告式是要背的,當然是有解,不過暫且不說。
BufferedReader bufread = new BufferedReader(System.in) 在此創建一個以 BufferedReader 為藍圖的物件 bufread ,bufread名字是任你定的。詳細來說是第一個BufferedReader 是宣告 bufread 是一個會「存儲」一個BufferedReader類的物件。new BufferedReader(System.in) 是指創建一個 BufferedReader 的物件。由於BufferedReader 需要一個輸入流,因此我們指定了 System.in 給 BufferedReader。
在Java語言中,應用程序介面(API)化身成類別,並且分組成為套件。每個包中包含有相關的介面和類。對於不同的平臺,Java提供了不同版本的包。
API的設定由昇陽公司和其他公司通過JCP(Java社群程序)決定。任何公司和個人都可以參與這個工程,對API進行設計。
2004年,IBM和BEA公司準備聯合對官方的Java開源軟體工程進行支持,但是2005年初,昇陽公司拒絕了這個支持。
下面這個程序顯示「Hello, world!」然後結束運行:
public class HelloWorld { public static void main(String[] args) { System.out.println("Hello, world!"); } }
Java語言嚴格區分位元組和字元。字元的存儲格式為UCS-2,從Java 5開始支持UTF-16字元。Java的程序遂可以使用Unicode字元進行書寫。
下面就是一個合法的Java程序,裡面包含了中文字元作為類的名稱而不是字元串,這個程序可以在編譯器中運行通過。
public class 哈囉世界 { private string 文本 = "哈囉世界"; }
任何程式語言都免不了要定義變數,JAVA也不例外。JAVA的變數聲明形式如下:
type name;
其中的type是數據類型名,name指定義的該數據類型的一個具體變數。
JAVA的內置數據類型主要有如下幾種:
| 此條目可能需要進行清理,以符合維基百科的品質標準。(2008年1月24日) 請盡量協助改善這篇條目,詳細信息請參見討論頁。 |
Java試圖通過新的方式解決軟體編寫的複雜性。很多人認為Java語言做到了它承諾的一切。但是Java並不是一門完美的語言。
使用Swing平臺編寫的帶有GUI(圖形用戶介面)的程式和其他原始程式非常不同。選用AWT工具包編寫程式的程式師看到的都是原始介面,而且也無法獲得先進的GUI編程支援,如果使用的話,就要提供每個平臺上面所需的API,這將是一項龐大的工程。Swing則是完全用Java語言所寫的程式,避免了介面元素重複的問題,只使用所有平臺都支持的最基本的繪圖機制。但是很多用戶不知道如何在Java風格和Windows風格之間進行轉換,結果造成了Java程式的介面在很多程式中非常特殊。蘋果電腦已經提供了優化過的Java運行時程式,包含了Mac OS X的經典Aqua介面風格。
由於Java編譯器和虛擬機的不同對Java代碼的性能影響比語言本身的影響大的多,所以統一討論Java的程式的性能經常是有誤導性的。據IBM的資料,在同樣的硬體上2001年時的IBM JDK版本的性能是1996年的JDK版本的十倍左右。見IBM東京研究院的資料: http://www.is.titech.ac.jp/ppl2004/proceedings/ishizaki_slides.pdf 而即使是在同一時期,不同公司的JDK和JRE的性能也不一樣,比如SUN、IBM、BEA等公司都有自己開發的JDK和JRE。
Java語言的一些特性不可避免的有額外的性能代價,例如陣列範圍檢查、運行時類型檢查等等。Java程式的性能還會因為不同的動態複雜性和垃圾處理機制使用的多少而各有不同。如果JVM的實現比較優化的話,那麼這些功能甚至可以增加記憶體分配的性能。這和總是使用STL或者託管C++的程式的情況類似。
儘管如此,仍然有許多人認為Java的性能低。這部分歸因於Sun公司最初的JVM實現使用未優化的解釋機制來執行位元組碼。一些新版本的JVM使用Just-In-Time(JIT)編譯器,在載入位元組碼的時候將其編譯成針對運行環境的本地代碼來實現一些本地編譯器的優化特性。Just-In-Time機制和本地編譯的性能比較仍舊是一個有爭議的話題。JIT編譯需要很多時間,對於運行時間不長或者代碼很多的大型程式並不適宜。但是不算JIT編譯階段的話,程式的運行性能在很多JVM下可以和本地編譯的程式一爭短長,甚至在一些計算比較密集的數值計算領域也是這樣。目前,Java已經使用更先進的HotSpot技術來代替JIT技術,Java的性能有了更進一步的提升。另外,在使用-server選項運行java程式時,也可以對java進行更深入的優化,比如在運行時將調用較多的方法內聯(inline)到程式中來提高運行速度,這就是所謂的「動態優化」,而本地編譯器是無法做到這一點的;這也是一些java代碼比對應用C/C++等語言編寫的本地代碼運行的更快的原因之一。微軟的.NET平臺也使用JIT編譯器,所以也有類似問題。 Java的設計目的主要是安全性和可攜性,所以對於一些特性,比如對硬體架構和記憶體位址訪問的直接訪問都被去除了。如果需要間接調用這些底層功能的話,就需要使用JNI(Java本地介面)來調用本地代碼,而間接訪問意味著頻繁調用這些特性時性能損失會很大,微軟的.NET平臺也有這樣的問題。所以到目前為止,性能敏感的代碼,例如驅動程式和3D視頻遊戲,還是大多使用本地編譯,甚至直接以不直接支援面向物件的C語言或機器碼編寫。但最近已經有了許多用純Java編寫的3D遊戲,其效果與用C語言編寫的不相上下,例如「合金戰士」(英文名:Chrome)。這主要是因為新版的Java 3D技術已經能像C++一樣調用硬體加速,也就是使用顯示卡來加速,無論是C++還是Java語言寫的3D遊戲都是使用顯示卡及GPU來處理,從而使得CPU可以專注於其他方面的工作。
關於Java的性能,可以參看以下文章:
http://www-128.ibm.com/developerworks/cn/java/j-jtp09275.html
http://www.matrix.org.cn/thread.shtml?topicId=16092&forumId=18
Java運行時環境,即Java Runtime Environment,簡稱為JRE,是在任何平臺上運行Java編寫的程序都需要用到的軟體。終端用戶可以以軟體或者外掛程式方式得到和使用JRE。Sun公司還發佈了一個JRE的更複雜的版本,叫做JDK,即Java 2 開發包,裡面包含了Java需要的編譯器、參考文檔和調試器等。
JRE的成分:
擴展和與Java程式語言緊密相關的架構(按字母排序)。
JNI(Java Native Interface)Java本地介面
|
檢 • 論 • 編 • 歷
|
|
|---|---|
| 昇陽電腦主要技術: | Java (程式語言) • Java Platform • J2ME • J2SE • J2EE • Java Development Kit • Java虛擬機 • Java Runtime Environment |
| 主要的第三方技術: | GNU Classpath • GNU Compiler for Java • Apache Harmony • Kaffe • Apache Struts • Hibernate • Jboss application server |
| 歷史: | Java version history • Criticism of Java • Java Community Process • 昇陽電腦公司 • Free Java implementations |
| 語言特色: | Bytecode • Syntax • Applets • Servlets • JavaServer Pages • Web Start |
| 軟體: | Solaris/OpenSolaris • StarOffice/OpenOffice.org • Java Desktop System • Java (Java語言 • JVM • Java API) • JES • 網路文件系統 • JavaFX • NetBeans • Sun Grid Engine • VirtualBox |
| 硬體: | SPARCstation • Sun Ultra series • Sun Enterprise • Sun Blade • Sun Fire • SPARC Enterprise • UltraSPARC T1 • UltraSPARC T2 • SPARC • JavaStation • Sun Ray • Project Blackbox • Sun Grid |
| 教育和認可: | SCPs • List of notable employees |
|
檢 • 論 • 編 • 歷
|
|
|---|---|
| 工業程式語言 | A+ - ActionScript - Ada - 組合語言 - B - Brainfuck - COBOL - Curl - D - Eiffel - Erlang - FORTRAN - IronPython - Java - JavaScript - JScript - Jython - LISP - Lua - SCILAB - MATLAB - MATHEMATICA - Nuva - Oberon - OCaml - Perl - PHP - PostScript - Powerbuilder - Python - R - REXX - Ruby - Self - Smalltalk - Tcl/Tk - C# - F# - J# - Microsoft Visual C# |
| C/C++語言 | C - C++ - Turbo C++ - Borland C++ - C++ Builder- C++/CLI - Objective-C - Microsoft Visual C++ |
| BASIC語言 | BASIC - BASICA - GW-BASIC - QBASIC - QuickBASIC - True BASIC - Turbo BASIC - PowerBASIC - DarkBASIC -ETBASIC Visual Basic .NET - Visual Basic - VBScript - VBA |
| Pascal/Delphi語言 | Pascal語法:(Pascal - Turbo Pascal - Object Pascal - Free Pascal) Pascal+Delphi語法:(Delphi) |
| GPU用著色器語言 | Cg - GLSL - HLSL |
| 學術程式語言 | APL/J - Clean - Haskell - Logo - ML - Prolog - Scheme - SAC |
| 資料庫相關程式語言 | Clipper - Visual FoxPro - SQL - SQL預存程序 |
| 其他程式語言 | ALGOL - Forth - Modula-2/Modula-3 - MUMPS - PL/I - Simula |
|
檢 • 論 • 編 • 歷
|
|
|---|---|
| 文檔呈現語言 | HTML* - XHTML* - XML* - XForms* - DHTML* |
| 樣式格式描述語言 | CSS* - XSL* |
| 動態網頁技術 | CGI - ASP - ASP.NET - ColdFusion - JSP - PHP - Ruby on Rails |
| 客戶端交互技術 | ActiveX - Java Applet - Flash - Flex - AJAX - XMLHTTP* AIR- Silverlight - JavaFX |
| 客戶端腳本語言 | JavaScript - JScript - VBScript - ECMAScript - ActionScript |
| 標識定位語言 | URL - URI - XPath |
| 文檔綱要語言 | DTD* - XML Schema* |
| *由W3C制定和維護的標準與規範 | |
Why are we here?
All text is available under the terms of the GNU Free Documentation License
This page is cache of Wikipedia. History