Java:修订间差异
小 →性能問題 |
|||
第279行: | 第279行: | ||
儘管如此,仍然有許多人認為Java的性能低。這部分歸因於Sun公司最初的JVM實現使用未優化的解釋機制來執行位元組碼。一些新版本的JVM使用Just-In-Time([[JIT]])編譯器,在載入位元組碼的時候將其編譯成針對運行環境的本地代碼來實現一些本地編譯器的優化特性。Just-In-Time機制和本地編譯的性能比較仍舊是一個有爭議的話題。JIT編譯需要很多時間,對於運行時間不長或者代碼很多的大型程式並不適宜。但是不算JIT編譯階段的話,程式的運行性能在很多JVM下可以和本地編譯的程式一爭短長,甚至在一些計算比較密集的數值計算領域也是這樣。目前,Java已經使用更先進的[[HotSpot (java)|HotSpot]]技術來代替JIT技術,Java的性能有了更進一步的提升。另外,在使用-server選項運行java程式時,也可以對java進行更深入的優化,比如在運行時將調用較多的方法內聯(inline)到程式中來提高運行速度,這就是所謂的“動態優化”,而本地編譯器是無法做到這一點的;這也是一些java代碼比對應用C/C++等語言編寫的本地代碼運行的更快的原因之一。微軟的.NET平臺也使用JIT編譯器,所以也有類似問題。 |
儘管如此,仍然有許多人認為Java的性能低。這部分歸因於Sun公司最初的JVM實現使用未優化的解釋機制來執行位元組碼。一些新版本的JVM使用Just-In-Time([[JIT]])編譯器,在載入位元組碼的時候將其編譯成針對運行環境的本地代碼來實現一些本地編譯器的優化特性。Just-In-Time機制和本地編譯的性能比較仍舊是一個有爭議的話題。JIT編譯需要很多時間,對於運行時間不長或者代碼很多的大型程式並不適宜。但是不算JIT編譯階段的話,程式的運行性能在很多JVM下可以和本地編譯的程式一爭短長,甚至在一些計算比較密集的數值計算領域也是這樣。目前,Java已經使用更先進的[[HotSpot (java)|HotSpot]]技術來代替JIT技術,Java的性能有了更進一步的提升。另外,在使用-server選項運行java程式時,也可以對java進行更深入的優化,比如在運行時將調用較多的方法內聯(inline)到程式中來提高運行速度,這就是所謂的“動態優化”,而本地編譯器是無法做到這一點的;這也是一些java代碼比對應用C/C++等語言編寫的本地代碼運行的更快的原因之一。微軟的.NET平臺也使用JIT編譯器,所以也有類似問題。 |
||
Java的設計目的主要是安全性和可攜性,所以對於一些特性,比如對硬體架構和記憶體位址訪問的直接訪問都被去除了。如果需要間接調用這些底層功能的話,就需要使用[[JNI]](Java本地介面)來調用本地代碼,而間接訪問意味著頻繁調用這些特性時性能損失會很大,微軟的.NET平臺也有這樣的問題。所以到目前為止,性能敏感的代碼,例如驅動程式和3D視頻遊戲,還是大多使用本地編譯,甚至直接以不直接支援面向 |
Java的設計目的主要是安全性和可攜性,所以對於一些特性,比如對硬體架構和記憶體位址訪問的直接訪問都被去除了。如果需要間接調用這些底層功能的話,就需要使用[[JNI]](Java本地介面)來調用本地代碼,而間接訪問意味著頻繁調用這些特性時性能損失會很大,微軟的.NET平臺也有這樣的問題。所以到目前為止,性能敏感的代碼,例如驅動程式和3D視頻遊戲,還是大多使用本地編譯,甚至直接以不直接支援面向对象的C語言或機器碼編寫。但最近已經有了許多用純Java編寫的3D遊戲,其效果與用C語言編寫的不相上下,例如“[[合金戰士]]”(英文名:[[Chrome]])。這主要是因為新版的Java 3D技術已經能像C++一樣調用硬體加速,也就是使用[[顯示卡|顯卡]]來加速,無論是C++還是Java語言寫的3D遊戲都是使用顯卡及[[GPU]]來處理,從而使得[[中央處理器|CPU]]可以專注於其他方面的工作。 |
||
== 参阅 == |
== 参阅 == |
2012年3月14日 (三) 14:50的版本
编程范型 | Object-oriented, structured, imperative |
---|---|
設計者 | 昇陽電腦(2009年4月20日,由甲骨文公司併購) |
发行时间 | 1990年代(1995) |
当前版本 |
|
型態系統 | Static, strong, safe, nominative |
操作系统 | 跨平台 |
許可證 | GNU通用公共許可證 |
網站 | http://www.java.com/ |
主要實作產品 | |
Numerous | |
啟發語言 | |
Objective-C, C++, Smalltalk, Eiffel, C#[1], Object Pascal, Mesa, Modula-3, Ada 83 | |
影響語言 | |
C#, D語言, J#, Ada 2005, BeanShell, Clojure, ECMAScript, Groovy, J#, JavaScript, PHP, Python, Scala |
Java是一種電腦程式設計語言,擁有跨平台、物件導向、泛型程式設計的特性。 任職於昇陽電腦的詹姆斯·高斯林(James Gosling)等人于1990年代初开发Java語言的雛形,最初被命名为Oak,目標設定在家用电器等小型系統的程式语言,應用在电视机、电话、闹钟、烤面包机等家用电器的控制和通訊。由于这些智能化家电的市场需求没有预期的高,昇陽公司放弃了该项计划。随着1990年代網際網路的发展,昇陽公司看見Oak在網際網路上应用的前景,于是改造了Oak,於1995年5月以Java的名称正式发布。Java伴随着互联网的迅猛发展而发展,逐渐成为重要的网络编程语言。
Java编程语言的风格十分接近C++语言。继承了C++语言面向对象技术的核心,Java舍弃了C++语言中容易引起错误的指針,改以引用取代,同時移除原C++與原來运算符重载,也移除多重继承特性,改用接口取代,增加垃圾回收器功能。在Java SE 1.5版本中引入了泛型编程、类型安全的枚举、不定长参数和自动装/拆箱特性。昇陽公司对Java语言的解释是:「Java编程语言是个简单、面向对象、分布式、解释性、健壮、安全与系统无关、可移植、高性能、多线程和动态的语言」
Java不同於一般的编译語言和解释语言。它首先将源代码编译成字节码(bytecode),然后依赖各种不同平台上的虚拟机来解释执行字节码,从而实现了“一次编译、到处执行”的跨平台特性。在早期JVM中,这在一定程度上降低了Java程序的运行效率。但在J2SE1.4.2发布后,Java的執行速度有了大幅提升。
与传统型態不同昇陽公司在推出Java時就将其作为开放的技术。全球数以万计的Java开发公司被要求所设计的Java软件必须相互兼容。“Java语言靠群体的力量而非公司的力量”是昇陽公司的口号之一,并获得了广大软件开发商的认同。这与微软公司所倡导的注重精英和封闭式的模式完全不同,此外,微软公司後來推出了与之竞争的.NET平台以及模仿Java的C#语言。後來昇陽公司被甲骨文公司併購,Java也隨之成為甲骨文公司的產品。
历史
早期的Java
語言最開始只是昇陽電腦(Sun MicroSystems)公司在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公司的另外一筆關於機頂盒的交易也沒有成功,由於他們的平台不能在電視工業產生任何效益,公司被併回昇陽公司。
Java和互联网
1994年6月、7月间,在经历了一场历时三天的脑力激盪的讨论后,约翰·盖吉、詹姆斯·高斯林、比尔·乔伊、帕特里克·诺顿、韦恩·罗斯因和埃里克·斯库米,团队决定再一次改变了努力的目标,这次他们决定将该技术应用于万维网。他们认为随着Mosaic浏览器的到来,因特网正在向同样的高度互动的远景演变,而这一远景正是他们在有线电视网中看到的。作为原型,帕特里克·诺顿写了一个小型万维网浏览器,WebRunner,后来改名为HotJava。
Java和「Java」
由于商标搜索显示,Oak已被一家显卡制造商注册。于是同年,Oak被改名为Java。当使用十六进制编辑器打开由Java源代码编译出的二进制文件(.class文件)的话,最前面的32位将显示为CA FE BA BE,即词组“CAFE BABE”(咖啡屋宝贝)。
Java和浏览器
1994年10月,HotJava和Java平台为公司高层进行演示。1994年,Java 1.0a版本已经可以提供下載,但是Java和HotJava浏览器的第一次公开发布却是在1995年3月23日SunWorld大会上进行的。升阳公司的科学指导约翰·盖吉宣告Java技术。这个发布是与网景公司的执行副总裁马克·安德森的惊人发布一起进行的,宣布网景将在其浏览器中包含对Java的支持。1996年1月,升阳公司成立了Java业务集团,专门开发Java技术。
Java近况
在流行几年之后,Java在浏览器中的地位被逐步侵蚀。它在简单交互性动画方面的用途已经完全被Adobe公司的Flash排挤,2005年Java倾向只被用于雅虎游戏那样的更为复杂的应用程序。Java同时遭受到来自微软的反对,他们决定在新版本的Internet Explorer和Windows中不再附带Java平台。
与此相反。在万维网的服务器端和手持设备上,Java变得更加流行。很多网站在後端使用JSP和其他的Java技术。
在桌面系统上,独立的Java程序还是相对少见,这是因为Java平台的运行开销较大,而许多人的电脑上没有安装Java,由于网络带宽在以前较小,下载Java曾经是个耗时的事情。但是随着计算机计算能力、网络带宽在10年中取得了很大的进步,同时虚拟机和编译器的质量得到了提高,许多应用程序得到了广泛的使用,包括:
开源软件:
- NetBeans和Eclipse等軟件開發工具
- Android操作系统
- JEdit
- Azureus BitTorrent客户端。
- JNode操作系统
- Apache軟件基金會的Ant、Derby、Hadoop、Jakarta、POI和Tomcat
- JBoss和GlassFish應用服務器
商業軟體:
- EIOffice(永中Office)
- 纯Java 3D游戏合金战士Chrome
- IBM Websphere、ColdFusion和WebLogic
还有许多用Java写的软件,可以在http://www.java.com 找到。 在以下网页可以看到非常多用Java写的程序: http://java.sun.com/products/ 下面有大量用Java Swing开发的桌面Java程序 http://java.sun.com/products/jfc/tsc/sightings/ 目前Java提供以下三个版本:
- Java Platform, Enterprise Edition(Java EE:Java平台企业版)
- Java Platform, Standard Edition(Java SE:Java平台标准版)
- Java Platform, Micro Edition(Java ME:Java平台微型版)
- Java Platform, Card Edition
Java開放原始碼項目
2006年SUN在JavaOne公佈Java 開放原始碼項目,並推出OpenJDK計畫。[2] Java虛擬機、Java編譯器和Java類庫以GNU通用公共許可證公開。
版本历史
- 1995年5月23日,Java语言诞生
- 1996年1月,第一个JDK-JDK1.0诞生
- 1996年4月,10个最主要的操作系统供应商申明将在其产品中嵌入JAVA技术
- 1996年9月,约8.3万个网页应用了JAVA技术来制作
- 1997年2月18日,JDK1.1发布
- 1997年4月2日,JavaOne会议召开,参与者逾一万人,创当时全球同类会议规模之纪录
- 1997年9月,JavaDeveloperConnection社区成员超过十万
- 1998年2月,JDK1.1被下载超过2,000,000次
- 1998年12月8日,JAVA2企业平台J2EE发布
- 1999年6月,SUN公司发布Java的三个版本:标准版(J2SE)、企业版(J2EE)和微型版(J2ME)
- 2000年5月8日,JDK1.3发布
- 2000年5月29日,JDK1.4发布
- 2001年6月5日,NOKIA宣布,到2003年将出售1亿部支持Java的手机
- 2001年9月24日,J2EE1.3发布
- 2002年2月26日,J2SE1.4发布,自此Java的计算能力有了大幅提升
- 2004年9月30日18:00PM,J2SE1.5发布,成为Java语言发展史上的又一里程碑。为了表示该版本的重要性,J2SE1.5更名为Java SE 5.0
- 2005年6月,JavaOne大会召开,SUN公司公开Java SE 6。此时,Java的各种版本已经更名,以取消其中的数字“2”:J2EE更名为Java EE,J2SE更名为Java SE,J2ME更名为Java ME
- 2006年12月,SUN公司发布JRE6.0
- 2009年12月,SUN公司发布Java EE 6
- 2010年11月,由於Oracle公司對於Java社群的不友善,因此Apache揚言將退出JCP[3]
- 2011年7月28日,Oracle公司發佈Java SE 7
语言特性
Java之所以被开发,是要达到以下五个目的:
- 应当使用面向对象程序设计方法学
- 应当允许同一程序在不同的计算机平台执行
- 应当包括内建的对计算机网络的支持
- 应当被设计成安全地执行远端代码
- 应当易于使用,并借鉴以前那些面向对象语言(如C++)的长处。
Java技术主要分成几个部分:Java语言、运行环境JVM、类库。一般情况下说Java时并不区分指的是哪个部分。
Java在1.5版本時,做了重大改變,昇陽公司並1.5版本重新命名為Java 5.0。
面向对象
Java的特点之一就是面向对象,是程序设计方法的一种。“面向对象程序设计语言”的核心之一就是开发者在设计软件的时候可以使用自定义的类型和关联操作。代码和数据的实际集合体叫做“对象”。一个对象可以想像成绑定了很多“行为(代码)”和“状态(数据)”的物体。对于数据结构的改变需要和代码进行通信然后操作,反之亦然。面向对象设计让大型软件工程的计划和设计变得更容易管理,能增强工程的健康度,减少失败工程的数量。
面向对象设计另外一个目标就是能产生很多的有关联的类,可以让软件的再开发变得简单。举例来说,很多软件工程都有同样的功能,尤其是很多应用了同一原理组织的软件工程。软件的二次开发者想自己为软件开发插件以增强功能的时候,绝对不想看到混乱的开发代码和管理计划。面向对象的目的就是不生產难懂且难以使用的代码,为软件各个功能群之间建立有效的通信通道。很多开源软件社区正在计划给软件作者提供更多的类来让软件的二次开发变得简便。
跨平台性
Java语言的第二个特性就是跨平臺性,也就是说使用Java语言编写的程序可以在编译后不用经过任何更改,就能在任何硬件设备条件下运行。这个特性经常被称为“一次编译,到处运行”。
执行Java应用程式必须安装Java Runtime Environment(JRE),JRE内部有一个Java虚拟机(Java Virtual Machine,JVM)以及一些标准的类库(Class Library)。通过JVM的虚拟机才能在电脑系统执行Java应用程序(Java Application),这与.Net Framework的情况一样,所以电脑上没有安装JVM,那么这些程序将不能够执行。
实现跨平台性的方法是大多数编译器在进行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运行时系统的公司在Windows操作系统下对用户提供无偿的第三方插件和程序支持。
Java语言使用解释层最初是为了轻巧性。所以这些程序的运行效率比C语言和C++要低很多,用户也对此颇有微词。很多最近的调查显示Java的程序运行速度比几年前要高出许多,有些同样功能的程序的效率甚至超过了C++和C语言编写的程序。
Java语言在最开始应用的时候是没有解释层的,所有需要编译的代码都直接转换成机器的原始代码。这样做的后果就是获得了最佳的性能,但是程序臃肿异常。从JIT技术开始,Java的程序都经过一次转换之后才变成机器码。很多老牌的第三方虚拟机都使用一种叫做“动态编译”的技术,也就是说虚拟机实时监测和分析程序的运行行为,同时选择性地对程序所需要的部分进行编译和优化。所有这些技术都改善了代码的运行速度,但是又不会让程序的体积变得失常。
程序的轻便性事实上是软件编写很难达到的一个目标,Java虽然成功地实现了“一次编译,到处运行”,但是由于平台和平台之间的差异,所编写的程序在转换代码的时候难免会出现微小的、不可察觉的错误和意外。有些程序员对此非常头疼,他们嘲笑Java的程序不是“一次编译,到处运行”,而是“一次编译,到处调试”。
平台无关性让Java在服务器端软件领域非常成功。很多服务器端软件都使用Java或相关技术建立。
自動垃圾回收(Garbage Collection)
C++語言被用戶詬病的原因之一是大多數C++編譯器不支持垃圾收集機制。通常使用C++編程的時候,程式設計師於程式中初始化對象時,會在主機記憶體堆疊上分配一塊記憶體與位址,當不需要此對象時,進行解構或者刪除的時候再釋放分配的記憶體位址。如果對象是在堆疊上分配的,而程序員又忘記進行刪除,那麼就會造成記憶體洩漏(Memory Leak)。長此以往,程序運行的時候可能會生成很多不清除的垃圾,浪費了不必要的記憶體空間。因此如果同一記憶體地址被刪除兩次的話,程序會變得不穩定,甚至崩潰。因此有經驗的C++程序員都會在刪除之後將指標重置為0,然後在刪除之前先判斷指標是否為0。
C++中也可以使用「智慧指標」(Smart Pointer)或者使用C++託管擴展編譯器的方法來實現自動化記憶體釋放,智慧指標可以在標準類庫中找到,而C++託管擴展被微軟的Visual C++ 7.0及以上版本所支持。智慧指標的優點是不需引入緩慢的垃圾收集機制,而且可以不考慮線程安全的問題,但是缺點是如果不善使用智慧指標的話,性能有可能不如垃圾收集機制,而且不斷地分配和釋放記憶體可能造成記憶體碎片,需要手動對堆進行壓縮。除此之外,由於智慧指標是一個基於模板的功能,所以沒有經驗的程序員在需要使用多態特性進行自動清理時也可能束手無策。
Java語言則不同,上述的情況被自動垃圾收集功能自動處理。對象的建立和放置都是在記憶體堆疊上面進行的。當一個物件沒有任何引用的時候,Java的自動垃圾收集機制就發揮作用,自動刪除這個物件所佔用的空間,釋放記憶體以避免記憶體洩漏。
注意程式設計師不需要修改finalize
方法,自動垃圾收集也會發生作用。但是記憶體洩漏並不是就此避免了,當程序員疏忽大意地忘記解除一個物件不應該有的參考的時候,記憶體洩漏仍然不可避免,例如以下的程式:
// ...
String str = "這是一段字串";
System.out.println(s);
for(int i){
// 無關緊要的迴圈
System.out.println("Hallo Would"+i);
}
// ...
在迴圈開始之前,字串str
已經不會再用到了,但未將這個參考指向null
,因此字串str
無法被gc所回收。這種記憶體洩漏必須等到一個函式結束之後才會被系統取回,只不過發生的機率要比不啟用垃圾收集機制的C++程序少很多。但是總體來講,自動垃圾收集機制要安全和簡單許多。
不同廠商、不同版本的JVM中的記憶體垃圾回收機制並不完全一樣,通常越新版本的記憶體回收機制越快,IBM、BEA、SUN等等開發JVM的公司都曾宣稱過自己製造出了世界上最快的JVM[來源請求],JVM性能的世界紀錄也在不斷的被打破並提高。
IBM有一篇有關Java記憶體回收機制比不啟用垃圾收集機制的C++記憶體處理快數倍的技術文章[4],而著名的Java技術書籍《Java編程思想》(Thinking in Java)也有一段論述Java記憶體及性能達到甚至超過C++的章節[5]。
接口和类別
Java自带了创建接口的类別,可以这样使用:
public interface Deleteable {
void delete();
}
这段代码的意思是任何实现(implement)Deleteable
接口的类別都必须实现delete()
方法。每个类別对这个方法的实现可以自行定制。由此概念可以引出很多种使用方法,下面是一个类別的例子:
public class Fred implements Deleteable {
// 必須實作 Deleteable 介面中的 delete 方法
@Override public void delete() {
// 實作的程式碼
}
// 這個類別也可以包含其他方法
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的接口功能可以提供同样的功能,但是又不会很复杂。
应用程序开发接口
在Java语言中,应用程序接口(API)化身成类,并且分组成为包。每个包中包含有相关的接口和类。对于不同的平台,Java提供了不同版本的包。API的设定由sun公司和其他公司通过JCP(Java社群程序)决定。任何公司和个人都可以参与这个工程,对API进行设计。2004年,IBM和BEA公司准备联合对官方的Java开源软件工程进行支持,但是2005年初,sun公司拒绝了这个支持。
下面这个程序显示“Hello, world!”然后结束运行,注意java.lang
套件是自動載入的,所以不需要在程式之前加入import java.lang.*;
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}
用途
關於Java的批評
Java試圖通過新的方式解決軟體編寫的複雜性。很多人認為Java語言做到了它承諾的一切。但是Java並不是一門完美的語言。
整體性問題
並不是所有的工程和環境需要企業級別的複雜性,比如一個簡單的個人網站或者獨自編程的程式師所寫的程式。這些程式師會發現Java的複雜管理對於自己要做的程式來說過於強大了。一些人覺得Java在物件導向上面做的沒有Ruby和Smalltalk純粹。但是最新出現的用Java實現的語言Groovy解決了這些問題。
作為一種已經建立的新技術,Java顯然綜合了很多語言的特性,比如C++、C語言、Python等等。一些對於Java的評論認為Java的不變性在動搖。
語言問題
有些程式師不喜歡原始類型(primitive type)和類別(class)的分離,尤其是那些曾經使用過Smalltalk和Ruby的程式師。Java的代碼相對於其他的代碼來說過於冗長,這與它的輕便化聲明相違背。
Java是一種單層繼承的語言。這也導致了程式師在試圖使用多重繼承時候的不便,而很多語言都可以使用這個特性。但是Java可以使用介面類,把多重繼承可能導致的風險減少到最小。Java不支持運算符重載,這是為了防止運算符重載使得代碼的功能變得不清晰。但是用Java實現的語言Groovy可以進行運算符重載。過去Java對於文本的操作和其他語言,比如Perl和PHP相比差的較多,但Java在1.4版本時候引入了正则表达式。
類庫問題
使用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可以專注於其他方面的工作。
参阅
参考文献
- Jon Byous, Java technology: The early years。Sun Developer Network, no date [ca. 1998]。Retrieved April 22, 2005.
- James Gosling,A brief history of the Green project。Java.net, no date [ca. Q1/1998]。Retrieved April 22, 2005.
- James Gosling,Bill Joy,Guy Steele,and Gilad Bracha,The Java language specification, second edition. Addison-Wesley, 2000. ISBN 0-201-31008-2.
- James Gosling,Bill Joy,Guy Steele,and Gilad Bracha,The Java language specification, third edition. Addison-Wesley, 2005. ISBN 0-321-24678-0.
- Tim Lindholm and Frank Yellin. The Java Virtual Machine specification, second edition. Addison-Wesley, 1999. ISBN 0-201-43294-3.
- 蔡學鏞,《從編譯器與VM角度分析Java2 v5.0語言的新特色》
技术开发
- Java开源大全
- Java教程资料网
- http://Jakarta.apache.org Apache軟件基金會的Jakarta項目
- Java3z Java学习室
- JavaEye--深度技术社区
- CSDN Java频道
- Java究竟怎么玩 关于Java PC游戏开发的Blog
- 中文JAVA技术网
- JAVA中文站
- 双子星Java开源技术门户
- JavaWorld@TW
- Java學習筆記
- JavaWhat.com Java resource directory, Java API Specifications, Latest Java News
- Java例程网
- 免费网上Java书
- 企业级Java开发技术课程学习路线图
- Full Java Tutorial
- (英文)Java和C#的代码转换工具(开源)
集成开发环境IDE
- BEA Workshop –商业软件,BEA Systems公司开发,与BEA WebLogic服务器整合。
- BlueJ – 免费软件目前由肯特大学和迪肯大学的联合小组负责维护。
- Eclipse –免费开源软件,Eclipse 基金会开发。
- IntelliJ IDEA –商业软件,JetBrains公司开发,社区版本开源免费,专业版本有试用版。
- JBuilder –商业软件(有试用版), Borland公司开发。
- JCreator –商业软件(有试用版), Xinox公司开发
- JDeveloper –商业软件,Oracle Corporation公司开发,与Oracle Application Server服务器整合。
- NetBeans –免费开源软件,NetBeans.org社区开发。
- Sun Java Studio Enterprise –商业软件(available free to members of the free Sun Developer Network), Sun Microsystems公司开发。
- WebSphere Developer & Development Studio –商业软件,IBM开发,与WebSphere Application Server服务器整合。
一般应用
Java历史
Java性能
註釋
- ^ In Java 5.0, several features (the enhanced for loop, autoboxing, varargs, annotations and enums) were introduced, after proving themselves useful in the similar (and competing) language C#. [1][2][3]
- ^ OpenJDK
- ^ Statement by the ASF Board on our participation in the Java Community Process
- ^ Java 理論與實踐: 再談 Urban 性能傳言
- ^ http://www.sdau.edu.cn/support/thinkinjava/chapter/appe.htm