Java虛擬機(jī)的起源與構(gòu)造
當(dāng)我們說到“Java”這個(gè)詞的時(shí)候,指的是四個(gè)相互關(guān)聯(lián)的概念:Java語言、Java API、Java Class文件格式、Java虛擬機(jī)。整個(gè)Java體系是基于Java 虛擬機(jī)構(gòu)造的,正因?yàn)槿绱耍拍軐?shí)現(xiàn)Java的安全性和網(wǎng)絡(luò)移動(dòng)性。Java并非是第一個(gè)采用“虛擬機(jī)”概念的體系,但卻是第一個(gè)得到廣泛運(yùn)用的虛擬機(jī)平臺(tái)。 “虛擬”,是一種隔離物理資源與邏輯資源的手段。Java虛擬機(jī)的“虛擬”,則是用來隔離物理機(jī)器、底層操作系統(tǒng)與Java語言規(guī)范實(shí)現(xiàn)的手段。
雖然Java是一種面向?qū)ο蟮恼Z言,我們平時(shí)大量使用的,是對(duì)象間的多態(tài)、組合(Composition)、委派(Delegation),但當(dāng)我們討論虛擬機(jī)的時(shí)候,我們看見的基本概念卻是“棧(Stack)”和“堆(Heap)”。根據(jù)馮諾依曼的“存儲(chǔ)計(jì)算”模型,所有的代碼都保存在代碼空間中,隨著程序計(jì)數(shù)器指針的變化進(jìn)行程序的執(zhí)行、跳轉(zhuǎn)。Java虛擬機(jī)中沒有寄存器的概念,方法調(diào)用是采用“棧”進(jìn)行的,這是一種安全、簡潔的方法。
Java虛擬機(jī)通過類裝載器支持對(duì)類的隔離,這也是Java實(shí)現(xiàn)安全性的基礎(chǔ)。每個(gè)類都具有自己的命名空間,在具有不同安全級(jí)別的沙箱中運(yùn)行,因此不會(huì)產(chǎn)生低安全級(jí)別的代碼來越權(quán)訪問高級(jí)別代碼的機(jī)會(huì)。類裝載器的出現(xiàn)是Java虛擬機(jī)與大部分用C實(shí)現(xiàn)的虛擬機(jī)的顯著不同之處。
Java虛擬機(jī)的另外一個(gè)顯著特點(diǎn)就是實(shí)現(xiàn)了自動(dòng)的垃圾收集。在往常,寫程序的時(shí)候要牢記對(duì)象之間的關(guān)聯(lián),在每個(gè)程序塊中假若申請(qǐng)了對(duì)象空間,就必須在出口釋放掉,方法調(diào)用往往同時(shí)也就是對(duì)象的邊界。而自動(dòng)垃圾收集帶給開發(fā)者的最大好處,就是可以非常方便地從整體上把系統(tǒng)的對(duì)象組織成一張對(duì)象圖,只需往這張圖中添加對(duì)象,維護(hù)對(duì)象之間的關(guān)聯(lián),卻不需要自己做復(fù)雜的清掃工作。正是有了這種思維單純的對(duì)象圖的支持,OR Mapping(關(guān)系數(shù)據(jù)庫與對(duì)象映射)技術(shù)在最近得以大行其道,設(shè)計(jì)模式也更容易被Java群體所接受。
虛擬機(jī)的優(yōu)化
1995年第一代的Java出臺(tái)之時(shí),其虛擬機(jī)執(zhí)行是依靠“字節(jié)碼解釋器(Byte Code Interceptor)”的,也就是說每條指令都由虛擬機(jī)來當(dāng)場(chǎng)解釋執(zhí)行,這造成速度令人抓狂地緩慢。更有甚者有人開始總結(jié)許多的“速度優(yōu)化經(jīng)驗(yàn)”,比如說:“盡量把所有的代碼都放在較大的方法中執(zhí)行”與“少用接口”等等,這完全與Java語言的設(shè)計(jì)目的背道而馳,現(xiàn)在看起來是多么可笑的奇談怪論,當(dāng)時(shí)卻是很多程序員津津樂道的經(jīng)驗(yàn)之談。無他,Java本身執(zhí)行太慢了。Java生命的前十分之三就是如此緩慢地渡過的。
于是,Sun的工程師開始拼命想著提高執(zhí)行速度。JIT靜態(tài)編譯器的出現(xiàn)是在1996年十月,Sun放出了第一個(gè)編譯器。JIT編譯器在每段代碼執(zhí)行前進(jìn)行編譯,編譯的結(jié)果為本地靜態(tài)機(jī)器碼,執(zhí)行速度有了質(zhì)的提高。Symantec公司當(dāng)時(shí)憑借其傲人的JIT編譯器,在整個(gè)Java界受到熱烈的追捧。在其后的1998年,Java 1.2發(fā)布的時(shí)候,附帶了JIT編譯器,從此Java的使用者終于可以拋開上面說的那些奇怪的“速度優(yōu)化經(jīng)驗(yàn)”了。
JIT靜態(tài)編譯器雖然可以解決一些問題,但是性能仍然和C/C++有很大的差距。對(duì)一段程序而言,一名優(yōu)秀的程序員是如何來改進(jìn)運(yùn)行速度的呢?首先,他不會(huì)傻到把所有的代碼都來優(yōu)化,他會(huì)觀察、思考到底哪段代碼對(duì)整體性能影響最大?然后集中精力來優(yōu)化這一段代碼。按照經(jīng)驗(yàn),整個(gè)程序 10%-20%的代碼,會(huì)占據(jù) 80%-90%的運(yùn)行時(shí)間。用這種方法,在同樣的時(shí)間、付出同樣程度的努力后,這名優(yōu)秀的程序員使整個(gè)程序的性能得到了很大程度的優(yōu)化。HotSpot引擎,就是模仿人工的這種方法進(jìn)行優(yōu)化的。在程序運(yùn)行的開始,Java代碼仍然解釋執(zhí)行,但HotSpot引擎開始進(jìn)行采樣(Profiling)。根據(jù)采樣的結(jié)果,決定某段程序是占用較多運(yùn)行時(shí)間的,就認(rèn)為它是“HotSpot”,它也就是目前程序的瓶頸, 引擎開始啟動(dòng)一個(gè)單獨(dú)的線程進(jìn)行優(yōu)化。因?yàn)椴幌笤嫉?JIT編譯器那樣無差別的編譯所有代碼,HotSpot引擎可以集中精力來對(duì)HotSpot代碼進(jìn)行深度優(yōu)化,這樣這部分代碼執(zhí)行起來更加迅捷。之前的靜態(tài)編譯器只能按照預(yù)定的策略進(jìn)行編譯優(yōu)化,而HotSpot引擎的優(yōu)化是基于采樣的結(jié)果的,因此這種方法對(duì)所有的應(yīng)用程序都有效。1999年3月27日,Sun放出了第一個(gè)HotSpot引擎。在隨后的2000年5月的JDK 1.3中,包含了HotSopt引擎,這也使1.3成了一個(gè)具有里程碑意義的發(fā)行版本。到這里,Java的十年生命,已經(jīng)過去了一半。
HotSpot代表的是一種動(dòng)態(tài)編譯的技術(shù)。對(duì)Java這種大量使用委派、組合等面向?qū)ο筇匦缘某绦騺碚f,動(dòng)態(tài)編譯比起靜態(tài)編譯來有顯著的優(yōu)勢(shì)。比如Method Inlining。方法的調(diào)用是一個(gè)很耗時(shí)的操作,假若可以把方法調(diào)用直接內(nèi)嵌到調(diào)用者的代碼中,就可以節(jié)省大量的時(shí)間, 這被稱為“Method Inlining”。因?yàn)樯婕暗筋惖闹剌d,靜態(tài)優(yōu)化很難確切知道哪些屬性、方法被重載,因此很難對(duì)method進(jìn)行合并,只好在方法內(nèi)部進(jìn)行靜態(tài)編譯,假若每個(gè)方法都很小,靜態(tài)優(yōu)化能起到的作用也就比較小。而動(dòng)態(tài)編譯因?yàn)榭梢酝耆S時(shí)掌握類的重載情況,就可以把相關(guān)的方法合并進(jìn)行深度優(yōu)化。現(xiàn)代的Java程序,特別是在設(shè)計(jì)模式教育得到普及之后,大量使用類的繼承、委派,形成了很多短小的方法,動(dòng)態(tài)編譯的優(yōu)勢(shì)就更加明顯。
自從出現(xiàn)了HotSpot之后,整個(gè)Java界為之一振。
最近的五年,就是繼續(xù)優(yōu)化的五年。繼續(xù)進(jìn)行優(yōu)化的方法有幾條路,一是研究新的采樣算法。因?yàn)椴蓸雨P(guān)系到不同的優(yōu)化策略,會(huì)對(duì)整體性能有比較大的影響。二是研究深度優(yōu)化的方法。三是研究垃圾收集的算法。垃圾收集會(huì)帶來程序短暫的停頓,這會(huì)帶來負(fù)面的用戶體驗(yàn)。于是,如何提高垃圾收集的效率,減少延遲,出現(xiàn)了五花八門的算法,比如漸進(jìn)式收集、火車算法等。在多處理器的時(shí)候,如何利用多處理器進(jìn)行并行收集也是研究的一個(gè)熱點(diǎn)。這方面,BEA的JRocket走在了前面。
現(xiàn)實(shí)生活中的虛擬機(jī)
最后,讓我們來盤點(diǎn)一下目前市面上可見的各個(gè)虛擬機(jī)。
首先要提到的,毫無疑問是Sun的虛擬機(jī)。作為大眾心目中的“官方實(shí)現(xiàn)”,Sun擁有最大的用戶群,并且擁有“兼容基準(zhǔn)”的地位,其他虛擬機(jī)都必須要考慮和Sun虛擬機(jī)的兼容性問題。比如 JRocket就會(huì)在某些特殊情況下表現(xiàn)出和Sun不同的特性,可能對(duì)程序運(yùn)行有影響。不過Sun也的確沒有讓廣大用戶失望,雖然在早期性能比不上Symantec,后來在1.2 的時(shí)候性能又被IBM超越,但Sun一直在努力革新,特別是 1.4.2之后,性能有了長足的進(jìn)步。雖然JDK 1.5的虛擬機(jī)在性能上沒有什么提高,但是增強(qiáng)了穩(wěn)定性,據(jù)說修改了8000處bug,真是讓人汗流不止。原來我們?cè)?.4.2下面一直在享受這么多bug啊。
其次是老牌勁旅IBM。IBM的JDK在1.3的時(shí)代創(chuàng)下了最好的性能記錄,從此樹立了高端形象。特別是在其WebSphere產(chǎn)品中得到了很好的評(píng)價(jià)。其JDK也是最早支持64bit的JDK之一。到了現(xiàn)在,IBM JDK在高端仍然是和BEA可以一拼的。
然后是后起之秀,BEA的JRocket。說到BEA突然在JVM領(lǐng)域一夜之間異軍突起,多少讓人有些瞠目,不過它采取的戰(zhàn)略特別簡單:自己沒有,索性花錢買了在此領(lǐng)域深有研究的JRocket,在前面加上BEA的標(biāo)志就可以了。JRocket瞄準(zhǔn)高端服務(wù)器市場(chǎng),在多處理器環(huán)境下有不俗的表現(xiàn)。
除此之外,還有幾個(gè)開放源代碼的JVM值得一提。首先就是大名鼎鼎的JikesRVM。說起其大名,大多數(shù)人都知道Jikes編譯器是 IBM開發(fā)的,效率比同等的javac編譯器高得多,很多開發(fā)者都使用Jikes編譯器來取代javac。而JikesRVM則是IBM開源出來的一整套虛擬機(jī)技術(shù),包含了JIT,GC的完整實(shí)現(xiàn),在其網(wǎng)站上也有眾多的論文,實(shí)在是想要深入研究JVM者的絕佳資源([url]http://jikesrvm.sourceforge.net)[/url]。
Kaffe是一個(gè)老牌的JVM,不過現(xiàn)在已經(jīng)很少聽到了。作者撰寫此文時(shí),[url]www.kaffe.org[/url]網(wǎng)站已經(jīng)沒有響應(yīng),也不知道現(xiàn)在的情況如何了。
GNU則有兩個(gè)計(jì)劃:GCJ和GNU classpath。GNU classpath是一個(gè)底層實(shí)現(xiàn),而GCJ是支持java的預(yù)編譯器。
結(jié)束語
時(shí)光流轉(zhuǎn),轟轟烈烈的Java虛擬機(jī)性能爭(zhēng)論仿佛還在耳邊回響,現(xiàn)在新的爭(zhēng)論卻已經(jīng)是“Java的性能是否已經(jīng)超越C/C++”。Joakim Dahlstedt 是 JRockit 的主要架構(gòu)設(shè)計(jì)師之一,他堅(jiān)持認(rèn)為,Java絕不是一種速度慢,效率低的語言,JVM 是一個(gè)關(guān)鍵的組件,確保了系統(tǒng)的部署與運(yùn)行和開發(fā)一樣快速、輕松。特別是在目前開發(fā)趨勢(shì)是采用大量預(yù)制的框架時(shí),動(dòng)態(tài)編譯有可能比C/C++這樣的靜態(tài)優(yōu)化獲得更好的性能。
J2EE五年: 從起源到目的
文/劉天北
起點(diǎn)
在“J2EE”這個(gè)縮略語被第一次介紹給世人的時(shí)刻,也許沒有幾個(gè)人可以預(yù)料出它在日后的奇特歷程。那是在1999年6月的JavaOne年會(huì)上,時(shí)任Sun公司Java企業(yè)開發(fā)部門主管的Mala Chandra興奮地預(yù)告了Java世界的這位新成員。那些不熟悉背景的聽眾們,揣摩著她演說中出現(xiàn)的一串串全新術(shù)語,表情大概又是驚喜、又是迷惑:一個(gè)完整的“多層企業(yè)開發(fā)架構(gòu)”、以“容器”和“組件”的形式提供服務(wù)、一套“廠商中立的開放技術(shù)規(guī)范”、對(duì)開發(fā)者隱藏了不同平臺(tái)和“中間件”的技術(shù)細(xì)節(jié)、實(shí)現(xiàn)了企業(yè)級(jí)應(yīng)用間的“無縫集成”等等。在今天的開發(fā)者看來,這些似乎都已經(jīng)是老生常談,但在當(dāng)時(shí)的場(chǎng)景下,閃動(dòng)在幻燈片上的每一個(gè)口號(hào),都意味著聽眾們事后又要經(jīng)歷一段困難的學(xué)習(xí)過程。
幸虧Chandra有一副了不起的口才;這位本科念建筑學(xué)的印度裔高層主管,談起軟件架構(gòu)來也有特強(qiáng)的空間想象力。她清晰地說明了設(shè)計(jì)J2EE架構(gòu)的兩個(gè)初衷:首先,對(duì)于廠商,J2EE意味著一套開放標(biāo)準(zhǔn),加入這個(gè)標(biāo)準(zhǔn),他們的產(chǎn)品就可以運(yùn)行在各種不同的操作系統(tǒng)和工作環(huán)境下,成為一個(gè)成熟的企業(yè)運(yùn)算體系中可替換的部件;其次,對(duì)于開發(fā)者,J2EE是一套現(xiàn)成的解決方案,采用這個(gè)方案,企業(yè)應(yīng)用開發(fā)中的很多技術(shù)難題(包括跨平臺(tái)移植、事務(wù)處理、安全性等等)就會(huì)迎刃而解,“信息像一條不間斷的河流,經(jīng)過各種各樣的平臺(tái)和設(shè)備,從企業(yè)應(yīng)用系統(tǒng)的這一端流向那一端”。
要想理解這段話在當(dāng)時(shí)的實(shí)際效應(yīng),我們?nèi)匀灰褧r(shí)間指針撥回1999年。除了預(yù)備迎接千年蟲之外,99年你做了什么?為了回答這個(gè)犀利的問題,我翻出6年前的工作記錄,發(fā)現(xiàn)了自己那時(shí)參與的一個(gè)項(xiàng)目的規(guī)格說明書,它正好能提供一幅“Java企業(yè)開發(fā)”在1999年的標(biāo)準(zhǔn)照。這是一家日本知名IT廠商的企業(yè)信息管理系統(tǒng),運(yùn)行在NetScape 3.0 Gold瀏覽器中的Java Applet界面,通過一個(gè)專用的中間層系統(tǒng)與Oracle 8數(shù)據(jù)庫連接。這個(gè)中間層已經(jīng)相當(dāng)現(xiàn)成、完善,能夠提供遠(yuǎn)程對(duì)象調(diào)用、事務(wù)處理等一系列的底層服務(wù);留給我們的任務(wù)只是完成服務(wù)器端業(yè)務(wù)對(duì)象代碼,以及相應(yīng)的客戶端交互開發(fā)。
除了Applet客戶端有些特別之外,上述系統(tǒng)與今天常見的J2EE架構(gòu)很接近;尤其是業(yè)務(wù)對(duì)象編碼也由home類、PK(主鍵)類、entity類等部分構(gòu)成,很多機(jī)制都與EJB如出一轍——只不過這些類并沒有繼承javax.ejb包的接口,而是采用了專用的API。它與EJB之間的相似不像是偶然的,設(shè)計(jì)者肯定參照了Sun在1997年底推出的EJB 1.0技術(shù)規(guī)范。
換言之,在J2EE誕生伊始的語境中,市面上已經(jīng)存在著很多程度不一的“準(zhǔn)J2EE中間件”了。它們主要用于解決三大類問題:事務(wù)處理、分布式對(duì)象管理和Web請(qǐng)求處理。首先,事務(wù)處理管理器(Transaction Processing Monitor)一直是高端企業(yè)計(jì)算領(lǐng)域的熱門產(chǎn)品,著名的應(yīng)用服務(wù)器廠商BEA,正是通過收購事務(wù)處理軟件Tuxedo進(jìn)入中間件市場(chǎng)的。另一方面,從90年代初開始,越來越多的人把“N層分布式對(duì)象架構(gòu)” 當(dāng)成傳統(tǒng)的客戶端/服務(wù)器架構(gòu)的替代方案。那時(shí)剛剛興起的CORBA技術(shù)是推動(dòng)這一趨勢(shì)的重要力量(比如說,前面提到的那個(gè)由日本廠商自行開發(fā)的專用中間層,就采用了CORBA作為基礎(chǔ)架構(gòu))。最后,Java技術(shù)在Web領(lǐng)域中的應(yīng)用也是當(dāng)時(shí)初露頭角的熱點(diǎn)。1997年6月,Sun在發(fā)布一款“Java Web Server”的同時(shí)第一次公布了Servlet API;沒想到這項(xiàng)技術(shù)副產(chǎn)品(連同1998年問世的JSP)正好迎合了廠商的戰(zhàn)略需要。對(duì)于上面提到的N層架構(gòu)來說,HTTP服務(wù)是一個(gè)非常理想的前端;所以基于Java的Web引擎,也在此時(shí)成了企業(yè)級(jí)Java解決方案的一個(gè)必不可少的部分。
Java、Web、事務(wù)、分布式對(duì)象,這幾股開發(fā)潮流匯合在一處,形成了當(dāng)時(shí)最熱門的產(chǎn)品“應(yīng)用服務(wù)器(Application Server)”或“中間件(Middleware)”。為了給定語“最熱門”作個(gè)注釋,我們可以參照一下BEA公司在1998年收購Web應(yīng)用服務(wù)器廠商Weblogic的成交價(jià):1.92億美元。而這并不是一樁孤立的收購,NetScape和Sun也以相近的價(jià)格買下了另外兩家企業(yè)Kiva和NetDynamics。而這也正是J2EE規(guī)范出臺(tái)的背景:幾乎所有要廠商都推出了、或是正在趕制自己的應(yīng)用服務(wù)器產(chǎn)品,但這個(gè)“應(yīng)用服務(wù)器”究竟應(yīng)該是什么東西,競(jìng)爭(zhēng)者們又各有表述、莫衷一是。
說到這里,我們才梳理出了J2EE技術(shù)規(guī)范的第一個(gè)版本在1999年12月問世的實(shí)際意義。首先,它為Java企業(yè)開發(fā)提供了一幅清晰的全景,各項(xiàng)分支技術(shù)在這個(gè)領(lǐng)域中的地位和作用得到了客觀、準(zhǔn)確的定義。至此大家才對(duì)一個(gè)Java企業(yè)解決方案的構(gòu)成要素有了基本共識(shí)。其次,它使用“容器”和“組件”等概念描繪了Java企業(yè)系統(tǒng)的一般架構(gòu),明確地劃分了中間件廠商和應(yīng)用開發(fā)者的職責(zé)所在。最后(但絕非最不重要地),J2EE通過一套公開標(biāo)準(zhǔn)規(guī)定了應(yīng)用服務(wù)器產(chǎn)品的具體行為,在執(zhí)行此標(biāo)準(zhǔn)的廠商產(chǎn)品之間實(shí)現(xiàn)了一定程度的可替換性和互操作性。當(dāng)時(shí)的媒體用“B2B開發(fā)的默認(rèn)標(biāo)準(zhǔn)”之類的說法歡呼這項(xiàng)里程碑式的成就——那些撰稿人哪里知道,在J2EE與那個(gè)被稱為“B2B” 的短命新貴之間,其實(shí)并不會(huì)有太多故事發(fā)生;同樣,他們也不會(huì)想到,J2EE要想成為一種真正成熟的開發(fā)范式,前方還有一段遠(yuǎn)為艱辛的旅程。
社區(qū)的形成
記得Kruglinski在名著《Inside Visual C++》的某個(gè)版本中給出了一個(gè)Web瀏覽器的代碼例子;在這一節(jié)的開頭他說到:如果你幾年前開發(fā)了一個(gè)Web瀏覽器,那肯定會(huì)給你帶來上千萬的收益;但如果你現(xiàn)在才想到開發(fā)這個(gè)東西——那也就是個(gè)C++語言的練習(xí)罷了。在今天的程序員眼中,應(yīng)用服務(wù)器似乎也成了價(jià)格低廉(如果不是全然免費(fèi))的日用消費(fèi)品。所以,想要理解它們?cè)谀菐啄甑拇笮衅涞溃头堑媒柚鶮ruglinski這樣的智慧不可。在1999年底,市面上可以找到30種以上自稱“Java應(yīng)用服務(wù)器”的產(chǎn)品,可見當(dāng)時(shí)這類軟件是網(wǎng)絡(luò)風(fēng)險(xiǎn)投資的寵兒。但是此時(shí)出臺(tái)的J2EE規(guī)范就像是一陣席卷整個(gè)產(chǎn)業(yè)的勁風(fēng),在一夜之間,所有人都有了判斷什么是一個(gè)“應(yīng)用服務(wù)器”的權(quán)威途徑。
為了獲得一張J2EE競(jìng)技場(chǎng)的入場(chǎng)券,各家廠商面臨兩項(xiàng)考驗(yàn):首先,要具有能夠覆蓋J2EE中所有主要技術(shù)的產(chǎn)品線。這在當(dāng)時(shí)是一項(xiàng)非常苛刻的要求,在沒有開源產(chǎn)品可供參照的情況下,短時(shí)間內(nèi)推出包括EJB容器、Web引擎和JMS中間件的整體解決方案,這決不是隨便哪家創(chuàng)業(yè)公司都能辦到的。完成了若干次成功的并購之后,BEA在這一點(diǎn)上搶占了先機(jī),完整的產(chǎn)品線使它成了人們心目中的首選J2EE平臺(tái)提供商。其次,要讓產(chǎn)品通過Sun的J2EE兼容性測(cè)試。要做到這一點(diǎn)同樣不易:就連IBM的WebSphere也一時(shí)還沒達(dá)到百分之百的EJB支持。到2000年底為止,共有15家廠商能夠提供完整的J2EE解決方案,其中9家(包括Sun本身)實(shí)現(xiàn)了“J2EE兼容”,他們中間包括了日后這個(gè)領(lǐng)域的主要競(jìng)爭(zhēng)者。毫無疑問,這是一次非常殘酷的行業(yè)洗牌,但留在場(chǎng)內(nèi)的廠商也相應(yīng)地形成了推動(dòng)J2EE發(fā)展的主體力量。
上面說過,在它的孵化階段,Sun的J2EE團(tuán)隊(duì)主管是女強(qiáng)人Mala Chandra,她本人雖不是工程師出身,但對(duì)技術(shù)有著很強(qiáng)的感知能力和想象力;J2EE一出臺(tái)就能夠?yàn)槿藗兲峁┮环暾⒅庇^而不失深邃的圖景,此中當(dāng)然有Chandra本人的大量貢獻(xiàn)。在她直接領(lǐng)導(dǎo)下工作的幾位工程師,也都是Sun內(nèi)部非常杰出的人才。無論是制定了JDBC、JMS等規(guī)范的Mark Hapner、JavaMail的設(shè)計(jì)者Bill Shannon,還是EJB的主要設(shè)計(jì)者Vlada Matena,后來都是業(yè)界一言九鼎的技術(shù)領(lǐng)袖。這個(gè)班子的合作時(shí)間并不太長:2000年左右的那個(gè)時(shí)期正是IT界創(chuàng)業(yè)的黃金年月,Chandra很快就和Sun公司Java部門的總裁(也是創(chuàng)造Java的功臣之一)Alan Baratz一起,到一家剛起步的Email中間件公司Zaplet淘金去了;捷克裔的開發(fā)天才Matena也離開Sun開辦了自己的公司。留下的兩個(gè)人Hapner和Shannon先后擔(dān)任了J2EE技術(shù)的首席設(shè)計(jì)師。
多年以后,Hapner回憶起J2EE初創(chuàng)的那個(gè)時(shí)期,深感如今Sun對(duì)Java的左右能力已經(jīng)大不如前:“現(xiàn)在,Java事實(shí)上屬于整個(gè)技術(shù)社區(qū),它的發(fā)展有賴全體參與者的推動(dòng)。”的確,如今Sun已經(jīng)不太可能重演當(dāng)年的開拓性功績,很難再為一個(gè)已經(jīng)成形的領(lǐng)域重繪版圖。但正如上文所說,即使是在1999年,J2EE設(shè)計(jì)者們面對(duì)的也不是一張從未著墨的白紙。他們的設(shè)計(jì)始終要以各大廠商的現(xiàn)有產(chǎn)品為出發(fā)點(diǎn),這也是天才的設(shè)計(jì)師們做出的設(shè)計(jì)卻遠(yuǎn)非完美的原因之一:與從頭設(shè)計(jì)一門全新的編程語言不同,J2EE規(guī)范從一開始就是各方博弈和妥協(xié)的產(chǎn)物。
很容易注意到,J2EE與Java社區(qū)的決策機(jī)制JCP(Java Community Process)是幾乎同步產(chǎn)生的。J2EE下屬的各種技術(shù)規(guī)范,包括1.4版之后的J2EE本身,都作為待決規(guī)范議案(JSR,Java Specification Request)被納入了JCP的議程。這些議案的審議過程很少是一帆風(fēng)順的,幾乎每一個(gè)都要經(jīng)歷18個(gè)月以上的拉鋸戰(zhàn)。在多項(xiàng)技術(shù)規(guī)范的審議過程中,我們都見到了這樣的現(xiàn)象:最初列名審議委員會(huì)的某家主要廠商,沒能等到該規(guī)范通過就已經(jīng)被收購或倒閉了。與微軟在.NET平臺(tái)上的乾剛獨(dú)斷相比,J2EE發(fā)展中的這個(gè)“牛步”特征雖說是審慎和民主的表現(xiàn),但終歸不符合軟件演化應(yīng)有的速度。
J2EE社區(qū)中的另一股重要力量,當(dāng)然是種類極為豐富的開放源代碼項(xiàng)目。2002年以來,在J2EE領(lǐng)域的各個(gè)層面上,幾乎所有主流產(chǎn)品都有來自開源項(xiàng)目的替代方案,在其中很多位置上,開源產(chǎn)品反而是勝過商業(yè)產(chǎn)品的首選。但請(qǐng)別誤解,這里的“開源”并不意味著完全的自動(dòng)自發(fā),J2EE世界中的開源項(xiàng)目也與Linux或PHP世界頗為不同。在很多非常成功的J2EE開源項(xiàng)目背后,我們都能發(fā)現(xiàn)商業(yè)機(jī)構(gòu)的推動(dòng)作用:Apache的Jakarta社區(qū)是IBM扶植的結(jié)果;實(shí)現(xiàn)了開源應(yīng)用服務(wù)器JOnAS的ObjectWeb,則是許多法國IT廠商(包括若干政府部門)合資支持的一個(gè)聯(lián)盟組織……這些有商業(yè)背景的開源項(xiàng)目資金雄厚,人員齊整;更重要的是,從投資者到開發(fā)者,參與這些項(xiàng)目的很多人都體現(xiàn)了軟件工業(yè)中難得的非功利心態(tài),因而最終推出的產(chǎn)品質(zhì)量甚至高于同類型的商業(yè)軟件。在主流廠商之外,它們是支撐J2EE大廈存在的一組基石。
另一方面,不少開發(fā)者也間接地通過自己的開源產(chǎn)品獲得了可觀的盈利。這些人大多以免費(fèi)的開源產(chǎn)品為依托,以收費(fèi)方式提供附加的咨詢、方案實(shí)施以及技術(shù)支持服務(wù)。Marc Fleury,開源應(yīng)用服務(wù)器的JBoss創(chuàng)始人,不無矛盾地把自己倡導(dǎo)的這種商業(yè)模式稱為“職業(yè)開源開發(fā)”。
無論叫它什么,高端產(chǎn)品的開源化/免費(fèi)化運(yùn)動(dòng)注定要在J2EE產(chǎn)業(yè)的發(fā)展過程中制造顯著的后果。“JBoss的行徑惡化了J2EE的商業(yè)環(huán)境,”這是McNealy先生2002年的著名論斷。他的推理過程如下:只有做好商業(yè)推廣,J2EE產(chǎn)品才能最終擊潰邪惡的.NET平臺(tái);但開源服務(wù)器會(huì)降低主流廠商的銷售利潤;銷售利潤越低,用于商業(yè)推廣的預(yù)算就越少;因此,整個(gè)J2EE陣營都將受損于JBoss。
但在狂熱的開源運(yùn)動(dòng)支持者看來,以上論證的大前提就是可疑的。“難道只有會(huì)做廣告的軟件才是好軟件?MySQL有過多少廣告預(yù)算”爭(zhēng)論的雙方都認(rèn)為對(duì)手誤解了軟件商業(yè)模型的實(shí)質(zhì)。究竟誰才掌握了這里的真理呢?也許只有根據(jù)J2EE的未來——也就是它的目標(biāo)和終點(diǎn)(Telos)——才能做出最終的裁決。
技術(shù)的離心力
考察事物的演化,通常有兩種對(duì)立的方法。考古學(xué)家(Archaeologist)探究肇始和起源;目的論者(Teleologist)則揭示目的和終點(diǎn)。對(duì)于前者,“開端(希臘語Arche)”從根本上決定了此后的發(fā)展,參天大樹的繁茂都包含在種子最初的萌芽中;而對(duì)于后者,“目的(Telos)”才是事物的根本和旨?xì)w:誰沒見過樣態(tài)完善的樹,誰也就沒法弄懂種子到底是怎么回事。
在J2EE五年之后,人們只能交替地用這兩種目光審視它的演化歷程。它的起源與它的目的、“它從何處來”與“它往何處去” 的問題緊密地交織在一起,誰拾起了其中的一個(gè),誰也就要連同另一個(gè)一起回答。
今天的J2EE在多大程度上符合它的初衷?回答這個(gè)問題并不涉及對(duì)J2EE技術(shù)成敗的評(píng)判,而只是要考察一下:它是否還運(yùn)行在最初開辟的那個(gè)空間之中。在事務(wù)處理、對(duì)象分布化和Web請(qǐng)求處理這三個(gè)方面中,也許J2EE對(duì)事務(wù)和Web保持了一貫的忠誠。我們記得Fleury喜歡重復(fù)的一個(gè)信條:“He who owns the transactional Web owns the Web(誰掌握了帶事務(wù)處理的Web,誰就掌握了Web)”Web接口是今天大部分J2EE應(yīng)用暴露的唯一接口;而雖然事務(wù)處理的常用方法已經(jīng)有了很大改變(借助AOP機(jī)制,很多非EJB架構(gòu)的系統(tǒng)也自如地實(shí)現(xiàn)了聲明式的事務(wù)處理),但對(duì)事務(wù)的重視當(dāng)然仍將是J2EE開發(fā)中的要素之一。
換言之,在5年的演化中,J2EE發(fā)生的最大變化可能就在于它放棄了對(duì)“分布式對(duì)象模型”的強(qiáng)調(diào)。EJB2.0引入的本地接口使得Web層與EJB層可以運(yùn)行在同一個(gè)Java虛擬機(jī)中,從而使Web容器與EJB容器的物理分離部署變成一種昂貴的冗余;J2EE 1.4以后版本支持的Web Services兼容性,使得客戶端可以通過粗粒度的Web接口調(diào)用遠(yuǎn)程服務(wù)——這兩次變化事實(shí)上都是在論證“分布式對(duì)象架構(gòu)”的無用性。人們發(fā)現(xiàn),同一系統(tǒng)的各個(gè)分層最好采用細(xì)粒度接口調(diào)用,并且運(yùn)行在同一個(gè)進(jìn)程中;之所以劃分不同的層次,與其說是為了實(shí)現(xiàn)物理上的可擴(kuò)展性,不如說是設(shè)計(jì)美學(xué)上的考慮。而對(duì)于異質(zhì)系統(tǒng)之間的調(diào)用,則應(yīng)該盡量選用異步的、粗粒度的服務(wù)接口(所以Web Services成為了非常理想的選擇)。換句話說,傳統(tǒng)上的“分布式對(duì)象架構(gòu)”,現(xiàn)在看來似乎只適合于銀行遠(yuǎn)程支付等要求極為苛刻的應(yīng)用場(chǎng)景,而絕不是所有J2EE應(yīng)用都該考慮的標(biāo)準(zhǔn)方案。
前面描述的離心現(xiàn)象畢竟還遵循了J2EE發(fā)展的內(nèi)在邏輯,說到底,EJB的革新和Web Services的引入更多地是主流廠商倡導(dǎo)的結(jié)果。但在近年來,還有一股更強(qiáng)勁的離心潮流在深刻地影響著J2EE的演進(jìn),它肇始于上文提到的開源軟件運(yùn)動(dòng)。最初它只在Rickard Oberg的動(dòng)態(tài)代理RMI設(shè)計(jì)與JBoss服務(wù)器的微內(nèi)核架構(gòu)中顯露過邪惡的一角,但是兩三年來,經(jīng)過多個(gè)項(xiàng)目、各種技術(shù)雜志/論壇/Blog的折射和放大,它已經(jīng)形成了一個(gè)名為“輕量級(jí)容器架構(gòu)”的完整解決方案,并暴露出完全取代傳統(tǒng)EJB架構(gòu)的終極野心。按照這一運(yùn)動(dòng)信徒們的說法,J2EE的發(fā)展史上只出現(xiàn)過一個(gè)錯(cuò)誤——不幸的是,這個(gè)錯(cuò)誤名叫EJB。與EJB提供的重量級(jí)架構(gòu)不同,借助AOP和IoC機(jī)制,輕量級(jí)容器能夠最大程度地降低代碼對(duì)于專用接口的依賴性,以簡短、輕便、專注、可移植的方式實(shí)現(xiàn)業(yè)務(wù)對(duì)象。從“輕量級(jí)容器架構(gòu)”這個(gè)詞被發(fā)明出來的那一刻起,人們對(duì)J2EE遠(yuǎn)景的考慮就發(fā)生了根本性的分裂:Sun和大部分主流廠商更多地關(guān)注于“Web Services”和“快速開發(fā)工具”這些利潤增長點(diǎn),而一部分離經(jīng)叛道的獨(dú)立專家和開發(fā)者則認(rèn)為,如果不把輕量級(jí)容器納入規(guī)劃,J2EE的發(fā)展藍(lán)圖就注定無足稱道。其實(shí),雙方爭(zhēng)執(zhí)的關(guān)鍵是傳統(tǒng)意義上的“應(yīng)用服務(wù)器”的存亡——如果所有企業(yè)級(jí)服務(wù)都可以通過AOP機(jī)制提供給普通Java對(duì)象,如果管理業(yè)務(wù)對(duì)象生命周期的可以是一個(gè)最微不足道的“微內(nèi)核”,那么深盔重鎧的應(yīng)用服務(wù)器還有什么存在理由?而如果失去了應(yīng)用服務(wù)器的這個(gè)產(chǎn)品類型,那些靠這項(xiàng)銷售起家的廠商又將何以自處?
正是在這里,兩個(gè)陣營之間存在著最深刻的利益分歧;而這場(chǎng)爭(zhēng)執(zhí)的結(jié)局當(dāng)然也將決定J2EE(乃至Java企業(yè)開發(fā))的最終走向。或許兩年之后,我們將從紛爭(zhēng)中勝利者一方的角度重述J2EE的整部歷史——或許兩年之后的J2EE本身也將隨著紛爭(zhēng)的解決而成為歷史。但讓我們換個(gè)樂觀的口吻:問世五年,J2EE的歷史仍在持續(xù)的創(chuàng)生之中;此時(shí)善待這樹種的人,也必在今后的樹蔭下獲得它的祝福。
Java十年有成
——談J2ME的發(fā)展歷史
文/王森
Java本來就是為了嵌入式系統(tǒng)而生
1990年12月,Sun內(nèi)部由James Gosling、Patrick Naughton以及Mike Sheridan成立了一個(gè)叫做Green Team的小組。Green Team小組的主要目標(biāo),是要發(fā)展一種新架構(gòu),而這種架構(gòu)必須能夠在消費(fèi)性電子產(chǎn)品作業(yè)平臺(tái)上運(yùn)行,現(xiàn)在我們普遍認(rèn)識(shí)的PDA、手機(jī)或是信息家電(IA),都是屬于這種架構(gòu)的目標(biāo)平臺(tái)。接著,Green Team在1992年的9月3號(hào),發(fā)表了一款由Java 技術(shù)之父 James Gosling所領(lǐng)軍研發(fā),名叫Star Seven(*7)的機(jī)器,研發(fā)出一部交互式的掌上型家用娛樂裝置,可透過使用動(dòng)畫觸碰式屏幕的使用者接口來控制其它電子設(shè)備。
經(jīng)過了13年的時(shí)間,現(xiàn)在我們檢視J2ME的發(fā)展歷史,我們可以發(fā)現(xiàn),雖然在1999年,Java被切割成J2SE、J2ME、J2EE,所以有了J2ME這個(gè)名詞的出現(xiàn)。但是Java并非1999年開始才開始發(fā)展嵌入式系統(tǒng)上的應(yīng)用。其實(shí),Java本來就是為了嵌入式系統(tǒng)而發(fā)展的一種架構(gòu)。即使目前大家多半將Java的應(yīng)用聚焦于企業(yè)上的J2EE應(yīng)用。但是嚴(yán)格來說,J2ME才是Java真正“回歸本心”的領(lǐng)域。
半路殺出的Personal Java
Personal Java是正規(guī)Java版本的一個(gè)分支,其目的在于能夠讓PDA或高階手機(jī)執(zhí)行Java程序,目前在Windows Mobile或Symbian OS(僅限采用UIQ或Nokia Series 80的行動(dòng)電話)平臺(tái)上都可以開發(fā)Personal Java應(yīng)用程序。
雖然從Java 1.0發(fā)表之后,Java就被廣泛地使用在桌上型應(yīng)用程序以及Applet的開發(fā)上,但是,從Java 1.1開始,Java又回到了它一開始的老路-也就是嵌入式系統(tǒng)方面的應(yīng)用,在當(dāng)時(shí)Sun Microsystems發(fā)表了Embedded Java與Personal Java(也有人簡稱為PJava)這兩項(xiàng)規(guī)格。Personal Java的規(guī)格是從Java 1.1之中所分支出來,因此Personal Java的規(guī)格是根據(jù)Java 1.1的規(guī)格而制定的,但是并非Java 1.1的全部規(guī)格都包含進(jìn)來,所以Personal Java只能算是Java 1.1平臺(tái)的子集合。
Personal Java特別適合用在具有豐富圖形顯示能力的消費(fèi)性電子產(chǎn)品上面,于是我們可以發(fā)現(xiàn)Sun Microsystems網(wǎng)站上對(duì)于Personal Java的參考實(shí)作是建立在Windows Mobile產(chǎn)品(過去叫做Pocket PC)上頭的。
在1999年,一般PDA或手機(jī)的能力,離Personal Java所需要的硬件條件仍有很大的一段差距,因此Personal Java并不是一個(gè)很成功的產(chǎn)品。因此Sun Microsystems在此時(shí)將Java區(qū)分成J2SE、J2EE、J2ME這三塊,希望可以重新塑造整個(gè)架構(gòu),尤其是J2ME,希望Java可以在嵌入式系統(tǒng)的領(lǐng)域有所發(fā)展。
J2ME從何而來?
談到J2ME,大家就會(huì)聯(lián)想到KVM這個(gè)名詞, KVM的設(shè)計(jì)者Antero Taivalsaari,最早在Sun Microsystems參與Spotless Project,這個(gè)項(xiàng)目才是J2ME的最早起源。由于Antero Taivalsaari曾經(jīng)在世界知名電信設(shè)備制造商工作,所以他有了在手機(jī)上開發(fā)JVM的概念,后來得到公司支持,就有了各位所知的KVM(K Virtual Machine)。
最早應(yīng)用KVM的產(chǎn)品,就是一個(gè)可以在Palm OS上執(zhí)行的KJava。KJava并不算是一個(gè)正式產(chǎn)品,只能算是一個(gè)概念測(cè)試產(chǎn)品。開發(fā)人員會(huì)開發(fā)名為Spotlet的應(yīng)用程序,透過工具和KVM的輔助,應(yīng)用程序就可以在PDA上執(zhí)行。雖然KJava早已成為過去式,但是仍有電信廠商使用這個(gè)名詞,作為手機(jī)上Java平臺(tái)的名稱,不過,已經(jīng)不是真正的KJava了。有了KJava的發(fā)展經(jīng)驗(yàn),Sun著手設(shè)計(jì)J2ME的架構(gòu),讓J2ME可以應(yīng)付未來嵌入式系統(tǒng)的發(fā)展。
J2ME整體架構(gòu)
J2ME最基本的規(guī)范制定在JSR-68(Java規(guī)格編號(hào)第68號(hào)),在此規(guī)格里頭定義了J2ME的技術(shù)架構(gòu)。根據(jù)此規(guī)范,J2ME由三種類型的規(guī)范堆棧而成,分別是Configuration、Profile以及Optional Packages。這三種類型的規(guī)范定義由其它的規(guī)范所定義。
在最底層的Configuration規(guī)范,定義了硬件所必須具備的能力,比方說硬件至少具備多少ROM、RAM,CPU的頻率最少應(yīng)該是多少,連接網(wǎng)絡(luò)時(shí)頻寬至少要多快。Configuration規(guī)格之中定義了一組低階的API,這代表Java至少必須提供的低階功能,這組低階的API就是核心類別函數(shù)庫的子集合。
在Configuration之上的規(guī)范稱為Profile。Profile針對(duì)各種不同機(jī)器的特性定義了高階的API,這些高階的API通常都是與其它平臺(tái)不相關(guān)的擴(kuò)充類別函數(shù)庫。這些高階API決定了該種機(jī)器上Java程序的撰寫方法。比方說行動(dòng)通訊裝置(手機(jī)、PDA等)這類型裝置上Java程序的撰寫方式,以及能夠調(diào)用的API,都定義在MIDP(Mobile Information Device Profile)之中。
就算是同類型的裝置,有些功能也不一定具備(有些廠商的機(jī)器可能有,有些廠商的機(jī)器可能沒有,例如手機(jī)上的照相機(jī)、和弦鈴聲等),這些功能就定義在“廠商選擇性實(shí)現(xiàn)套件(Optional Package)”之中,比方說,有的廠商會(huì)提供簡單的數(shù)據(jù)庫管理系統(tǒng)(DBMS)在該裝置上,那么他們就會(huì)實(shí)現(xiàn)JDBC Optional Package。不提供數(shù)據(jù)庫管理系統(tǒng)的廠商就不需要實(shí)現(xiàn)JDBC Optional Package。所以稱作廠商選擇性實(shí)現(xiàn)套件。
所謂的廠商選擇性實(shí)現(xiàn)套件,意思是說,這是一組和其它規(guī)格(或API)沒有任何相依性的類別函數(shù)庫,如果廠商愿意提供這樣的功能給程序設(shè)計(jì)師(通常是因?yàn)橛布哂谐浞值哪芰梢酝瓿梢?guī)格之中所制定的功能),就會(huì)將這組類別函數(shù)庫實(shí)現(xiàn)出來,程序設(shè)計(jì)師也可以利用這些功能開發(fā)出功能更多的應(yīng)用程序。
MIDP工業(yè)標(biāo)準(zhǔn)
雖然J2ME架構(gòu)完整,但是目前的發(fā)展,除了Personal Profile之外,最大的應(yīng)用在于架構(gòu)在CLDC之上的MIDP。目前所有標(biāo)示可以支持Java的手機(jī),所支持的都是MIDP,幾乎所有的無線通訊廠商皆采用MIDP作為其開發(fā)程序的標(biāo)準(zhǔn)。
在MIDP 1.0的時(shí)代,由于規(guī)格上本身的功能不足,使得許多廠商不得不加入自己專屬的API,例如震動(dòng)、背光、聲音等擴(kuò)充功能(例如:Nokia UI API),以彌補(bǔ)MIDP平臺(tái)的不足。
到了MIDP 2.0,增加了許多眾所期盼的功能,但是,即使規(guī)格更清楚了,即使很多新功能都已經(jīng)由JCP制定成標(biāo)準(zhǔn)的Optional Packages,這些問題依然無解。市面上的MIDP平臺(tái)仍然處于混亂狀態(tài)。開發(fā)者必須在執(zhí)行時(shí)期偵測(cè)各種專屬API和Optional Package的存在,這會(huì)增加多余的程序代碼。平臺(tái)的混亂會(huì)造成在某個(gè)裝置上可以順利安裝及執(zhí)行,而到了其它裝置時(shí),有可能無法執(zhí)行,甚至有可能連安裝都有問題,所以開發(fā)者通常要開發(fā)好幾種版本的MIDP應(yīng)用程序供各種廠牌、各種型號(hào)的裝置使用。
為了解決上述問題,進(jìn)一步提高M(jìn)IDP應(yīng)用程序的可移植性,Sun Microsystems以MIDP 2.0規(guī)格為核心,設(shè)計(jì)了JTWI規(guī)格。未來的無線通訊平臺(tái),將不會(huì)只有符合MIDP 2.0規(guī)格,而是必須要符合JTWI規(guī)格。這將是J2ME軟件在可移植性上的一大突破。JTWI(Java Technology for Wireless Industry)是一個(gè)統(tǒng)合性的規(guī)格,其目的是為了確保MIDP軟件的可移植性。所以JTWI規(guī)格除了規(guī)范無線通訊平臺(tái)(特別是手機(jī))所必須支持的J2ME標(biāo)準(zhǔn)之外,也對(duì)既有規(guī)格中模糊不清的地方與以加強(qiáng)。所以新款的手機(jī)為了加強(qiáng)移植性,都會(huì)支持JTWI標(biāo)準(zhǔn)。JTWI只是一個(gè)統(tǒng)合性的規(guī)范,并沒有制定任何新功能,目的只是要統(tǒng)一當(dāng)前平臺(tái)混亂的現(xiàn)象,讓J2ME應(yīng)用程序更具可移植性。JTWI主要分成幾個(gè)部分:
1 .規(guī)定平臺(tái)必須支持的API。
2 .統(tǒng)一的應(yīng)用程序執(zhí)行環(huán)境。
3 .既有規(guī)格的理清與加強(qiáng)。
在規(guī)定平臺(tái)必須支持的API的部分,JTWI規(guī)定至少必須支持CLDC 1.0、MIDP 2.0以及WMA 1.1:
所以,只要廠商宣稱支持JTWI平臺(tái),那么代表一定支持CLDC 1.0、MIDP 2.0以及WMA 1.1規(guī)格之中的所有功能。另外,廠商可以根據(jù)裝置本身的能力,將CLDC 1.0提升成CLDC 1.1,可以加入MMAPI 1.1。因此實(shí)際上JTWI平臺(tái)會(huì)有一下幾種組合方式:
其中,CLDC 1.1 + MIDP 2.0 + WMA 1.1 + MMAPI 1.1是最完整、功能最強(qiáng)平臺(tái)。
在統(tǒng)一應(yīng)用程序執(zhí)行環(huán)境方面,過去讓J2ME應(yīng)用程序開發(fā)者最為頭大的問題有以下幾項(xiàng):
● 應(yīng)用程序的大小可以多大?
● 執(zhí)行時(shí)期的內(nèi)存有多少可以使用?
● 有多少內(nèi)存空間可以作為永久儲(chǔ)存之用?
由于規(guī)范中對(duì)于J2ME應(yīng)用程序本身的大小和執(zhí)行環(huán)境沒有很詳細(xì)地規(guī)范,使得每家廠商都有自己的規(guī)范,比方說Nokia限制應(yīng)用程序最大只能30 KB,Motorola則可以支持50 KB以上的應(yīng)用程序。這些規(guī)范都嚴(yán)重地困擾著開發(fā)人員。這些問題在JTWI之中都獲得改善。
JTWI定義了應(yīng)用程序的標(biāo)準(zhǔn)大小(Standard-size Application)。JTWI規(guī)定,可以執(zhí)行J2ME應(yīng)用程序的行動(dòng)通訊裝置,至少可以容許大小為64 KB以上的程序主體(JAR文件)、5 KB以上的應(yīng)用程序描述文件(JAD文件)、以及30 KB以上的永續(xù)儲(chǔ)存空間、執(zhí)行時(shí)期的內(nèi)存(Heap Memory)為256 KB。上述大小只是底線,廠商可以視裝置的實(shí)際能力支持更大的內(nèi)存空間。標(biāo)準(zhǔn)應(yīng)用程序大小(Standard-size Application)將成為一個(gè)計(jì)算用的單位,舉例來說,廠商會(huì)說這個(gè)裝置可以安裝20個(gè)標(biāo)準(zhǔn)應(yīng)用程序,開發(fā)者所撰寫的程序可以說這個(gè)程序需要占掉3個(gè)標(biāo)準(zhǔn)應(yīng)用程序的空間。
至于對(duì)既有規(guī)格的理清與加強(qiáng)的部分,我們將在往后章節(jié)一一說明。最重要的一點(diǎn)是,JTWI規(guī)定,該裝置所支持的任何媒體格式(例如圖片、聲音、影像等)都應(yīng)該能夠使用HTTP 1.1獲取,也就是說,存取這些媒體時(shí)所使用的URL都必須能夠接受http作為存取的通訊協(xié)議。
Java開發(fā)環(huán)境的
過去、現(xiàn)在和將來
文/EclipseCN
1995年3月23日,San Jose Mercury News登出一篇題為“Why Sun thinks Hot Java will give you a lift”的文章,在那篇文章里預(yù)言Java技術(shù)將是下一個(gè)重大事件,這個(gè)預(yù)言現(xiàn)在看來并不僅僅是商家的宣傳伎倆,雖然文章是當(dāng)時(shí)Sun的公關(guān)經(jīng)理 Lisa Poulson安排撰寫的。從世人知道Java那一刻起到現(xiàn)在,算起來已經(jīng)過去整整十年,回顧過去的十年值得總結(jié)的東西有許多,但在這里筆者只想就Java 開發(fā)環(huán)境談些個(gè)人的想法與朋友們交流一下。
現(xiàn)在的軟件開發(fā)人員在整個(gè)軟件的開發(fā)生命周期里,也許會(huì)根據(jù)需要使用各式各樣的開發(fā)工具來完成相對(duì)復(fù)雜的開發(fā)任務(wù),而在幾十年以前,人們還只是使用文本編輯器、編譯器和Debugger進(jìn)行開發(fā),對(duì)于這個(gè)階段的開發(fā)環(huán)境人們稱之為CLEs(Command Line Environments)。 而當(dāng)人們發(fā)現(xiàn)如果將那些單獨(dú)分開的開發(fā)工具集成起來就可以有效的提高開發(fā)效率時(shí),IDEs(Integrated Development Environments)就出現(xiàn)了。Java的出現(xiàn)盡管只有十年,但其開發(fā)環(huán)境也大至經(jīng)歷了從CLEs到IDEs再到XDEs這三個(gè)階段,現(xiàn)在即將進(jìn)入CDEs階段。在上述Java開發(fā)環(huán)境發(fā)展過程中,有許多值得我們大家關(guān)注的地方。
Java開發(fā)環(huán)境的歷史回顧
縱觀過去十年Java開發(fā)環(huán)境的發(fā)展,大致可以粗略的劃分為如下幾個(gè)階段:
●??1995,命令行開發(fā)環(huán)境CLEs
●??1996-2000,集成開發(fā)環(huán)境IDEs
●??2001-2004,擴(kuò)展開發(fā)環(huán)境XDEs
●??2005至今,協(xié)同開發(fā)環(huán)境CDEs
1995年,不平凡的一年,這一年Java 獲得了成功。可令人尷尬的是在1995年并沒有一個(gè)令人滿意的Java開發(fā)環(huán)境,開發(fā)人員在進(jìn)行Java編程時(shí),大多使用文本編輯器編輯源程序,然后再使用命令行的方式進(jìn)行編譯處理。那時(shí)的Java開發(fā)環(huán)境還處于CLEs時(shí)代,開發(fā)效率非常低,這預(yù)示著在Java開發(fā)工具上會(huì)有一番激烈的競(jìng)爭(zhēng)。
有人稱1996年為互聯(lián)網(wǎng)年,有人卻稱之為Java年,還有人稱之為Web開發(fā)年,但不論如何稱呼1996年,它都反映了一個(gè)事實(shí):Bill Joy將Java與互聯(lián)網(wǎng)相結(jié)合的策略取得了成功。這一年的9月Sun推出了其Java開發(fā)環(huán)境-Java WorkShop,這是一款基于瀏覽器的Java開發(fā)工具,但由于當(dāng)時(shí) Java在許多方面還不成熟,所以實(shí)際上Java WorkShop并不成功,同年發(fā)布的Symantec Visual Cafe由于還是采用C/C++語言進(jìn)行開發(fā),所以性能與成熟度上就比WorkShop好得多。提到Visual Cafe就不能不提Eugene Wang,因?yàn)镋ugene Wang常常是與計(jì)算機(jī)間諜這個(gè)詞同時(shí)出現(xiàn)的人物,有人甚至講當(dāng)時(shí)Symantec的老板Gordon Eubanks與Eugene Wang簽約時(shí),也同時(shí)簽下了監(jiān)獄里的一個(gè)單元。Visual Cafe就是由Eugene Wang進(jìn)行主要策劃的,它是在同一年發(fā)布的Java開發(fā)環(huán)境中,唯一解決了與數(shù)據(jù)庫連接問題的開發(fā)環(huán)境,帶有一套可以與數(shù)據(jù)庫相連接的組件,無需太多編程使用拖拽的方式就可完成大部分工作,這一優(yōu)點(diǎn)使得Visual Cafe受到了Java開發(fā)人員的歡迎。這一年IBM收購了OTI公司,從而得到了Dave Thomas的弟子John Duimovich、Dave Thomson、Mike Wilson等一大批軟件精英,這之中還包括“生活在技術(shù)刀鋒上的開發(fā)者”Brian Barry。
1997年,由于微軟壟斷案,使得微軟在Java開發(fā)環(huán)境上的努力受到了限制,Visual Cafe由于界面直觀易用,可以很容易地連接各種數(shù)據(jù)源等功能再次受到開發(fā)人員的歡迎。這一年IBM發(fā)布VisualAge for Java。VisualAge for Java是面向代碼庫的開發(fā)環(huán)境,它提供代碼庫和項(xiàng)目管理以便于開發(fā)團(tuán)隊(duì)在 C/S環(huán)境下進(jìn)行項(xiàng)目開發(fā)。但由于大多數(shù)Java開發(fā)人員比較熟悉面向文件的開發(fā)環(huán)境,還不太習(xí)慣面向代碼庫的開發(fā),再加上VisalAge for Java對(duì)系統(tǒng)資源的要求比較高等因素,使得VisualAge for Java一開始未被Java開發(fā)人員所認(rèn)可。
1998年至2000年比較成功的Java開發(fā)環(huán)境是JBuilder,這是由于Borland較好的把握住 J2SE、J2EE和J2ME發(fā)布后,Java技術(shù)升級(jí)的時(shí)機(jī),全面支持Java1.1和Java1.2開發(fā)平臺(tái),它還提供了多種工具方便用戶從舊的平臺(tái)遷移到新的Java平臺(tái)。JBuilder本身80%是基于JDK1.2進(jìn)行開發(fā)的,它支持JavaBeans, Enterprise JavaBeans, JDBC等方面的應(yīng)用開發(fā),可以連接多種關(guān)系數(shù)據(jù)庫。為支持分布式應(yīng)用開發(fā),JBuilder還集成了 VisiBroker ORB、JSP server、數(shù)據(jù)庫和EJB AppServer,并提供Open Tools API便于第三方工具集成。上述種種的優(yōu)點(diǎn)使得JBuilder一舉超越Visual Cafe,成為當(dāng)時(shí)最受歡迎的Java開發(fā)環(huán)境。在眾多Java開發(fā)環(huán)境中,1999年IBM發(fā)布的VisualAge for Java Micro Edition是比較有特色的開發(fā)環(huán)境,它是由Erich Gamma和與Erich Gamma有“焦不離孟、孟不離焦”之稱的John Wiegand共同進(jìn)行設(shè)計(jì)的,采用了Java 擴(kuò)展機(jī)制,并集成了JUnit測(cè)試框架,其當(dāng)時(shí)所采用的架構(gòu)深深地影響了后來Eclipse1.0所采用的架構(gòu)。同時(shí),通過VisualAge for Java Micro Edition的開發(fā),那些來自“未來世界”(Smalltalk們總認(rèn)為他們來自計(jì)算機(jī)的未來世界)的軟件精英們,全面徹底地對(duì)Java技術(shù)進(jìn)行了評(píng)估,得出了許多結(jié)論性的東西,這之中包括現(xiàn)在鬧得沸沸揚(yáng)揚(yáng)的Swing和SWT對(duì)比。此外,Sun將其收購的NetBeans變成了開源的Java IDE也是一件不大不小的事情。
縱觀1996年至2000年這五年時(shí)間里,隨著Java及其相關(guān)開發(fā)應(yīng)用的發(fā)展,Java開發(fā)環(huán)境也不斷的完善,從CLEs進(jìn)入到IDEs階段。為了提高Java開發(fā)人員的開發(fā)效率,Java開發(fā)環(huán)境主要從兩個(gè)方面進(jìn)行改進(jìn)與提高。一方面是提高集成在Java IDEs當(dāng)中開發(fā)工具的性能和易用性,另一方面是將Java開發(fā)環(huán)境盡可能的覆蓋到整個(gè)軟件的開發(fā)生命周期。隨著基于WEB,采用N-層結(jié)構(gòu)的應(yīng)用開發(fā)成為Java開發(fā)人員主要從事的開發(fā)任務(wù),Java開發(fā)環(huán)境需要支持越來越多的技術(shù),比如:XML、JSP、EJB和CORBA等,這就造成了Java IDEs的規(guī)模變得越來越大,許多Java開發(fā)環(huán)境都集成了數(shù)據(jù)庫、JSP Server和AppServer,軟件的研究人員將上述IDEs不斷膨脹的現(xiàn)象稱為“IDEs大爆炸”。
“IDEs大爆炸”現(xiàn)象發(fā)生以后,有關(guān)Java開發(fā)環(huán)境是走少而精的發(fā)展方向,還是走大而全的發(fā)展方向就成了廣大Java開發(fā)人員關(guān)注的問題。2001年Java開發(fā)人員達(dá)到了200萬,成為每個(gè)軟件供應(yīng)商都無法忽視的力量,這一年JetBrains推出了Java開發(fā)環(huán)境少而精的代表: IntelliJ IDEA。 IntelliJ IDEA明確的表示只做最好的Java代碼編輯器,不做什么文件都可以編寫的編輯器。它關(guān)注Java開發(fā)人員的工作實(shí)際并將這些工作進(jìn)行了優(yōu)化。由于減掉了一些可有可無的工具,所以價(jià)格上相對(duì)合理公道。當(dāng)年IntelliJ IDEA擊敗JBuilder成為最受Java開發(fā)人員歡迎的Java開發(fā)環(huán)境,不過2002年隨著JBuilder將大而全的功力再提升一步,將UML建模工具、JUnit測(cè)試框架以及Apache Struts等開發(fā)工具集成進(jìn)來,大而全的發(fā)展方向又一次受到Java開發(fā)人員追捧。最全還是最好似乎使Java開發(fā)人員在選擇Java開發(fā)環(huán)境時(shí)處于兩難狀況,但實(shí)際上當(dāng)Eclipse 1.0發(fā)布時(shí),這個(gè)問題已經(jīng)得到了初步的解決,最好和最全是可以兼顧的。
Eclipse的出現(xiàn)不是從天上掉下來的,也不是某個(gè)天才拍腦袋想出來的,它是一群軟件精英們集體智慧的結(jié)果。早在1998年IBM就打算開發(fā)新一代的工具平臺(tái)以便將它現(xiàn)有的各種開發(fā)工具統(tǒng)一起來,并減少開發(fā)各種工具時(shí)重復(fù)的勞動(dòng),同時(shí)希望在新的平臺(tái)上建立新的Java開發(fā)環(huán)境。經(jīng)過一段時(shí)間的準(zhǔn)備, IBM開始建立起一個(gè)開發(fā)團(tuán)隊(duì),人員構(gòu)成主要來自VisualAge for Java Micro Edition和VisualAge for Java兩個(gè)項(xiàng)目的開發(fā)人員,選擇的標(biāo)準(zhǔn)是過去10年至少開發(fā)過5到6個(gè)IDE。此外,IBM還聯(lián)合了9家公司共同成立了一個(gè)開源組織Eclipse基金會(huì),將Eclipse提供給開發(fā)人員使用,并在開源社區(qū)的幫助下進(jìn)一步完善Eclipse本身。Eclipse在最初設(shè)計(jì)時(shí),插件模型是靜態(tài)的,不能實(shí)現(xiàn)插件的即插即用功能,即便是大受歡迎的Eclipse 2.1也還是靜態(tài)的。所以到2004年發(fā)布Eclipse 3.0時(shí),Eclipse進(jìn)行了重大改進(jìn),采用OSGi的插件模型,初步實(shí)現(xiàn)了插件的即插即用功能,至此一個(gè)完美的、可擴(kuò)展的開發(fā)環(huán)境展現(xiàn)在Java開發(fā)者面前,這時(shí)Java開發(fā)人員已經(jīng)達(dá)到300萬。
Java開發(fā)環(huán)境的現(xiàn)狀
2004年Eclipse 3.0的發(fā)布極大刺激了Eclipse用戶的增長,經(jīng)過一年以后,Java開發(fā)人員現(xiàn)在使用Java開發(fā)環(huán)境的狀況是如何的呢?看了下面的表格里的數(shù)據(jù)也許可以了解一個(gè)大致的狀況。
首先需要指明的是上述的數(shù)據(jù)并不是當(dāng)前Java用戶使用Java開發(fā)環(huán)境的準(zhǔn)確反映,但我們可以從中了解一個(gè)大致的狀況。現(xiàn)在的Java環(huán)境可以分為三個(gè)集團(tuán),第一集團(tuán)是Eclispe它大約占據(jù)1/3的份額,第二集團(tuán)是 IntelliJ IDEA、NetBeans 和JBuilder占據(jù)另外1/3的份額,相互之間旗鼓相當(dāng),第三集團(tuán)是以JDeveloper和WSAD為代表的十幾種Java開發(fā)環(huán)境占據(jù)剩下的 1/3份額,但每種開發(fā)環(huán)境占總份額的比重不超過5%。我們考察Eclipse、intelliJ IDEA、NetBeans 和JBuilder這些主流開發(fā)環(huán)境,可以發(fā)覺它們有一個(gè)共同的特點(diǎn)那就是可擴(kuò)展,盡管在實(shí)現(xiàn)手段上各有不同。這就是為什么稱現(xiàn)在的Java開發(fā)環(huán)境為XDEs(eXtended Development Environments)的原因,IDEs已經(jīng)死亡了4年,專業(yè)的開發(fā)人員需要了解這個(gè)事實(shí),因?yàn)閄DEs也快死了。
由于市場(chǎng)的壓力,一個(gè)軟件企業(yè)不僅要提高開發(fā)人員個(gè)體的工作效率,還要提高整個(gè)開發(fā)團(tuán)隊(duì)以及整個(gè)企業(yè)的開發(fā)效率,但在現(xiàn)有的Java開發(fā)環(huán)境XDEs下無法完全做到這些,所以新一代開發(fā)環(huán)境CDEs (Collaborative Development Environments)就產(chǎn)生。Grady Booch和Alan W. Brown的研究表明一個(gè)程序員一天工作時(shí)間的分配是這樣的:分析占16%(從5%到40%不等), 設(shè)計(jì)占14%(從1%到40%不等),編程占16%(從0%到60%不等),測(cè)試占10%,打電話占3%,閱讀占7%(電子郵件,文檔,月刊和雜志),參加開發(fā)會(huì)議占10%,無關(guān)的會(huì)議占7% 。從這些數(shù)據(jù)可以發(fā)現(xiàn),開發(fā)人員用于交流的時(shí)間約占工作時(shí)間的1/3,開發(fā)人員的相互交流非常重要。可是現(xiàn)有的主流Java開發(fā)環(huán)境一般僅將分析、設(shè)計(jì)、編程和測(cè)試等工具集成進(jìn)來,卻未包括用于交流的工具,這顯然不合理。因此,所謂CDEs就是將用于人與人、人與團(tuán)隊(duì)以及團(tuán)對(duì)于團(tuán)隊(duì)進(jìn)行交流的工具集成進(jìn)來的開發(fā)環(huán)境,比如,CDEs常具有發(fā)送電子郵件、進(jìn)行及時(shí)通訊和屏幕分享等功能,通過實(shí)現(xiàn)無損耗過程的交流提高開發(fā)團(tuán)隊(duì)的開發(fā)效率。
現(xiàn)在已經(jīng)商業(yè)化的CDEs是CodeBeamer Collaborative Development Platform和CodePro AnalytiX,上述兩款軟件都提供Eclipse的插件,可以與Eclipse集成在一起,使Eclipse升級(jí)成為一個(gè)CDEs。大家肯定知道Borland已經(jīng)宣布開發(fā)基于Eclipse的新版JBuilder-“Peloton”,Peloton就是一個(gè)CDEs(Collaborative Development Environments),當(dāng)它明年上半年發(fā)布時(shí),就意味著Java開發(fā)環(huán)境進(jìn)入CDEs時(shí)代,現(xiàn)在Java開發(fā)環(huán)境還處于XDEs與CDEs交替的階段。
Java開發(fā)環(huán)境的未來
在可以看得見的將來,Java的開發(fā)環(huán)境還會(huì)是以CDEs的形式存在。開源組織或開發(fā)工具供應(yīng)商將會(huì)努力為軟件的開發(fā)創(chuàng)建一個(gè)絕對(duì)光滑的平面 (Frictionless Surface),實(shí)現(xiàn)無損耗的開發(fā)過程,以提高開發(fā)效率。為了實(shí)現(xiàn)無損耗的開發(fā)過程,Java的開發(fā)環(huán)境將會(huì)關(guān)注以下幾個(gè)方面:
●??起步階段方面
●??協(xié)作開發(fā)方面
●??維護(hù)開發(fā)團(tuán)隊(duì)有效溝通方面
●??多個(gè)任務(wù)的時(shí)間協(xié)調(diào)方面
●??相互協(xié)商方面
●??資料有效性方面
但這里必須承認(rèn)未來Java開發(fā)環(huán)境是如何具體去實(shí)現(xiàn)無損耗的開發(fā),還需要時(shí)間給與答案,因?yàn)楝F(xiàn)在所能采用的方法未必是最好的,比如,使用面向文件的 CVS進(jìn)行協(xié)同開發(fā)就有需要改進(jìn)的地方。
總結(jié)
羅里羅唆一大堆,歸納起來不過就是:一個(gè)目的、三種手段以及一條規(guī)律。
一個(gè)目的:十年Java開發(fā)環(huán)境的演變,其目的就是為了提高開發(fā)效率。
三種手段:
●??提高集成在Java開發(fā)環(huán)境中開發(fā)工具的性能和易用性
●??將Java開發(fā)環(huán)境盡可能的覆蓋到整個(gè)軟件的開發(fā)生命周期
●??集成人與人、人與團(tuán)隊(duì)以及團(tuán)對(duì)于團(tuán)隊(duì)進(jìn)行交流的工具
一條規(guī)律:軟件開發(fā)環(huán)境的發(fā)展過程是從CLEs到IDEs再到XDEs最后進(jìn)入CDEs,這是由Grady Booch總結(jié)出來的,套在Java開發(fā)環(huán)境上也適用。
參考文獻(xiàn)
◇ Grady Booch and Alan W. Brown, "Collaborative Development Environments",??Advances in Computers 59, Aug. 2003.
◇ Li-Te Cheng,Cleidson R. B. de Souza,Susanne Hupfer,John Patterson, Steven Ross, "Building Collaboration into IDEs", ACM Queue vol. 1, no. 9 - December/January 2003-2004
◇ J. des Rivie` res,J. Wiegand, "Eclipse: A platform for integrating development tools", IBM System Journal,Volume 43, Number 2, 2004
◇ The Java Extension Mechanism.
◇ Grady Booch, "History of Development Environments", January 29, 20
J2SE發(fā)展演變史
文/Matirx Java社區(qū) 楊洪波 王志舜
J2SE:懷胎
Java的歷史可以追溯到1991年4月,Sun公司的James Gosling領(lǐng)導(dǎo)的綠色計(jì)劃(Green Project)開始著力發(fā)展一種分布式系統(tǒng)結(jié)構(gòu),使其能夠在各種消費(fèi)性電子產(chǎn)品上運(yùn)行,他們使用了C/C++/Oak語言。由于多種原因,綠色計(jì)劃逐漸陷于停滯狀態(tài)。
直至 1994年下半年,由于Internet的迅猛發(fā)展和環(huán)球信息網(wǎng)的快速增長,第一個(gè)全球信息網(wǎng)絡(luò)瀏覽器Mosaic誕生了;此時(shí),工業(yè)界對(duì)適合在網(wǎng)絡(luò)異構(gòu)環(huán)境下使用的語言有一種非常急迫的需求;Games Gosling決定改變綠色計(jì)劃的發(fā)展方向,他們對(duì)Oak進(jìn)行了小規(guī)模的改造,就這樣,Java在1995年的3月23日誕生了!Java的誕生標(biāo)志著互聯(lián)網(wǎng)時(shí)代的開始,它能夠被應(yīng)用在全球信息網(wǎng)絡(luò)的平臺(tái)上編寫互動(dòng)性及強(qiáng)的Applet程序,而1995年的Applet無疑能給人們無窮的視覺和腦力震蕩。
但沒有相應(yīng)的開發(fā)庫而只靠Java語言來進(jìn)行開發(fā)肯定是困難重重,所以Sun公司在1996年的1月23日發(fā)布了JDK 1.0來幫助開發(fā)人員的開發(fā)。JDK包括兩大部分:運(yùn)行環(huán)境和開發(fā)工具。緊跟著,Sun公司在1997年2月18日發(fā)布了JDK 1.1。JDK1.1相對(duì)于舊版本最大的改進(jìn),是推出了JIT(Just-In-Time)編譯器,另外一個(gè)改進(jìn)是AWT 1.1。
在JDK 1.1時(shí)代,Java平臺(tái)分為PersonalJava與EmbeddedJava,前者比較適用于運(yùn)算資源和內(nèi)存豐富的設(shè)備,而資源有限者適用于后者。這樣的分類明顯不符合時(shí)代發(fā)展的潮流,所以,Java平臺(tái)處處蘊(yùn)藏著新的翻天覆地的革命……
J2SE1.2:誕生
JDK 1.2在1998年12月4日的隆重發(fā)布,標(biāo)志著Java2平臺(tái)的誕生。Java 2的J2SE 1.2時(shí)代是一個(gè)大變革時(shí)代,它進(jìn)行了如下的三大革命:
● 市場(chǎng)推廣革命
Sun公司在Java 1.2版以后將JDK 1.2改名為J2SDK,將Java改名為Java 2。在1999年Sun公司還將Java 2平臺(tái)分為三大塊:J2SE,J2EE,J2ME。這次市場(chǎng)推廣革命順應(yīng)了網(wǎng)絡(luò)急速發(fā)展的潮流,對(duì)Java 2平臺(tái)的發(fā)展起到了很好的催化劑的作用。
● API供應(yīng)標(biāo)準(zhǔn)革命
而隨著供應(yīng)商的不同,Java的API分為三大類:
Java Core API:由Sun公司制定的基本的API,所有的Java平臺(tái)都應(yīng)該提供。
Java Optional API:由Sun公司制定的擴(kuò)充API,Java平臺(tái)可以有選擇地提供。
特殊API:由特殊廠商或者組織提供的API。
● API制定過程的革命
如果你有需求不能通過遵循標(biāo)準(zhǔn)的API來實(shí)現(xiàn),可以向JCP提出制定新的API的請(qǐng)求,經(jīng)過審核,你的請(qǐng)求可能被通過或者駁回;如果是被通過,則開始進(jìn)入制定該API的程序。
J2SE 1.2時(shí)代進(jìn)行的這些革命形成的制度一直沿用到現(xiàn)在,對(duì)Java技術(shù)的發(fā)展形成了深遠(yuǎn)的影響。
除了上述的三大革命,Java 2還支持并新增了許多新特性,最受追捧的當(dāng)屬Swing庫。Swing是輕量級(jí)的API,它不但有各式各樣先進(jìn)的組件,而且連組件風(fēng)格都可抽換。Swing出現(xiàn)之后,大家很快地就不太使用AWT了。Java 2還廢棄了一些API,最重要的莫過于Thread類中對(duì)suspend(),resume()和stop()等方法的廢棄。由于JDK 1.1的集合類庫中的Vector類和HashTable類都考慮了同步,在平常的使用中影響效率,所以Java 2專門添加了對(duì)應(yīng)的非同步類,并完善了集合類庫。
J2SE1.3:拓廣
Java 2平臺(tái)推出后,得到了市場(chǎng)的強(qiáng)烈反響,所以,在2000年5月8日推出的J2SE 1.3對(duì)J2SE 1.2的改進(jìn),主要是對(duì)各種已有API的加強(qiáng)和對(duì)新API的拓展。
數(shù)字運(yùn)算:加入了java.lang.StrictMath,方便我們的一般的數(shù)字運(yùn)算。
新的Timer API:相信大家對(duì)其中的java.util.Timer和java.util.TimerTask一定不陌生。
Collections包:加入了一些新的API,方便我們的使用。
虛擬機(jī)停止鉤子:J2SE 1.3還加入了一個(gè)強(qiáng)大的功能,那就是虛擬機(jī)停止鉤子(Virtual Machine Shutdown Hooks),這個(gè)功能使得我們能夠在虛擬機(jī)停止時(shí)完成我們自己的操作,比如關(guān)閉網(wǎng)絡(luò)連接或者保存會(huì)話狀態(tài)或者清除臨時(shí)文件等等。
DNS服務(wù):在JNDI接口方面,加入了一個(gè)DNS服務(wù)的實(shí)現(xiàn)。
Jini實(shí)現(xiàn):J2SE 1.3包含了一個(gè)Jini實(shí)現(xiàn),這使得我們可以方便地把諸如打印機(jī)、攝像機(jī)和磁盤驅(qū)動(dòng)設(shè)備插入現(xiàn)有網(wǎng)絡(luò)中,并且能自動(dòng)搜索已在網(wǎng)上的設(shè)備可以提供的服務(wù)并享用這些服務(wù)。
XML支持:由于計(jì)算機(jī)網(wǎng)絡(luò)和XML技術(shù)的快速發(fā)展, J2SE 1.3在Optional API中引入了Java API for XML包。
HotSpot虛擬機(jī):J2SE 1.3引入了HotSpot虛擬機(jī)。在Solaris版的JDK 1.3中,已經(jīng)不支持傳統(tǒng)的虛擬機(jī),而Windows版的JDK 1.3同時(shí)支持傳統(tǒng)虛擬機(jī)和HotSpot虛擬機(jī)。
從上面的分析可以看出,J2SE 1.3主要是對(duì)J2SE 1.2查漏補(bǔ)缺和拓展新的API。從應(yīng)用領(lǐng)域方面考慮,J2SE 1.3已經(jīng)涵蓋了數(shù)據(jù)庫、WEB、多媒體、網(wǎng)絡(luò)、電話、影像、加解密、圖形等等大部分的信息技術(shù)領(lǐng)域。
在這個(gè)時(shí)期Java 2還有一個(gè)重要活動(dòng)就是推出SCSL(Sun社區(qū)源代碼許可)許可協(xié)議。Sun公司開放源代碼項(xiàng)目的“女1號(hào)”Danese Cooper在1999年加入公司,負(fù)責(zé)Sun(包括Java)和開放源代碼社區(qū)之間的協(xié)調(diào)工作。Sun一直盡可能在贏利和開放源代碼之間尋求更好的平衡。
Java的大行其道引起了Microsoft的警惕并直接導(dǎo)致了.Net的產(chǎn)生,這同時(shí)也宣布了Java作為獨(dú)一無二的Internet平臺(tái)地位的結(jié)束。這兩個(gè)對(duì)手在較量中相互學(xué)習(xí),現(xiàn)在在技術(shù)架構(gòu)上的目標(biāo)上已趨相同。
J2SE 1.4:快速
J2SE 1.4平臺(tái)的推出發(fā)生在2002年2月13日,由于此前在Java平臺(tái)和.NET平臺(tái)間發(fā)生了規(guī)模浩大的孰優(yōu)孰劣的論戰(zhàn),而論戰(zhàn)中,Java平臺(tái)最大的缺點(diǎn)就是性能問題,所以J2SE 1.4平臺(tái)把性能的改善放在了最重要的位置。
HotSpot虛擬機(jī):HotSpot虛擬機(jī)能夠很大程度上提高性能,所以J2SE 1.4已經(jīng)不支持傳統(tǒng)的虛擬機(jī)。現(xiàn)在,啟動(dòng)應(yīng)用程序應(yīng)該通過-client或者-server選項(xiàng)來啟動(dòng)。
鎖機(jī)制:由于舊版的HotSpot虛擬機(jī)的鎖機(jī)制會(huì)導(dǎo)制嚴(yán)重的性能和功能問題,J2SE 1.4已經(jīng)改寫了該鎖機(jī)制。
安全API:JCE、JSSE和JAAS這三大安全API從optional API移到了core API中。這樣,J2SE 1.4的安全域(SecureRandom)實(shí)現(xiàn)可以利用操作系統(tǒng)提供的安全機(jī)制,以便縮短應(yīng)用程序的啟動(dòng)時(shí)間。
RandomAccess標(biāo)記接口:加入了RandomAccess標(biāo)記接口,如果一個(gè)List實(shí)現(xiàn)了該接口,則表示它支持快速的隨機(jī)訪問,這樣可以提高List訪問的速度。
LinkedHashMap:加入了LinkedHashMap,這是一個(gè)插入排序的Map實(shí)現(xiàn),但它的運(yùn)行速度和HashMap一樣快。
反射:很多產(chǎn)品中都要使用反射(Reflection)機(jī)制,但大家知道,反射是相當(dāng)耗時(shí)的,所以,J2SE 1.4中重寫了java.lang.reflect.Field、java.lang.reflect.Method.invoke()、java.lang.reflect.Constructor.newInstance()和Class.newInstance()等方法,使得我們利用反射也能寫出高性能的應(yīng)用程序。
64位計(jì)算:J2SE 1.4支持64位計(jì)算。
新的I/O API:J2SE 1.4在API層面最大的變動(dòng),就是它更新了原有的java.io包,以及加入了一組更有效率更多功能的New I/O API。
斷言和日志處理:J2SE 1.4版本在Java語言層面上加入了斷言(assert關(guān)鍵字),在API層面上加入日志處理API,這些為程序的調(diào)試提供了強(qiáng)有力的支持。
從上面的分析可以看出,Java 2平臺(tái)在經(jīng)過數(shù)年的發(fā)展后,已經(jīng)比較成熟穩(wěn)定,J2SE 1.4主要是對(duì)平臺(tái)的性能進(jìn)行較多的考慮和修改。在分布式程序方面,1.4版比1.3版的運(yùn)行效率提高了一半以上;而在客戶端程序方面,1.4版比1.3版的效率提高了1/3。
J2SE 1.4版是J2SE第一個(gè)參與了 Java共同體過程(JCP)的J2SE版本。 像Borland、Compaq、Fujitsu、 SAS、 Symbian、 IBM這樣的公司,和Sun一起定義并發(fā)展了J2SE 1.4規(guī)范。在開放、良好的文檔編撰與管理的過程中,形成了一個(gè)高質(zhì)量的、代表了Java共同體的多樣性的規(guī)范。
J2SE5.0:易用
在2004年十月J2SE 5.0發(fā)布的時(shí)候,Sun公司這樣解釋這次版本名稱不是J2SE 1.5而是J2SE 5.0的原因:“從Java誕生至今已有9年時(shí)間,而從有J2SE算起也有5個(gè)年頭了;在這樣的背境下,將該版本號(hào)從1.5改為5.0可以更好的反映出新版的J2SE的成熟度、穩(wěn)定性、可伸縮性、安全性。”
J2SE的這次變更之重大和意義之深遠(yuǎn),的確也值得我們?yōu)橹寻姹咎?hào)變換到J2SE 5.0。我們?cè)倏纯碨un公司網(wǎng)站對(duì)J2SE 5.0的features描述:“通過增強(qiáng)Java平臺(tái)的力量,允許開發(fā)者更容易地使用,Java編程語言的這些改進(jìn)將吸引大量各種Java開發(fā)者”,這是“Java技術(shù)發(fā)展歷程的一個(gè)重要里程碑” 。從這個(gè)描述我們可以看出,J2SE 5.0最大的目標(biāo)是通過提供易用性而吸引各種開發(fā)者(當(dāng)然包括以前的C/C++開發(fā)者) ,而它對(duì)以前版本的修改并不僅僅是API的升級(jí),而且包括對(duì)Java語言層面的改進(jìn),被譽(yù)為是”自Java問世以來的最大一次語言標(biāo)準(zhǔn)變化”。
訪問環(huán)境變量:最初的Java語言有一個(gè)訪問環(huán)境變量的方法System.getenv(),但因?yàn)镴ava宣稱的”Write Once,Run AnyWhere”特性,所以在JDK 1.0中去掉了這個(gè)能夠訪問平臺(tái)專有信息的方法。在J2SE 5.0中,它又來了,并有所擴(kuò)充。由此可見J2SE 5.0對(duì)編程方便性的重視程度。
泛型:J2SE 5.0提供了強(qiáng)大的泛型機(jī)制,讓程序員可以減少代碼重復(fù),這個(gè)變化應(yīng)該可以吸引小部分的C#開發(fā)人員吧。
增強(qiáng)的for循環(huán):為了克服普通for循環(huán)的代碼臃腫特點(diǎn),J2SE 5.0提供了增強(qiáng)的for循環(huán),我們現(xiàn)在可以這樣寫一個(gè)for循環(huán):
public void printAll(Collection coll)
{
for(String str : coll)
{
??System.out.println(str);
}
}
怎么樣?是不是簡單了很多?
自動(dòng)的裝箱/拆箱:
可變參數(shù)數(shù)目J2SE 5.0開始支持Varargs(不固定自變量個(gè)數(shù)),J2SE 5.0中還加入了以前拋棄的枚舉和C風(fēng)格的格式化輸出,這應(yīng)該是為了吸引以前的C開發(fā)者吧。畢竟,在C開發(fā)中枚舉和格式化輸出用的是太多了。
并發(fā) J2SE 5.0中加入了java.util.concurrent包,并向集合框架中加入了Queue接口,J2SE 5.0還為各種集合提供了并發(fā)情況下的實(shí)現(xiàn)。
Properties類增強(qiáng) 由于XML的普及性應(yīng)用,J2SE 5.0為java.util.Properties類加入了從XML文件中裝載屬性和把屬性值存儲(chǔ)到XML文件中的方法。
Annotation功能J2SE 5.0提供了注解(annotation)/元數(shù)據(jù)(metadata)功能,相信以后的大部分應(yīng)用產(chǎn)品都將充分利用它的注解而實(shí)現(xiàn)產(chǎn)品的各種特性。
其它J2SE 5.0還在多線程(并發(fā)機(jī)制)、安全、國際化、UI等方面進(jìn)行了大規(guī)模的變更,使得我們能夠更方便地進(jìn)行Java開發(fā)。
其實(shí),上面的這些變更,并不是我們程序員非要不可的內(nèi)容。我們完全可以通過自己的辦法來達(dá)到這些變更實(shí)現(xiàn)的功能。但J2SE 5.0的目標(biāo)就是讓我們程序員能夠更加方便地進(jìn)行開發(fā),所以,我們?cè)诨贘2SE 5.0開發(fā)時(shí),應(yīng)該能夠明顯的體會(huì)到它的易用性。
展望
時(shí)至今日,J2SE已經(jīng)發(fā)展為一個(gè)覆蓋面廣、效率高、易用性強(qiáng)的技術(shù)平臺(tái)(見如下的J2SE API體系結(jié)構(gòu)圖),但Java并沒有停止前進(jìn)的腳步。Mustang版本的J2SE正在緊鑼密鼓的開發(fā)當(dāng)中,按以前的慣例,每兩年會(huì)發(fā)布一個(gè)全新的J2SE版本,所以Mustang開發(fā)版對(duì)應(yīng)的J2SE 6.0發(fā)布版將在2006年完成。
2005年5月23日是Java技術(shù)十周年慶典日,在這十年的發(fā)展中,Java平臺(tái)吸引了四百萬開發(fā)者,在網(wǎng)絡(luò)計(jì)算遍及全球的今天,更是有17.5億臺(tái)設(shè)備使用了Java技術(shù)。作為Java技術(shù)的基礎(chǔ),J2SE的功績不可掩沒,我們期望J2SE伴隨Java平臺(tái)一路走好!
MATRIX社區(qū)介紹:
Matrix,面向Java愛好者的非贏利性組織。成立以來,Matrix一直不遺余力地為推動(dòng)中國Java技術(shù)和開源軟件的進(jìn)步和發(fā)展而努力,發(fā)布了Jasmin反編譯器,Jmatrix全站系統(tǒng)等開源產(chǎn)品。加入Matrix,與Java共舞([url]www.matrix.org.cn[/url])
中國企業(yè)走近JCP
文/黃海波
對(duì)Java開發(fā)人員,JCP(Java Community Process)這個(gè)名詞并不陌生。但對(duì)國內(nèi)大部分Java開發(fā)人員來說,JCP更多的是一個(gè)符號(hào),一個(gè)國際Java開發(fā)社區(qū)的象征。而對(duì)JCP這個(gè)組織的來源、組成、運(yùn)作模式以及JCP對(duì)中國軟件產(chǎn)業(yè),甚至是我們自身工作事業(yè)的影響可能不甚了了。由于歷史原因、文化語言的差異,國內(nèi)Java廠商一直未能對(duì)JCP引起足夠重視,從而導(dǎo)致國內(nèi)的軟件廠商無法參與到JCP的行業(yè)標(biāo)準(zhǔn)的制定過程中去,結(jié)果就使我們只能跟隨制定好的標(biāo)準(zhǔn),而不能影響標(biāo)準(zhǔn)向著有利于國內(nèi)軟件產(chǎn)業(yè)的方向發(fā)展。
跟隨的劣勢(shì)是很明顯的,以萬眾期待的下一代Java持久化標(biāo)準(zhǔn)EJB 3為例。EJB 3規(guī)范目前仍在早期規(guī)范階段,預(yù)計(jì)要到2006年中期才能完成最終版本,但EJB 3專家組中的Java廠商都已經(jīng)根據(jù)討論的初步意見開始了產(chǎn)品開發(fā),有些甚至開始發(fā)布預(yù)覽版本。而國內(nèi)的J2EE廠商卻可能要等到EJB 3的最終版才可以著手進(jìn)行研究和開發(fā)(根據(jù)早期規(guī)范不可靠,變動(dòng)通常很大),差距自然巨大。在其他諸如如商業(yè)智能、工作流、數(shù)據(jù)挖掘等領(lǐng)域都存在類似情況。
可喜的是國內(nèi)軟件業(yè)的Java行業(yè)組織和管理部門都已經(jīng)認(rèn)識(shí)到,繼續(xù)徘徊在JCP的門外不利于國內(nèi)Java產(chǎn)業(yè)的生存和發(fā)展,也和國內(nèi)龐大的軟件市場(chǎng)不相符合。在許許多多有志之士(很多是筆者的前輩,他們?yōu)閲鴥?nèi)軟件業(yè)發(fā)展默默努力,實(shí)在讓人欽佩)的共同努力下,JCP的中國分支也即將成立。而作為第一個(gè)嘗試,中國的Java應(yīng)用體驗(yàn)認(rèn)證實(shí)驗(yàn)室在國家應(yīng)用軟件產(chǎn)品質(zhì)量監(jiān)督檢驗(yàn)中心、Sun計(jì)算機(jī)系統(tǒng)(中國)有限公司、中國軟件行業(yè)協(xié)會(huì)中間件分會(huì)、北京軟件與信息服務(wù)業(yè)促進(jìn)中心四單位共同努力下在北京成立,為中國的Java軟件廠商在國內(nèi)進(jìn)行軟件的JCP認(rèn)證和兼容測(cè)試。
http://www.souzz.net/bbs/archiver/?tid-49.html
當(dāng)我們說到“Java”這個(gè)詞的時(shí)候,指的是四個(gè)相互關(guān)聯(lián)的概念:Java語言、Java API、Java Class文件格式、Java虛擬機(jī)。整個(gè)Java體系是基于Java 虛擬機(jī)構(gòu)造的,正因?yàn)槿绱耍拍軐?shí)現(xiàn)Java的安全性和網(wǎng)絡(luò)移動(dòng)性。Java并非是第一個(gè)采用“虛擬機(jī)”概念的體系,但卻是第一個(gè)得到廣泛運(yùn)用的虛擬機(jī)平臺(tái)。 “虛擬”,是一種隔離物理資源與邏輯資源的手段。Java虛擬機(jī)的“虛擬”,則是用來隔離物理機(jī)器、底層操作系統(tǒng)與Java語言規(guī)范實(shí)現(xiàn)的手段。
雖然Java是一種面向?qū)ο蟮恼Z言,我們平時(shí)大量使用的,是對(duì)象間的多態(tài)、組合(Composition)、委派(Delegation),但當(dāng)我們討論虛擬機(jī)的時(shí)候,我們看見的基本概念卻是“棧(Stack)”和“堆(Heap)”。根據(jù)馮諾依曼的“存儲(chǔ)計(jì)算”模型,所有的代碼都保存在代碼空間中,隨著程序計(jì)數(shù)器指針的變化進(jìn)行程序的執(zhí)行、跳轉(zhuǎn)。Java虛擬機(jī)中沒有寄存器的概念,方法調(diào)用是采用“棧”進(jìn)行的,這是一種安全、簡潔的方法。
Java虛擬機(jī)通過類裝載器支持對(duì)類的隔離,這也是Java實(shí)現(xiàn)安全性的基礎(chǔ)。每個(gè)類都具有自己的命名空間,在具有不同安全級(jí)別的沙箱中運(yùn)行,因此不會(huì)產(chǎn)生低安全級(jí)別的代碼來越權(quán)訪問高級(jí)別代碼的機(jī)會(huì)。類裝載器的出現(xiàn)是Java虛擬機(jī)與大部分用C實(shí)現(xiàn)的虛擬機(jī)的顯著不同之處。
Java虛擬機(jī)的另外一個(gè)顯著特點(diǎn)就是實(shí)現(xiàn)了自動(dòng)的垃圾收集。在往常,寫程序的時(shí)候要牢記對(duì)象之間的關(guān)聯(lián),在每個(gè)程序塊中假若申請(qǐng)了對(duì)象空間,就必須在出口釋放掉,方法調(diào)用往往同時(shí)也就是對(duì)象的邊界。而自動(dòng)垃圾收集帶給開發(fā)者的最大好處,就是可以非常方便地從整體上把系統(tǒng)的對(duì)象組織成一張對(duì)象圖,只需往這張圖中添加對(duì)象,維護(hù)對(duì)象之間的關(guān)聯(lián),卻不需要自己做復(fù)雜的清掃工作。正是有了這種思維單純的對(duì)象圖的支持,OR Mapping(關(guān)系數(shù)據(jù)庫與對(duì)象映射)技術(shù)在最近得以大行其道,設(shè)計(jì)模式也更容易被Java群體所接受。
虛擬機(jī)的優(yōu)化
1995年第一代的Java出臺(tái)之時(shí),其虛擬機(jī)執(zhí)行是依靠“字節(jié)碼解釋器(Byte Code Interceptor)”的,也就是說每條指令都由虛擬機(jī)來當(dāng)場(chǎng)解釋執(zhí)行,這造成速度令人抓狂地緩慢。更有甚者有人開始總結(jié)許多的“速度優(yōu)化經(jīng)驗(yàn)”,比如說:“盡量把所有的代碼都放在較大的方法中執(zhí)行”與“少用接口”等等,這完全與Java語言的設(shè)計(jì)目的背道而馳,現(xiàn)在看起來是多么可笑的奇談怪論,當(dāng)時(shí)卻是很多程序員津津樂道的經(jīng)驗(yàn)之談。無他,Java本身執(zhí)行太慢了。Java生命的前十分之三就是如此緩慢地渡過的。
于是,Sun的工程師開始拼命想著提高執(zhí)行速度。JIT靜態(tài)編譯器的出現(xiàn)是在1996年十月,Sun放出了第一個(gè)編譯器。JIT編譯器在每段代碼執(zhí)行前進(jìn)行編譯,編譯的結(jié)果為本地靜態(tài)機(jī)器碼,執(zhí)行速度有了質(zhì)的提高。Symantec公司當(dāng)時(shí)憑借其傲人的JIT編譯器,在整個(gè)Java界受到熱烈的追捧。在其后的1998年,Java 1.2發(fā)布的時(shí)候,附帶了JIT編譯器,從此Java的使用者終于可以拋開上面說的那些奇怪的“速度優(yōu)化經(jīng)驗(yàn)”了。
JIT靜態(tài)編譯器雖然可以解決一些問題,但是性能仍然和C/C++有很大的差距。對(duì)一段程序而言,一名優(yōu)秀的程序員是如何來改進(jìn)運(yùn)行速度的呢?首先,他不會(huì)傻到把所有的代碼都來優(yōu)化,他會(huì)觀察、思考到底哪段代碼對(duì)整體性能影響最大?然后集中精力來優(yōu)化這一段代碼。按照經(jīng)驗(yàn),整個(gè)程序 10%-20%的代碼,會(huì)占據(jù) 80%-90%的運(yùn)行時(shí)間。用這種方法,在同樣的時(shí)間、付出同樣程度的努力后,這名優(yōu)秀的程序員使整個(gè)程序的性能得到了很大程度的優(yōu)化。HotSpot引擎,就是模仿人工的這種方法進(jìn)行優(yōu)化的。在程序運(yùn)行的開始,Java代碼仍然解釋執(zhí)行,但HotSpot引擎開始進(jìn)行采樣(Profiling)。根據(jù)采樣的結(jié)果,決定某段程序是占用較多運(yùn)行時(shí)間的,就認(rèn)為它是“HotSpot”,它也就是目前程序的瓶頸, 引擎開始啟動(dòng)一個(gè)單獨(dú)的線程進(jìn)行優(yōu)化。因?yàn)椴幌笤嫉?JIT編譯器那樣無差別的編譯所有代碼,HotSpot引擎可以集中精力來對(duì)HotSpot代碼進(jìn)行深度優(yōu)化,這樣這部分代碼執(zhí)行起來更加迅捷。之前的靜態(tài)編譯器只能按照預(yù)定的策略進(jìn)行編譯優(yōu)化,而HotSpot引擎的優(yōu)化是基于采樣的結(jié)果的,因此這種方法對(duì)所有的應(yīng)用程序都有效。1999年3月27日,Sun放出了第一個(gè)HotSpot引擎。在隨后的2000年5月的JDK 1.3中,包含了HotSopt引擎,這也使1.3成了一個(gè)具有里程碑意義的發(fā)行版本。到這里,Java的十年生命,已經(jīng)過去了一半。
HotSpot代表的是一種動(dòng)態(tài)編譯的技術(shù)。對(duì)Java這種大量使用委派、組合等面向?qū)ο筇匦缘某绦騺碚f,動(dòng)態(tài)編譯比起靜態(tài)編譯來有顯著的優(yōu)勢(shì)。比如Method Inlining。方法的調(diào)用是一個(gè)很耗時(shí)的操作,假若可以把方法調(diào)用直接內(nèi)嵌到調(diào)用者的代碼中,就可以節(jié)省大量的時(shí)間, 這被稱為“Method Inlining”。因?yàn)樯婕暗筋惖闹剌d,靜態(tài)優(yōu)化很難確切知道哪些屬性、方法被重載,因此很難對(duì)method進(jìn)行合并,只好在方法內(nèi)部進(jìn)行靜態(tài)編譯,假若每個(gè)方法都很小,靜態(tài)優(yōu)化能起到的作用也就比較小。而動(dòng)態(tài)編譯因?yàn)榭梢酝耆S時(shí)掌握類的重載情況,就可以把相關(guān)的方法合并進(jìn)行深度優(yōu)化。現(xiàn)代的Java程序,特別是在設(shè)計(jì)模式教育得到普及之后,大量使用類的繼承、委派,形成了很多短小的方法,動(dòng)態(tài)編譯的優(yōu)勢(shì)就更加明顯。
自從出現(xiàn)了HotSpot之后,整個(gè)Java界為之一振。
最近的五年,就是繼續(xù)優(yōu)化的五年。繼續(xù)進(jìn)行優(yōu)化的方法有幾條路,一是研究新的采樣算法。因?yàn)椴蓸雨P(guān)系到不同的優(yōu)化策略,會(huì)對(duì)整體性能有比較大的影響。二是研究深度優(yōu)化的方法。三是研究垃圾收集的算法。垃圾收集會(huì)帶來程序短暫的停頓,這會(huì)帶來負(fù)面的用戶體驗(yàn)。于是,如何提高垃圾收集的效率,減少延遲,出現(xiàn)了五花八門的算法,比如漸進(jìn)式收集、火車算法等。在多處理器的時(shí)候,如何利用多處理器進(jìn)行并行收集也是研究的一個(gè)熱點(diǎn)。這方面,BEA的JRocket走在了前面。
現(xiàn)實(shí)生活中的虛擬機(jī)
最后,讓我們來盤點(diǎn)一下目前市面上可見的各個(gè)虛擬機(jī)。
首先要提到的,毫無疑問是Sun的虛擬機(jī)。作為大眾心目中的“官方實(shí)現(xiàn)”,Sun擁有最大的用戶群,并且擁有“兼容基準(zhǔn)”的地位,其他虛擬機(jī)都必須要考慮和Sun虛擬機(jī)的兼容性問題。比如 JRocket就會(huì)在某些特殊情況下表現(xiàn)出和Sun不同的特性,可能對(duì)程序運(yùn)行有影響。不過Sun也的確沒有讓廣大用戶失望,雖然在早期性能比不上Symantec,后來在1.2 的時(shí)候性能又被IBM超越,但Sun一直在努力革新,特別是 1.4.2之后,性能有了長足的進(jìn)步。雖然JDK 1.5的虛擬機(jī)在性能上沒有什么提高,但是增強(qiáng)了穩(wěn)定性,據(jù)說修改了8000處bug,真是讓人汗流不止。原來我們?cè)?.4.2下面一直在享受這么多bug啊。
其次是老牌勁旅IBM。IBM的JDK在1.3的時(shí)代創(chuàng)下了最好的性能記錄,從此樹立了高端形象。特別是在其WebSphere產(chǎn)品中得到了很好的評(píng)價(jià)。其JDK也是最早支持64bit的JDK之一。到了現(xiàn)在,IBM JDK在高端仍然是和BEA可以一拼的。
然后是后起之秀,BEA的JRocket。說到BEA突然在JVM領(lǐng)域一夜之間異軍突起,多少讓人有些瞠目,不過它采取的戰(zhàn)略特別簡單:自己沒有,索性花錢買了在此領(lǐng)域深有研究的JRocket,在前面加上BEA的標(biāo)志就可以了。JRocket瞄準(zhǔn)高端服務(wù)器市場(chǎng),在多處理器環(huán)境下有不俗的表現(xiàn)。
除此之外,還有幾個(gè)開放源代碼的JVM值得一提。首先就是大名鼎鼎的JikesRVM。說起其大名,大多數(shù)人都知道Jikes編譯器是 IBM開發(fā)的,效率比同等的javac編譯器高得多,很多開發(fā)者都使用Jikes編譯器來取代javac。而JikesRVM則是IBM開源出來的一整套虛擬機(jī)技術(shù),包含了JIT,GC的完整實(shí)現(xiàn),在其網(wǎng)站上也有眾多的論文,實(shí)在是想要深入研究JVM者的絕佳資源([url]http://jikesrvm.sourceforge.net)[/url]。
Kaffe是一個(gè)老牌的JVM,不過現(xiàn)在已經(jīng)很少聽到了。作者撰寫此文時(shí),[url]www.kaffe.org[/url]網(wǎng)站已經(jīng)沒有響應(yīng),也不知道現(xiàn)在的情況如何了。
GNU則有兩個(gè)計(jì)劃:GCJ和GNU classpath。GNU classpath是一個(gè)底層實(shí)現(xiàn),而GCJ是支持java的預(yù)編譯器。
結(jié)束語
時(shí)光流轉(zhuǎn),轟轟烈烈的Java虛擬機(jī)性能爭(zhēng)論仿佛還在耳邊回響,現(xiàn)在新的爭(zhēng)論卻已經(jīng)是“Java的性能是否已經(jīng)超越C/C++”。Joakim Dahlstedt 是 JRockit 的主要架構(gòu)設(shè)計(jì)師之一,他堅(jiān)持認(rèn)為,Java絕不是一種速度慢,效率低的語言,JVM 是一個(gè)關(guān)鍵的組件,確保了系統(tǒng)的部署與運(yùn)行和開發(fā)一樣快速、輕松。特別是在目前開發(fā)趨勢(shì)是采用大量預(yù)制的框架時(shí),動(dòng)態(tài)編譯有可能比C/C++這樣的靜態(tài)優(yōu)化獲得更好的性能。
J2EE五年: 從起源到目的
文/劉天北
起點(diǎn)
在“J2EE”這個(gè)縮略語被第一次介紹給世人的時(shí)刻,也許沒有幾個(gè)人可以預(yù)料出它在日后的奇特歷程。那是在1999年6月的JavaOne年會(huì)上,時(shí)任Sun公司Java企業(yè)開發(fā)部門主管的Mala Chandra興奮地預(yù)告了Java世界的這位新成員。那些不熟悉背景的聽眾們,揣摩著她演說中出現(xiàn)的一串串全新術(shù)語,表情大概又是驚喜、又是迷惑:一個(gè)完整的“多層企業(yè)開發(fā)架構(gòu)”、以“容器”和“組件”的形式提供服務(wù)、一套“廠商中立的開放技術(shù)規(guī)范”、對(duì)開發(fā)者隱藏了不同平臺(tái)和“中間件”的技術(shù)細(xì)節(jié)、實(shí)現(xiàn)了企業(yè)級(jí)應(yīng)用間的“無縫集成”等等。在今天的開發(fā)者看來,這些似乎都已經(jīng)是老生常談,但在當(dāng)時(shí)的場(chǎng)景下,閃動(dòng)在幻燈片上的每一個(gè)口號(hào),都意味著聽眾們事后又要經(jīng)歷一段困難的學(xué)習(xí)過程。
幸虧Chandra有一副了不起的口才;這位本科念建筑學(xué)的印度裔高層主管,談起軟件架構(gòu)來也有特強(qiáng)的空間想象力。她清晰地說明了設(shè)計(jì)J2EE架構(gòu)的兩個(gè)初衷:首先,對(duì)于廠商,J2EE意味著一套開放標(biāo)準(zhǔn),加入這個(gè)標(biāo)準(zhǔn),他們的產(chǎn)品就可以運(yùn)行在各種不同的操作系統(tǒng)和工作環(huán)境下,成為一個(gè)成熟的企業(yè)運(yùn)算體系中可替換的部件;其次,對(duì)于開發(fā)者,J2EE是一套現(xiàn)成的解決方案,采用這個(gè)方案,企業(yè)應(yīng)用開發(fā)中的很多技術(shù)難題(包括跨平臺(tái)移植、事務(wù)處理、安全性等等)就會(huì)迎刃而解,“信息像一條不間斷的河流,經(jīng)過各種各樣的平臺(tái)和設(shè)備,從企業(yè)應(yīng)用系統(tǒng)的這一端流向那一端”。
要想理解這段話在當(dāng)時(shí)的實(shí)際效應(yīng),我們?nèi)匀灰褧r(shí)間指針撥回1999年。除了預(yù)備迎接千年蟲之外,99年你做了什么?為了回答這個(gè)犀利的問題,我翻出6年前的工作記錄,發(fā)現(xiàn)了自己那時(shí)參與的一個(gè)項(xiàng)目的規(guī)格說明書,它正好能提供一幅“Java企業(yè)開發(fā)”在1999年的標(biāo)準(zhǔn)照。這是一家日本知名IT廠商的企業(yè)信息管理系統(tǒng),運(yùn)行在NetScape 3.0 Gold瀏覽器中的Java Applet界面,通過一個(gè)專用的中間層系統(tǒng)與Oracle 8數(shù)據(jù)庫連接。這個(gè)中間層已經(jīng)相當(dāng)現(xiàn)成、完善,能夠提供遠(yuǎn)程對(duì)象調(diào)用、事務(wù)處理等一系列的底層服務(wù);留給我們的任務(wù)只是完成服務(wù)器端業(yè)務(wù)對(duì)象代碼,以及相應(yīng)的客戶端交互開發(fā)。
除了Applet客戶端有些特別之外,上述系統(tǒng)與今天常見的J2EE架構(gòu)很接近;尤其是業(yè)務(wù)對(duì)象編碼也由home類、PK(主鍵)類、entity類等部分構(gòu)成,很多機(jī)制都與EJB如出一轍——只不過這些類并沒有繼承javax.ejb包的接口,而是采用了專用的API。它與EJB之間的相似不像是偶然的,設(shè)計(jì)者肯定參照了Sun在1997年底推出的EJB 1.0技術(shù)規(guī)范。
換言之,在J2EE誕生伊始的語境中,市面上已經(jīng)存在著很多程度不一的“準(zhǔn)J2EE中間件”了。它們主要用于解決三大類問題:事務(wù)處理、分布式對(duì)象管理和Web請(qǐng)求處理。首先,事務(wù)處理管理器(Transaction Processing Monitor)一直是高端企業(yè)計(jì)算領(lǐng)域的熱門產(chǎn)品,著名的應(yīng)用服務(wù)器廠商BEA,正是通過收購事務(wù)處理軟件Tuxedo進(jìn)入中間件市場(chǎng)的。另一方面,從90年代初開始,越來越多的人把“N層分布式對(duì)象架構(gòu)” 當(dāng)成傳統(tǒng)的客戶端/服務(wù)器架構(gòu)的替代方案。那時(shí)剛剛興起的CORBA技術(shù)是推動(dòng)這一趨勢(shì)的重要力量(比如說,前面提到的那個(gè)由日本廠商自行開發(fā)的專用中間層,就采用了CORBA作為基礎(chǔ)架構(gòu))。最后,Java技術(shù)在Web領(lǐng)域中的應(yīng)用也是當(dāng)時(shí)初露頭角的熱點(diǎn)。1997年6月,Sun在發(fā)布一款“Java Web Server”的同時(shí)第一次公布了Servlet API;沒想到這項(xiàng)技術(shù)副產(chǎn)品(連同1998年問世的JSP)正好迎合了廠商的戰(zhàn)略需要。對(duì)于上面提到的N層架構(gòu)來說,HTTP服務(wù)是一個(gè)非常理想的前端;所以基于Java的Web引擎,也在此時(shí)成了企業(yè)級(jí)Java解決方案的一個(gè)必不可少的部分。
Java、Web、事務(wù)、分布式對(duì)象,這幾股開發(fā)潮流匯合在一處,形成了當(dāng)時(shí)最熱門的產(chǎn)品“應(yīng)用服務(wù)器(Application Server)”或“中間件(Middleware)”。為了給定語“最熱門”作個(gè)注釋,我們可以參照一下BEA公司在1998年收購Web應(yīng)用服務(wù)器廠商Weblogic的成交價(jià):1.92億美元。而這并不是一樁孤立的收購,NetScape和Sun也以相近的價(jià)格買下了另外兩家企業(yè)Kiva和NetDynamics。而這也正是J2EE規(guī)范出臺(tái)的背景:幾乎所有要廠商都推出了、或是正在趕制自己的應(yīng)用服務(wù)器產(chǎn)品,但這個(gè)“應(yīng)用服務(wù)器”究竟應(yīng)該是什么東西,競(jìng)爭(zhēng)者們又各有表述、莫衷一是。
說到這里,我們才梳理出了J2EE技術(shù)規(guī)范的第一個(gè)版本在1999年12月問世的實(shí)際意義。首先,它為Java企業(yè)開發(fā)提供了一幅清晰的全景,各項(xiàng)分支技術(shù)在這個(gè)領(lǐng)域中的地位和作用得到了客觀、準(zhǔn)確的定義。至此大家才對(duì)一個(gè)Java企業(yè)解決方案的構(gòu)成要素有了基本共識(shí)。其次,它使用“容器”和“組件”等概念描繪了Java企業(yè)系統(tǒng)的一般架構(gòu),明確地劃分了中間件廠商和應(yīng)用開發(fā)者的職責(zé)所在。最后(但絕非最不重要地),J2EE通過一套公開標(biāo)準(zhǔn)規(guī)定了應(yīng)用服務(wù)器產(chǎn)品的具體行為,在執(zhí)行此標(biāo)準(zhǔn)的廠商產(chǎn)品之間實(shí)現(xiàn)了一定程度的可替換性和互操作性。當(dāng)時(shí)的媒體用“B2B開發(fā)的默認(rèn)標(biāo)準(zhǔn)”之類的說法歡呼這項(xiàng)里程碑式的成就——那些撰稿人哪里知道,在J2EE與那個(gè)被稱為“B2B” 的短命新貴之間,其實(shí)并不會(huì)有太多故事發(fā)生;同樣,他們也不會(huì)想到,J2EE要想成為一種真正成熟的開發(fā)范式,前方還有一段遠(yuǎn)為艱辛的旅程。
社區(qū)的形成
記得Kruglinski在名著《Inside Visual C++》的某個(gè)版本中給出了一個(gè)Web瀏覽器的代碼例子;在這一節(jié)的開頭他說到:如果你幾年前開發(fā)了一個(gè)Web瀏覽器,那肯定會(huì)給你帶來上千萬的收益;但如果你現(xiàn)在才想到開發(fā)這個(gè)東西——那也就是個(gè)C++語言的練習(xí)罷了。在今天的程序員眼中,應(yīng)用服務(wù)器似乎也成了價(jià)格低廉(如果不是全然免費(fèi))的日用消費(fèi)品。所以,想要理解它們?cè)谀菐啄甑拇笮衅涞溃头堑媒柚鶮ruglinski這樣的智慧不可。在1999年底,市面上可以找到30種以上自稱“Java應(yīng)用服務(wù)器”的產(chǎn)品,可見當(dāng)時(shí)這類軟件是網(wǎng)絡(luò)風(fēng)險(xiǎn)投資的寵兒。但是此時(shí)出臺(tái)的J2EE規(guī)范就像是一陣席卷整個(gè)產(chǎn)業(yè)的勁風(fēng),在一夜之間,所有人都有了判斷什么是一個(gè)“應(yīng)用服務(wù)器”的權(quán)威途徑。
為了獲得一張J2EE競(jìng)技場(chǎng)的入場(chǎng)券,各家廠商面臨兩項(xiàng)考驗(yàn):首先,要具有能夠覆蓋J2EE中所有主要技術(shù)的產(chǎn)品線。這在當(dāng)時(shí)是一項(xiàng)非常苛刻的要求,在沒有開源產(chǎn)品可供參照的情況下,短時(shí)間內(nèi)推出包括EJB容器、Web引擎和JMS中間件的整體解決方案,這決不是隨便哪家創(chuàng)業(yè)公司都能辦到的。完成了若干次成功的并購之后,BEA在這一點(diǎn)上搶占了先機(jī),完整的產(chǎn)品線使它成了人們心目中的首選J2EE平臺(tái)提供商。其次,要讓產(chǎn)品通過Sun的J2EE兼容性測(cè)試。要做到這一點(diǎn)同樣不易:就連IBM的WebSphere也一時(shí)還沒達(dá)到百分之百的EJB支持。到2000年底為止,共有15家廠商能夠提供完整的J2EE解決方案,其中9家(包括Sun本身)實(shí)現(xiàn)了“J2EE兼容”,他們中間包括了日后這個(gè)領(lǐng)域的主要競(jìng)爭(zhēng)者。毫無疑問,這是一次非常殘酷的行業(yè)洗牌,但留在場(chǎng)內(nèi)的廠商也相應(yīng)地形成了推動(dòng)J2EE發(fā)展的主體力量。
上面說過,在它的孵化階段,Sun的J2EE團(tuán)隊(duì)主管是女強(qiáng)人Mala Chandra,她本人雖不是工程師出身,但對(duì)技術(shù)有著很強(qiáng)的感知能力和想象力;J2EE一出臺(tái)就能夠?yàn)槿藗兲峁┮环暾⒅庇^而不失深邃的圖景,此中當(dāng)然有Chandra本人的大量貢獻(xiàn)。在她直接領(lǐng)導(dǎo)下工作的幾位工程師,也都是Sun內(nèi)部非常杰出的人才。無論是制定了JDBC、JMS等規(guī)范的Mark Hapner、JavaMail的設(shè)計(jì)者Bill Shannon,還是EJB的主要設(shè)計(jì)者Vlada Matena,后來都是業(yè)界一言九鼎的技術(shù)領(lǐng)袖。這個(gè)班子的合作時(shí)間并不太長:2000年左右的那個(gè)時(shí)期正是IT界創(chuàng)業(yè)的黃金年月,Chandra很快就和Sun公司Java部門的總裁(也是創(chuàng)造Java的功臣之一)Alan Baratz一起,到一家剛起步的Email中間件公司Zaplet淘金去了;捷克裔的開發(fā)天才Matena也離開Sun開辦了自己的公司。留下的兩個(gè)人Hapner和Shannon先后擔(dān)任了J2EE技術(shù)的首席設(shè)計(jì)師。
多年以后,Hapner回憶起J2EE初創(chuàng)的那個(gè)時(shí)期,深感如今Sun對(duì)Java的左右能力已經(jīng)大不如前:“現(xiàn)在,Java事實(shí)上屬于整個(gè)技術(shù)社區(qū),它的發(fā)展有賴全體參與者的推動(dòng)。”的確,如今Sun已經(jīng)不太可能重演當(dāng)年的開拓性功績,很難再為一個(gè)已經(jīng)成形的領(lǐng)域重繪版圖。但正如上文所說,即使是在1999年,J2EE設(shè)計(jì)者們面對(duì)的也不是一張從未著墨的白紙。他們的設(shè)計(jì)始終要以各大廠商的現(xiàn)有產(chǎn)品為出發(fā)點(diǎn),這也是天才的設(shè)計(jì)師們做出的設(shè)計(jì)卻遠(yuǎn)非完美的原因之一:與從頭設(shè)計(jì)一門全新的編程語言不同,J2EE規(guī)范從一開始就是各方博弈和妥協(xié)的產(chǎn)物。
很容易注意到,J2EE與Java社區(qū)的決策機(jī)制JCP(Java Community Process)是幾乎同步產(chǎn)生的。J2EE下屬的各種技術(shù)規(guī)范,包括1.4版之后的J2EE本身,都作為待決規(guī)范議案(JSR,Java Specification Request)被納入了JCP的議程。這些議案的審議過程很少是一帆風(fēng)順的,幾乎每一個(gè)都要經(jīng)歷18個(gè)月以上的拉鋸戰(zhàn)。在多項(xiàng)技術(shù)規(guī)范的審議過程中,我們都見到了這樣的現(xiàn)象:最初列名審議委員會(huì)的某家主要廠商,沒能等到該規(guī)范通過就已經(jīng)被收購或倒閉了。與微軟在.NET平臺(tái)上的乾剛獨(dú)斷相比,J2EE發(fā)展中的這個(gè)“牛步”特征雖說是審慎和民主的表現(xiàn),但終歸不符合軟件演化應(yīng)有的速度。
J2EE社區(qū)中的另一股重要力量,當(dāng)然是種類極為豐富的開放源代碼項(xiàng)目。2002年以來,在J2EE領(lǐng)域的各個(gè)層面上,幾乎所有主流產(chǎn)品都有來自開源項(xiàng)目的替代方案,在其中很多位置上,開源產(chǎn)品反而是勝過商業(yè)產(chǎn)品的首選。但請(qǐng)別誤解,這里的“開源”并不意味著完全的自動(dòng)自發(fā),J2EE世界中的開源項(xiàng)目也與Linux或PHP世界頗為不同。在很多非常成功的J2EE開源項(xiàng)目背后,我們都能發(fā)現(xiàn)商業(yè)機(jī)構(gòu)的推動(dòng)作用:Apache的Jakarta社區(qū)是IBM扶植的結(jié)果;實(shí)現(xiàn)了開源應(yīng)用服務(wù)器JOnAS的ObjectWeb,則是許多法國IT廠商(包括若干政府部門)合資支持的一個(gè)聯(lián)盟組織……這些有商業(yè)背景的開源項(xiàng)目資金雄厚,人員齊整;更重要的是,從投資者到開發(fā)者,參與這些項(xiàng)目的很多人都體現(xiàn)了軟件工業(yè)中難得的非功利心態(tài),因而最終推出的產(chǎn)品質(zhì)量甚至高于同類型的商業(yè)軟件。在主流廠商之外,它們是支撐J2EE大廈存在的一組基石。
另一方面,不少開發(fā)者也間接地通過自己的開源產(chǎn)品獲得了可觀的盈利。這些人大多以免費(fèi)的開源產(chǎn)品為依托,以收費(fèi)方式提供附加的咨詢、方案實(shí)施以及技術(shù)支持服務(wù)。Marc Fleury,開源應(yīng)用服務(wù)器的JBoss創(chuàng)始人,不無矛盾地把自己倡導(dǎo)的這種商業(yè)模式稱為“職業(yè)開源開發(fā)”。
無論叫它什么,高端產(chǎn)品的開源化/免費(fèi)化運(yùn)動(dòng)注定要在J2EE產(chǎn)業(yè)的發(fā)展過程中制造顯著的后果。“JBoss的行徑惡化了J2EE的商業(yè)環(huán)境,”這是McNealy先生2002年的著名論斷。他的推理過程如下:只有做好商業(yè)推廣,J2EE產(chǎn)品才能最終擊潰邪惡的.NET平臺(tái);但開源服務(wù)器會(huì)降低主流廠商的銷售利潤;銷售利潤越低,用于商業(yè)推廣的預(yù)算就越少;因此,整個(gè)J2EE陣營都將受損于JBoss。
但在狂熱的開源運(yùn)動(dòng)支持者看來,以上論證的大前提就是可疑的。“難道只有會(huì)做廣告的軟件才是好軟件?MySQL有過多少廣告預(yù)算”爭(zhēng)論的雙方都認(rèn)為對(duì)手誤解了軟件商業(yè)模型的實(shí)質(zhì)。究竟誰才掌握了這里的真理呢?也許只有根據(jù)J2EE的未來——也就是它的目標(biāo)和終點(diǎn)(Telos)——才能做出最終的裁決。
技術(shù)的離心力
考察事物的演化,通常有兩種對(duì)立的方法。考古學(xué)家(Archaeologist)探究肇始和起源;目的論者(Teleologist)則揭示目的和終點(diǎn)。對(duì)于前者,“開端(希臘語Arche)”從根本上決定了此后的發(fā)展,參天大樹的繁茂都包含在種子最初的萌芽中;而對(duì)于后者,“目的(Telos)”才是事物的根本和旨?xì)w:誰沒見過樣態(tài)完善的樹,誰也就沒法弄懂種子到底是怎么回事。
在J2EE五年之后,人們只能交替地用這兩種目光審視它的演化歷程。它的起源與它的目的、“它從何處來”與“它往何處去” 的問題緊密地交織在一起,誰拾起了其中的一個(gè),誰也就要連同另一個(gè)一起回答。
今天的J2EE在多大程度上符合它的初衷?回答這個(gè)問題并不涉及對(duì)J2EE技術(shù)成敗的評(píng)判,而只是要考察一下:它是否還運(yùn)行在最初開辟的那個(gè)空間之中。在事務(wù)處理、對(duì)象分布化和Web請(qǐng)求處理這三個(gè)方面中,也許J2EE對(duì)事務(wù)和Web保持了一貫的忠誠。我們記得Fleury喜歡重復(fù)的一個(gè)信條:“He who owns the transactional Web owns the Web(誰掌握了帶事務(wù)處理的Web,誰就掌握了Web)”Web接口是今天大部分J2EE應(yīng)用暴露的唯一接口;而雖然事務(wù)處理的常用方法已經(jīng)有了很大改變(借助AOP機(jī)制,很多非EJB架構(gòu)的系統(tǒng)也自如地實(shí)現(xiàn)了聲明式的事務(wù)處理),但對(duì)事務(wù)的重視當(dāng)然仍將是J2EE開發(fā)中的要素之一。
換言之,在5年的演化中,J2EE發(fā)生的最大變化可能就在于它放棄了對(duì)“分布式對(duì)象模型”的強(qiáng)調(diào)。EJB2.0引入的本地接口使得Web層與EJB層可以運(yùn)行在同一個(gè)Java虛擬機(jī)中,從而使Web容器與EJB容器的物理分離部署變成一種昂貴的冗余;J2EE 1.4以后版本支持的Web Services兼容性,使得客戶端可以通過粗粒度的Web接口調(diào)用遠(yuǎn)程服務(wù)——這兩次變化事實(shí)上都是在論證“分布式對(duì)象架構(gòu)”的無用性。人們發(fā)現(xiàn),同一系統(tǒng)的各個(gè)分層最好采用細(xì)粒度接口調(diào)用,并且運(yùn)行在同一個(gè)進(jìn)程中;之所以劃分不同的層次,與其說是為了實(shí)現(xiàn)物理上的可擴(kuò)展性,不如說是設(shè)計(jì)美學(xué)上的考慮。而對(duì)于異質(zhì)系統(tǒng)之間的調(diào)用,則應(yīng)該盡量選用異步的、粗粒度的服務(wù)接口(所以Web Services成為了非常理想的選擇)。換句話說,傳統(tǒng)上的“分布式對(duì)象架構(gòu)”,現(xiàn)在看來似乎只適合于銀行遠(yuǎn)程支付等要求極為苛刻的應(yīng)用場(chǎng)景,而絕不是所有J2EE應(yīng)用都該考慮的標(biāo)準(zhǔn)方案。
前面描述的離心現(xiàn)象畢竟還遵循了J2EE發(fā)展的內(nèi)在邏輯,說到底,EJB的革新和Web Services的引入更多地是主流廠商倡導(dǎo)的結(jié)果。但在近年來,還有一股更強(qiáng)勁的離心潮流在深刻地影響著J2EE的演進(jìn),它肇始于上文提到的開源軟件運(yùn)動(dòng)。最初它只在Rickard Oberg的動(dòng)態(tài)代理RMI設(shè)計(jì)與JBoss服務(wù)器的微內(nèi)核架構(gòu)中顯露過邪惡的一角,但是兩三年來,經(jīng)過多個(gè)項(xiàng)目、各種技術(shù)雜志/論壇/Blog的折射和放大,它已經(jīng)形成了一個(gè)名為“輕量級(jí)容器架構(gòu)”的完整解決方案,并暴露出完全取代傳統(tǒng)EJB架構(gòu)的終極野心。按照這一運(yùn)動(dòng)信徒們的說法,J2EE的發(fā)展史上只出現(xiàn)過一個(gè)錯(cuò)誤——不幸的是,這個(gè)錯(cuò)誤名叫EJB。與EJB提供的重量級(jí)架構(gòu)不同,借助AOP和IoC機(jī)制,輕量級(jí)容器能夠最大程度地降低代碼對(duì)于專用接口的依賴性,以簡短、輕便、專注、可移植的方式實(shí)現(xiàn)業(yè)務(wù)對(duì)象。從“輕量級(jí)容器架構(gòu)”這個(gè)詞被發(fā)明出來的那一刻起,人們對(duì)J2EE遠(yuǎn)景的考慮就發(fā)生了根本性的分裂:Sun和大部分主流廠商更多地關(guān)注于“Web Services”和“快速開發(fā)工具”這些利潤增長點(diǎn),而一部分離經(jīng)叛道的獨(dú)立專家和開發(fā)者則認(rèn)為,如果不把輕量級(jí)容器納入規(guī)劃,J2EE的發(fā)展藍(lán)圖就注定無足稱道。其實(shí),雙方爭(zhēng)執(zhí)的關(guān)鍵是傳統(tǒng)意義上的“應(yīng)用服務(wù)器”的存亡——如果所有企業(yè)級(jí)服務(wù)都可以通過AOP機(jī)制提供給普通Java對(duì)象,如果管理業(yè)務(wù)對(duì)象生命周期的可以是一個(gè)最微不足道的“微內(nèi)核”,那么深盔重鎧的應(yīng)用服務(wù)器還有什么存在理由?而如果失去了應(yīng)用服務(wù)器的這個(gè)產(chǎn)品類型,那些靠這項(xiàng)銷售起家的廠商又將何以自處?
正是在這里,兩個(gè)陣營之間存在著最深刻的利益分歧;而這場(chǎng)爭(zhēng)執(zhí)的結(jié)局當(dāng)然也將決定J2EE(乃至Java企業(yè)開發(fā))的最終走向。或許兩年之后,我們將從紛爭(zhēng)中勝利者一方的角度重述J2EE的整部歷史——或許兩年之后的J2EE本身也將隨著紛爭(zhēng)的解決而成為歷史。但讓我們換個(gè)樂觀的口吻:問世五年,J2EE的歷史仍在持續(xù)的創(chuàng)生之中;此時(shí)善待這樹種的人,也必在今后的樹蔭下獲得它的祝福。
Java十年有成
——談J2ME的發(fā)展歷史
文/王森
Java本來就是為了嵌入式系統(tǒng)而生
1990年12月,Sun內(nèi)部由James Gosling、Patrick Naughton以及Mike Sheridan成立了一個(gè)叫做Green Team的小組。Green Team小組的主要目標(biāo),是要發(fā)展一種新架構(gòu),而這種架構(gòu)必須能夠在消費(fèi)性電子產(chǎn)品作業(yè)平臺(tái)上運(yùn)行,現(xiàn)在我們普遍認(rèn)識(shí)的PDA、手機(jī)或是信息家電(IA),都是屬于這種架構(gòu)的目標(biāo)平臺(tái)。接著,Green Team在1992年的9月3號(hào),發(fā)表了一款由Java 技術(shù)之父 James Gosling所領(lǐng)軍研發(fā),名叫Star Seven(*7)的機(jī)器,研發(fā)出一部交互式的掌上型家用娛樂裝置,可透過使用動(dòng)畫觸碰式屏幕的使用者接口來控制其它電子設(shè)備。
經(jīng)過了13年的時(shí)間,現(xiàn)在我們檢視J2ME的發(fā)展歷史,我們可以發(fā)現(xiàn),雖然在1999年,Java被切割成J2SE、J2ME、J2EE,所以有了J2ME這個(gè)名詞的出現(xiàn)。但是Java并非1999年開始才開始發(fā)展嵌入式系統(tǒng)上的應(yīng)用。其實(shí),Java本來就是為了嵌入式系統(tǒng)而發(fā)展的一種架構(gòu)。即使目前大家多半將Java的應(yīng)用聚焦于企業(yè)上的J2EE應(yīng)用。但是嚴(yán)格來說,J2ME才是Java真正“回歸本心”的領(lǐng)域。
半路殺出的Personal Java
Personal Java是正規(guī)Java版本的一個(gè)分支,其目的在于能夠讓PDA或高階手機(jī)執(zhí)行Java程序,目前在Windows Mobile或Symbian OS(僅限采用UIQ或Nokia Series 80的行動(dòng)電話)平臺(tái)上都可以開發(fā)Personal Java應(yīng)用程序。
雖然從Java 1.0發(fā)表之后,Java就被廣泛地使用在桌上型應(yīng)用程序以及Applet的開發(fā)上,但是,從Java 1.1開始,Java又回到了它一開始的老路-也就是嵌入式系統(tǒng)方面的應(yīng)用,在當(dāng)時(shí)Sun Microsystems發(fā)表了Embedded Java與Personal Java(也有人簡稱為PJava)這兩項(xiàng)規(guī)格。Personal Java的規(guī)格是從Java 1.1之中所分支出來,因此Personal Java的規(guī)格是根據(jù)Java 1.1的規(guī)格而制定的,但是并非Java 1.1的全部規(guī)格都包含進(jìn)來,所以Personal Java只能算是Java 1.1平臺(tái)的子集合。
Personal Java特別適合用在具有豐富圖形顯示能力的消費(fèi)性電子產(chǎn)品上面,于是我們可以發(fā)現(xiàn)Sun Microsystems網(wǎng)站上對(duì)于Personal Java的參考實(shí)作是建立在Windows Mobile產(chǎn)品(過去叫做Pocket PC)上頭的。
在1999年,一般PDA或手機(jī)的能力,離Personal Java所需要的硬件條件仍有很大的一段差距,因此Personal Java并不是一個(gè)很成功的產(chǎn)品。因此Sun Microsystems在此時(shí)將Java區(qū)分成J2SE、J2EE、J2ME這三塊,希望可以重新塑造整個(gè)架構(gòu),尤其是J2ME,希望Java可以在嵌入式系統(tǒng)的領(lǐng)域有所發(fā)展。
J2ME從何而來?
談到J2ME,大家就會(huì)聯(lián)想到KVM這個(gè)名詞, KVM的設(shè)計(jì)者Antero Taivalsaari,最早在Sun Microsystems參與Spotless Project,這個(gè)項(xiàng)目才是J2ME的最早起源。由于Antero Taivalsaari曾經(jīng)在世界知名電信設(shè)備制造商工作,所以他有了在手機(jī)上開發(fā)JVM的概念,后來得到公司支持,就有了各位所知的KVM(K Virtual Machine)。
最早應(yīng)用KVM的產(chǎn)品,就是一個(gè)可以在Palm OS上執(zhí)行的KJava。KJava并不算是一個(gè)正式產(chǎn)品,只能算是一個(gè)概念測(cè)試產(chǎn)品。開發(fā)人員會(huì)開發(fā)名為Spotlet的應(yīng)用程序,透過工具和KVM的輔助,應(yīng)用程序就可以在PDA上執(zhí)行。雖然KJava早已成為過去式,但是仍有電信廠商使用這個(gè)名詞,作為手機(jī)上Java平臺(tái)的名稱,不過,已經(jīng)不是真正的KJava了。有了KJava的發(fā)展經(jīng)驗(yàn),Sun著手設(shè)計(jì)J2ME的架構(gòu),讓J2ME可以應(yīng)付未來嵌入式系統(tǒng)的發(fā)展。
J2ME整體架構(gòu)
J2ME最基本的規(guī)范制定在JSR-68(Java規(guī)格編號(hào)第68號(hào)),在此規(guī)格里頭定義了J2ME的技術(shù)架構(gòu)。根據(jù)此規(guī)范,J2ME由三種類型的規(guī)范堆棧而成,分別是Configuration、Profile以及Optional Packages。這三種類型的規(guī)范定義由其它的規(guī)范所定義。
在最底層的Configuration規(guī)范,定義了硬件所必須具備的能力,比方說硬件至少具備多少ROM、RAM,CPU的頻率最少應(yīng)該是多少,連接網(wǎng)絡(luò)時(shí)頻寬至少要多快。Configuration規(guī)格之中定義了一組低階的API,這代表Java至少必須提供的低階功能,這組低階的API就是核心類別函數(shù)庫的子集合。
在Configuration之上的規(guī)范稱為Profile。Profile針對(duì)各種不同機(jī)器的特性定義了高階的API,這些高階的API通常都是與其它平臺(tái)不相關(guān)的擴(kuò)充類別函數(shù)庫。這些高階API決定了該種機(jī)器上Java程序的撰寫方法。比方說行動(dòng)通訊裝置(手機(jī)、PDA等)這類型裝置上Java程序的撰寫方式,以及能夠調(diào)用的API,都定義在MIDP(Mobile Information Device Profile)之中。
就算是同類型的裝置,有些功能也不一定具備(有些廠商的機(jī)器可能有,有些廠商的機(jī)器可能沒有,例如手機(jī)上的照相機(jī)、和弦鈴聲等),這些功能就定義在“廠商選擇性實(shí)現(xiàn)套件(Optional Package)”之中,比方說,有的廠商會(huì)提供簡單的數(shù)據(jù)庫管理系統(tǒng)(DBMS)在該裝置上,那么他們就會(huì)實(shí)現(xiàn)JDBC Optional Package。不提供數(shù)據(jù)庫管理系統(tǒng)的廠商就不需要實(shí)現(xiàn)JDBC Optional Package。所以稱作廠商選擇性實(shí)現(xiàn)套件。
所謂的廠商選擇性實(shí)現(xiàn)套件,意思是說,這是一組和其它規(guī)格(或API)沒有任何相依性的類別函數(shù)庫,如果廠商愿意提供這樣的功能給程序設(shè)計(jì)師(通常是因?yàn)橛布哂谐浞值哪芰梢酝瓿梢?guī)格之中所制定的功能),就會(huì)將這組類別函數(shù)庫實(shí)現(xiàn)出來,程序設(shè)計(jì)師也可以利用這些功能開發(fā)出功能更多的應(yīng)用程序。
MIDP工業(yè)標(biāo)準(zhǔn)
雖然J2ME架構(gòu)完整,但是目前的發(fā)展,除了Personal Profile之外,最大的應(yīng)用在于架構(gòu)在CLDC之上的MIDP。目前所有標(biāo)示可以支持Java的手機(jī),所支持的都是MIDP,幾乎所有的無線通訊廠商皆采用MIDP作為其開發(fā)程序的標(biāo)準(zhǔn)。
在MIDP 1.0的時(shí)代,由于規(guī)格上本身的功能不足,使得許多廠商不得不加入自己專屬的API,例如震動(dòng)、背光、聲音等擴(kuò)充功能(例如:Nokia UI API),以彌補(bǔ)MIDP平臺(tái)的不足。
到了MIDP 2.0,增加了許多眾所期盼的功能,但是,即使規(guī)格更清楚了,即使很多新功能都已經(jīng)由JCP制定成標(biāo)準(zhǔn)的Optional Packages,這些問題依然無解。市面上的MIDP平臺(tái)仍然處于混亂狀態(tài)。開發(fā)者必須在執(zhí)行時(shí)期偵測(cè)各種專屬API和Optional Package的存在,這會(huì)增加多余的程序代碼。平臺(tái)的混亂會(huì)造成在某個(gè)裝置上可以順利安裝及執(zhí)行,而到了其它裝置時(shí),有可能無法執(zhí)行,甚至有可能連安裝都有問題,所以開發(fā)者通常要開發(fā)好幾種版本的MIDP應(yīng)用程序供各種廠牌、各種型號(hào)的裝置使用。
為了解決上述問題,進(jìn)一步提高M(jìn)IDP應(yīng)用程序的可移植性,Sun Microsystems以MIDP 2.0規(guī)格為核心,設(shè)計(jì)了JTWI規(guī)格。未來的無線通訊平臺(tái),將不會(huì)只有符合MIDP 2.0規(guī)格,而是必須要符合JTWI規(guī)格。這將是J2ME軟件在可移植性上的一大突破。JTWI(Java Technology for Wireless Industry)是一個(gè)統(tǒng)合性的規(guī)格,其目的是為了確保MIDP軟件的可移植性。所以JTWI規(guī)格除了規(guī)范無線通訊平臺(tái)(特別是手機(jī))所必須支持的J2ME標(biāo)準(zhǔn)之外,也對(duì)既有規(guī)格中模糊不清的地方與以加強(qiáng)。所以新款的手機(jī)為了加強(qiáng)移植性,都會(huì)支持JTWI標(biāo)準(zhǔn)。JTWI只是一個(gè)統(tǒng)合性的規(guī)范,并沒有制定任何新功能,目的只是要統(tǒng)一當(dāng)前平臺(tái)混亂的現(xiàn)象,讓J2ME應(yīng)用程序更具可移植性。JTWI主要分成幾個(gè)部分:
1 .規(guī)定平臺(tái)必須支持的API。
2 .統(tǒng)一的應(yīng)用程序執(zhí)行環(huán)境。
3 .既有規(guī)格的理清與加強(qiáng)。
在規(guī)定平臺(tái)必須支持的API的部分,JTWI規(guī)定至少必須支持CLDC 1.0、MIDP 2.0以及WMA 1.1:
所以,只要廠商宣稱支持JTWI平臺(tái),那么代表一定支持CLDC 1.0、MIDP 2.0以及WMA 1.1規(guī)格之中的所有功能。另外,廠商可以根據(jù)裝置本身的能力,將CLDC 1.0提升成CLDC 1.1,可以加入MMAPI 1.1。因此實(shí)際上JTWI平臺(tái)會(huì)有一下幾種組合方式:
其中,CLDC 1.1 + MIDP 2.0 + WMA 1.1 + MMAPI 1.1是最完整、功能最強(qiáng)平臺(tái)。
在統(tǒng)一應(yīng)用程序執(zhí)行環(huán)境方面,過去讓J2ME應(yīng)用程序開發(fā)者最為頭大的問題有以下幾項(xiàng):
● 應(yīng)用程序的大小可以多大?
● 執(zhí)行時(shí)期的內(nèi)存有多少可以使用?
● 有多少內(nèi)存空間可以作為永久儲(chǔ)存之用?
由于規(guī)范中對(duì)于J2ME應(yīng)用程序本身的大小和執(zhí)行環(huán)境沒有很詳細(xì)地規(guī)范,使得每家廠商都有自己的規(guī)范,比方說Nokia限制應(yīng)用程序最大只能30 KB,Motorola則可以支持50 KB以上的應(yīng)用程序。這些規(guī)范都嚴(yán)重地困擾著開發(fā)人員。這些問題在JTWI之中都獲得改善。
JTWI定義了應(yīng)用程序的標(biāo)準(zhǔn)大小(Standard-size Application)。JTWI規(guī)定,可以執(zhí)行J2ME應(yīng)用程序的行動(dòng)通訊裝置,至少可以容許大小為64 KB以上的程序主體(JAR文件)、5 KB以上的應(yīng)用程序描述文件(JAD文件)、以及30 KB以上的永續(xù)儲(chǔ)存空間、執(zhí)行時(shí)期的內(nèi)存(Heap Memory)為256 KB。上述大小只是底線,廠商可以視裝置的實(shí)際能力支持更大的內(nèi)存空間。標(biāo)準(zhǔn)應(yīng)用程序大小(Standard-size Application)將成為一個(gè)計(jì)算用的單位,舉例來說,廠商會(huì)說這個(gè)裝置可以安裝20個(gè)標(biāo)準(zhǔn)應(yīng)用程序,開發(fā)者所撰寫的程序可以說這個(gè)程序需要占掉3個(gè)標(biāo)準(zhǔn)應(yīng)用程序的空間。
至于對(duì)既有規(guī)格的理清與加強(qiáng)的部分,我們將在往后章節(jié)一一說明。最重要的一點(diǎn)是,JTWI規(guī)定,該裝置所支持的任何媒體格式(例如圖片、聲音、影像等)都應(yīng)該能夠使用HTTP 1.1獲取,也就是說,存取這些媒體時(shí)所使用的URL都必須能夠接受http作為存取的通訊協(xié)議。
Java開發(fā)環(huán)境的
過去、現(xiàn)在和將來
文/EclipseCN
1995年3月23日,San Jose Mercury News登出一篇題為“Why Sun thinks Hot Java will give you a lift”的文章,在那篇文章里預(yù)言Java技術(shù)將是下一個(gè)重大事件,這個(gè)預(yù)言現(xiàn)在看來并不僅僅是商家的宣傳伎倆,雖然文章是當(dāng)時(shí)Sun的公關(guān)經(jīng)理 Lisa Poulson安排撰寫的。從世人知道Java那一刻起到現(xiàn)在,算起來已經(jīng)過去整整十年,回顧過去的十年值得總結(jié)的東西有許多,但在這里筆者只想就Java 開發(fā)環(huán)境談些個(gè)人的想法與朋友們交流一下。
現(xiàn)在的軟件開發(fā)人員在整個(gè)軟件的開發(fā)生命周期里,也許會(huì)根據(jù)需要使用各式各樣的開發(fā)工具來完成相對(duì)復(fù)雜的開發(fā)任務(wù),而在幾十年以前,人們還只是使用文本編輯器、編譯器和Debugger進(jìn)行開發(fā),對(duì)于這個(gè)階段的開發(fā)環(huán)境人們稱之為CLEs(Command Line Environments)。 而當(dāng)人們發(fā)現(xiàn)如果將那些單獨(dú)分開的開發(fā)工具集成起來就可以有效的提高開發(fā)效率時(shí),IDEs(Integrated Development Environments)就出現(xiàn)了。Java的出現(xiàn)盡管只有十年,但其開發(fā)環(huán)境也大至經(jīng)歷了從CLEs到IDEs再到XDEs這三個(gè)階段,現(xiàn)在即將進(jìn)入CDEs階段。在上述Java開發(fā)環(huán)境發(fā)展過程中,有許多值得我們大家關(guān)注的地方。
Java開發(fā)環(huán)境的歷史回顧
縱觀過去十年Java開發(fā)環(huán)境的發(fā)展,大致可以粗略的劃分為如下幾個(gè)階段:
●??1995,命令行開發(fā)環(huán)境CLEs
●??1996-2000,集成開發(fā)環(huán)境IDEs
●??2001-2004,擴(kuò)展開發(fā)環(huán)境XDEs
●??2005至今,協(xié)同開發(fā)環(huán)境CDEs
1995年,不平凡的一年,這一年Java 獲得了成功。可令人尷尬的是在1995年并沒有一個(gè)令人滿意的Java開發(fā)環(huán)境,開發(fā)人員在進(jìn)行Java編程時(shí),大多使用文本編輯器編輯源程序,然后再使用命令行的方式進(jìn)行編譯處理。那時(shí)的Java開發(fā)環(huán)境還處于CLEs時(shí)代,開發(fā)效率非常低,這預(yù)示著在Java開發(fā)工具上會(huì)有一番激烈的競(jìng)爭(zhēng)。
有人稱1996年為互聯(lián)網(wǎng)年,有人卻稱之為Java年,還有人稱之為Web開發(fā)年,但不論如何稱呼1996年,它都反映了一個(gè)事實(shí):Bill Joy將Java與互聯(lián)網(wǎng)相結(jié)合的策略取得了成功。這一年的9月Sun推出了其Java開發(fā)環(huán)境-Java WorkShop,這是一款基于瀏覽器的Java開發(fā)工具,但由于當(dāng)時(shí) Java在許多方面還不成熟,所以實(shí)際上Java WorkShop并不成功,同年發(fā)布的Symantec Visual Cafe由于還是采用C/C++語言進(jìn)行開發(fā),所以性能與成熟度上就比WorkShop好得多。提到Visual Cafe就不能不提Eugene Wang,因?yàn)镋ugene Wang常常是與計(jì)算機(jī)間諜這個(gè)詞同時(shí)出現(xiàn)的人物,有人甚至講當(dāng)時(shí)Symantec的老板Gordon Eubanks與Eugene Wang簽約時(shí),也同時(shí)簽下了監(jiān)獄里的一個(gè)單元。Visual Cafe就是由Eugene Wang進(jìn)行主要策劃的,它是在同一年發(fā)布的Java開發(fā)環(huán)境中,唯一解決了與數(shù)據(jù)庫連接問題的開發(fā)環(huán)境,帶有一套可以與數(shù)據(jù)庫相連接的組件,無需太多編程使用拖拽的方式就可完成大部分工作,這一優(yōu)點(diǎn)使得Visual Cafe受到了Java開發(fā)人員的歡迎。這一年IBM收購了OTI公司,從而得到了Dave Thomas的弟子John Duimovich、Dave Thomson、Mike Wilson等一大批軟件精英,這之中還包括“生活在技術(shù)刀鋒上的開發(fā)者”Brian Barry。
1997年,由于微軟壟斷案,使得微軟在Java開發(fā)環(huán)境上的努力受到了限制,Visual Cafe由于界面直觀易用,可以很容易地連接各種數(shù)據(jù)源等功能再次受到開發(fā)人員的歡迎。這一年IBM發(fā)布VisualAge for Java。VisualAge for Java是面向代碼庫的開發(fā)環(huán)境,它提供代碼庫和項(xiàng)目管理以便于開發(fā)團(tuán)隊(duì)在 C/S環(huán)境下進(jìn)行項(xiàng)目開發(fā)。但由于大多數(shù)Java開發(fā)人員比較熟悉面向文件的開發(fā)環(huán)境,還不太習(xí)慣面向代碼庫的開發(fā),再加上VisalAge for Java對(duì)系統(tǒng)資源的要求比較高等因素,使得VisualAge for Java一開始未被Java開發(fā)人員所認(rèn)可。
1998年至2000年比較成功的Java開發(fā)環(huán)境是JBuilder,這是由于Borland較好的把握住 J2SE、J2EE和J2ME發(fā)布后,Java技術(shù)升級(jí)的時(shí)機(jī),全面支持Java1.1和Java1.2開發(fā)平臺(tái),它還提供了多種工具方便用戶從舊的平臺(tái)遷移到新的Java平臺(tái)。JBuilder本身80%是基于JDK1.2進(jìn)行開發(fā)的,它支持JavaBeans, Enterprise JavaBeans, JDBC等方面的應(yīng)用開發(fā),可以連接多種關(guān)系數(shù)據(jù)庫。為支持分布式應(yīng)用開發(fā),JBuilder還集成了 VisiBroker ORB、JSP server、數(shù)據(jù)庫和EJB AppServer,并提供Open Tools API便于第三方工具集成。上述種種的優(yōu)點(diǎn)使得JBuilder一舉超越Visual Cafe,成為當(dāng)時(shí)最受歡迎的Java開發(fā)環(huán)境。在眾多Java開發(fā)環(huán)境中,1999年IBM發(fā)布的VisualAge for Java Micro Edition是比較有特色的開發(fā)環(huán)境,它是由Erich Gamma和與Erich Gamma有“焦不離孟、孟不離焦”之稱的John Wiegand共同進(jìn)行設(shè)計(jì)的,采用了Java 擴(kuò)展機(jī)制,并集成了JUnit測(cè)試框架,其當(dāng)時(shí)所采用的架構(gòu)深深地影響了后來Eclipse1.0所采用的架構(gòu)。同時(shí),通過VisualAge for Java Micro Edition的開發(fā),那些來自“未來世界”(Smalltalk們總認(rèn)為他們來自計(jì)算機(jī)的未來世界)的軟件精英們,全面徹底地對(duì)Java技術(shù)進(jìn)行了評(píng)估,得出了許多結(jié)論性的東西,這之中包括現(xiàn)在鬧得沸沸揚(yáng)揚(yáng)的Swing和SWT對(duì)比。此外,Sun將其收購的NetBeans變成了開源的Java IDE也是一件不大不小的事情。
縱觀1996年至2000年這五年時(shí)間里,隨著Java及其相關(guān)開發(fā)應(yīng)用的發(fā)展,Java開發(fā)環(huán)境也不斷的完善,從CLEs進(jìn)入到IDEs階段。為了提高Java開發(fā)人員的開發(fā)效率,Java開發(fā)環(huán)境主要從兩個(gè)方面進(jìn)行改進(jìn)與提高。一方面是提高集成在Java IDEs當(dāng)中開發(fā)工具的性能和易用性,另一方面是將Java開發(fā)環(huán)境盡可能的覆蓋到整個(gè)軟件的開發(fā)生命周期。隨著基于WEB,采用N-層結(jié)構(gòu)的應(yīng)用開發(fā)成為Java開發(fā)人員主要從事的開發(fā)任務(wù),Java開發(fā)環(huán)境需要支持越來越多的技術(shù),比如:XML、JSP、EJB和CORBA等,這就造成了Java IDEs的規(guī)模變得越來越大,許多Java開發(fā)環(huán)境都集成了數(shù)據(jù)庫、JSP Server和AppServer,軟件的研究人員將上述IDEs不斷膨脹的現(xiàn)象稱為“IDEs大爆炸”。
“IDEs大爆炸”現(xiàn)象發(fā)生以后,有關(guān)Java開發(fā)環(huán)境是走少而精的發(fā)展方向,還是走大而全的發(fā)展方向就成了廣大Java開發(fā)人員關(guān)注的問題。2001年Java開發(fā)人員達(dá)到了200萬,成為每個(gè)軟件供應(yīng)商都無法忽視的力量,這一年JetBrains推出了Java開發(fā)環(huán)境少而精的代表: IntelliJ IDEA。 IntelliJ IDEA明確的表示只做最好的Java代碼編輯器,不做什么文件都可以編寫的編輯器。它關(guān)注Java開發(fā)人員的工作實(shí)際并將這些工作進(jìn)行了優(yōu)化。由于減掉了一些可有可無的工具,所以價(jià)格上相對(duì)合理公道。當(dāng)年IntelliJ IDEA擊敗JBuilder成為最受Java開發(fā)人員歡迎的Java開發(fā)環(huán)境,不過2002年隨著JBuilder將大而全的功力再提升一步,將UML建模工具、JUnit測(cè)試框架以及Apache Struts等開發(fā)工具集成進(jìn)來,大而全的發(fā)展方向又一次受到Java開發(fā)人員追捧。最全還是最好似乎使Java開發(fā)人員在選擇Java開發(fā)環(huán)境時(shí)處于兩難狀況,但實(shí)際上當(dāng)Eclipse 1.0發(fā)布時(shí),這個(gè)問題已經(jīng)得到了初步的解決,最好和最全是可以兼顧的。
Eclipse的出現(xiàn)不是從天上掉下來的,也不是某個(gè)天才拍腦袋想出來的,它是一群軟件精英們集體智慧的結(jié)果。早在1998年IBM就打算開發(fā)新一代的工具平臺(tái)以便將它現(xiàn)有的各種開發(fā)工具統(tǒng)一起來,并減少開發(fā)各種工具時(shí)重復(fù)的勞動(dòng),同時(shí)希望在新的平臺(tái)上建立新的Java開發(fā)環(huán)境。經(jīng)過一段時(shí)間的準(zhǔn)備, IBM開始建立起一個(gè)開發(fā)團(tuán)隊(duì),人員構(gòu)成主要來自VisualAge for Java Micro Edition和VisualAge for Java兩個(gè)項(xiàng)目的開發(fā)人員,選擇的標(biāo)準(zhǔn)是過去10年至少開發(fā)過5到6個(gè)IDE。此外,IBM還聯(lián)合了9家公司共同成立了一個(gè)開源組織Eclipse基金會(huì),將Eclipse提供給開發(fā)人員使用,并在開源社區(qū)的幫助下進(jìn)一步完善Eclipse本身。Eclipse在最初設(shè)計(jì)時(shí),插件模型是靜態(tài)的,不能實(shí)現(xiàn)插件的即插即用功能,即便是大受歡迎的Eclipse 2.1也還是靜態(tài)的。所以到2004年發(fā)布Eclipse 3.0時(shí),Eclipse進(jìn)行了重大改進(jìn),采用OSGi的插件模型,初步實(shí)現(xiàn)了插件的即插即用功能,至此一個(gè)完美的、可擴(kuò)展的開發(fā)環(huán)境展現(xiàn)在Java開發(fā)者面前,這時(shí)Java開發(fā)人員已經(jīng)達(dá)到300萬。
Java開發(fā)環(huán)境的現(xiàn)狀
2004年Eclipse 3.0的發(fā)布極大刺激了Eclipse用戶的增長,經(jīng)過一年以后,Java開發(fā)人員現(xiàn)在使用Java開發(fā)環(huán)境的狀況是如何的呢?看了下面的表格里的數(shù)據(jù)也許可以了解一個(gè)大致的狀況。
首先需要指明的是上述的數(shù)據(jù)并不是當(dāng)前Java用戶使用Java開發(fā)環(huán)境的準(zhǔn)確反映,但我們可以從中了解一個(gè)大致的狀況。現(xiàn)在的Java環(huán)境可以分為三個(gè)集團(tuán),第一集團(tuán)是Eclispe它大約占據(jù)1/3的份額,第二集團(tuán)是 IntelliJ IDEA、NetBeans 和JBuilder占據(jù)另外1/3的份額,相互之間旗鼓相當(dāng),第三集團(tuán)是以JDeveloper和WSAD為代表的十幾種Java開發(fā)環(huán)境占據(jù)剩下的 1/3份額,但每種開發(fā)環(huán)境占總份額的比重不超過5%。我們考察Eclipse、intelliJ IDEA、NetBeans 和JBuilder這些主流開發(fā)環(huán)境,可以發(fā)覺它們有一個(gè)共同的特點(diǎn)那就是可擴(kuò)展,盡管在實(shí)現(xiàn)手段上各有不同。這就是為什么稱現(xiàn)在的Java開發(fā)環(huán)境為XDEs(eXtended Development Environments)的原因,IDEs已經(jīng)死亡了4年,專業(yè)的開發(fā)人員需要了解這個(gè)事實(shí),因?yàn)閄DEs也快死了。
由于市場(chǎng)的壓力,一個(gè)軟件企業(yè)不僅要提高開發(fā)人員個(gè)體的工作效率,還要提高整個(gè)開發(fā)團(tuán)隊(duì)以及整個(gè)企業(yè)的開發(fā)效率,但在現(xiàn)有的Java開發(fā)環(huán)境XDEs下無法完全做到這些,所以新一代開發(fā)環(huán)境CDEs (Collaborative Development Environments)就產(chǎn)生。Grady Booch和Alan W. Brown的研究表明一個(gè)程序員一天工作時(shí)間的分配是這樣的:分析占16%(從5%到40%不等), 設(shè)計(jì)占14%(從1%到40%不等),編程占16%(從0%到60%不等),測(cè)試占10%,打電話占3%,閱讀占7%(電子郵件,文檔,月刊和雜志),參加開發(fā)會(huì)議占10%,無關(guān)的會(huì)議占7% 。從這些數(shù)據(jù)可以發(fā)現(xiàn),開發(fā)人員用于交流的時(shí)間約占工作時(shí)間的1/3,開發(fā)人員的相互交流非常重要。可是現(xiàn)有的主流Java開發(fā)環(huán)境一般僅將分析、設(shè)計(jì)、編程和測(cè)試等工具集成進(jìn)來,卻未包括用于交流的工具,這顯然不合理。因此,所謂CDEs就是將用于人與人、人與團(tuán)隊(duì)以及團(tuán)對(duì)于團(tuán)隊(duì)進(jìn)行交流的工具集成進(jìn)來的開發(fā)環(huán)境,比如,CDEs常具有發(fā)送電子郵件、進(jìn)行及時(shí)通訊和屏幕分享等功能,通過實(shí)現(xiàn)無損耗過程的交流提高開發(fā)團(tuán)隊(duì)的開發(fā)效率。
現(xiàn)在已經(jīng)商業(yè)化的CDEs是CodeBeamer Collaborative Development Platform和CodePro AnalytiX,上述兩款軟件都提供Eclipse的插件,可以與Eclipse集成在一起,使Eclipse升級(jí)成為一個(gè)CDEs。大家肯定知道Borland已經(jīng)宣布開發(fā)基于Eclipse的新版JBuilder-“Peloton”,Peloton就是一個(gè)CDEs(Collaborative Development Environments),當(dāng)它明年上半年發(fā)布時(shí),就意味著Java開發(fā)環(huán)境進(jìn)入CDEs時(shí)代,現(xiàn)在Java開發(fā)環(huán)境還處于XDEs與CDEs交替的階段。
Java開發(fā)環(huán)境的未來
在可以看得見的將來,Java的開發(fā)環(huán)境還會(huì)是以CDEs的形式存在。開源組織或開發(fā)工具供應(yīng)商將會(huì)努力為軟件的開發(fā)創(chuàng)建一個(gè)絕對(duì)光滑的平面 (Frictionless Surface),實(shí)現(xiàn)無損耗的開發(fā)過程,以提高開發(fā)效率。為了實(shí)現(xiàn)無損耗的開發(fā)過程,Java的開發(fā)環(huán)境將會(huì)關(guān)注以下幾個(gè)方面:
●??起步階段方面
●??協(xié)作開發(fā)方面
●??維護(hù)開發(fā)團(tuán)隊(duì)有效溝通方面
●??多個(gè)任務(wù)的時(shí)間協(xié)調(diào)方面
●??相互協(xié)商方面
●??資料有效性方面
但這里必須承認(rèn)未來Java開發(fā)環(huán)境是如何具體去實(shí)現(xiàn)無損耗的開發(fā),還需要時(shí)間給與答案,因?yàn)楝F(xiàn)在所能采用的方法未必是最好的,比如,使用面向文件的 CVS進(jìn)行協(xié)同開發(fā)就有需要改進(jìn)的地方。
總結(jié)
羅里羅唆一大堆,歸納起來不過就是:一個(gè)目的、三種手段以及一條規(guī)律。
一個(gè)目的:十年Java開發(fā)環(huán)境的演變,其目的就是為了提高開發(fā)效率。
三種手段:
●??提高集成在Java開發(fā)環(huán)境中開發(fā)工具的性能和易用性
●??將Java開發(fā)環(huán)境盡可能的覆蓋到整個(gè)軟件的開發(fā)生命周期
●??集成人與人、人與團(tuán)隊(duì)以及團(tuán)對(duì)于團(tuán)隊(duì)進(jìn)行交流的工具
一條規(guī)律:軟件開發(fā)環(huán)境的發(fā)展過程是從CLEs到IDEs再到XDEs最后進(jìn)入CDEs,這是由Grady Booch總結(jié)出來的,套在Java開發(fā)環(huán)境上也適用。
參考文獻(xiàn)
◇ Grady Booch and Alan W. Brown, "Collaborative Development Environments",??Advances in Computers 59, Aug. 2003.
◇ Li-Te Cheng,Cleidson R. B. de Souza,Susanne Hupfer,John Patterson, Steven Ross, "Building Collaboration into IDEs", ACM Queue vol. 1, no. 9 - December/January 2003-2004
◇ J. des Rivie` res,J. Wiegand, "Eclipse: A platform for integrating development tools", IBM System Journal,Volume 43, Number 2, 2004
◇ The Java Extension Mechanism.
◇ Grady Booch, "History of Development Environments", January 29, 20
J2SE發(fā)展演變史
文/Matirx Java社區(qū) 楊洪波 王志舜
J2SE:懷胎
Java的歷史可以追溯到1991年4月,Sun公司的James Gosling領(lǐng)導(dǎo)的綠色計(jì)劃(Green Project)開始著力發(fā)展一種分布式系統(tǒng)結(jié)構(gòu),使其能夠在各種消費(fèi)性電子產(chǎn)品上運(yùn)行,他們使用了C/C++/Oak語言。由于多種原因,綠色計(jì)劃逐漸陷于停滯狀態(tài)。
直至 1994年下半年,由于Internet的迅猛發(fā)展和環(huán)球信息網(wǎng)的快速增長,第一個(gè)全球信息網(wǎng)絡(luò)瀏覽器Mosaic誕生了;此時(shí),工業(yè)界對(duì)適合在網(wǎng)絡(luò)異構(gòu)環(huán)境下使用的語言有一種非常急迫的需求;Games Gosling決定改變綠色計(jì)劃的發(fā)展方向,他們對(duì)Oak進(jìn)行了小規(guī)模的改造,就這樣,Java在1995年的3月23日誕生了!Java的誕生標(biāo)志著互聯(lián)網(wǎng)時(shí)代的開始,它能夠被應(yīng)用在全球信息網(wǎng)絡(luò)的平臺(tái)上編寫互動(dòng)性及強(qiáng)的Applet程序,而1995年的Applet無疑能給人們無窮的視覺和腦力震蕩。
但沒有相應(yīng)的開發(fā)庫而只靠Java語言來進(jìn)行開發(fā)肯定是困難重重,所以Sun公司在1996年的1月23日發(fā)布了JDK 1.0來幫助開發(fā)人員的開發(fā)。JDK包括兩大部分:運(yùn)行環(huán)境和開發(fā)工具。緊跟著,Sun公司在1997年2月18日發(fā)布了JDK 1.1。JDK1.1相對(duì)于舊版本最大的改進(jìn),是推出了JIT(Just-In-Time)編譯器,另外一個(gè)改進(jìn)是AWT 1.1。
在JDK 1.1時(shí)代,Java平臺(tái)分為PersonalJava與EmbeddedJava,前者比較適用于運(yùn)算資源和內(nèi)存豐富的設(shè)備,而資源有限者適用于后者。這樣的分類明顯不符合時(shí)代發(fā)展的潮流,所以,Java平臺(tái)處處蘊(yùn)藏著新的翻天覆地的革命……
J2SE1.2:誕生
JDK 1.2在1998年12月4日的隆重發(fā)布,標(biāo)志著Java2平臺(tái)的誕生。Java 2的J2SE 1.2時(shí)代是一個(gè)大變革時(shí)代,它進(jìn)行了如下的三大革命:
● 市場(chǎng)推廣革命
Sun公司在Java 1.2版以后將JDK 1.2改名為J2SDK,將Java改名為Java 2。在1999年Sun公司還將Java 2平臺(tái)分為三大塊:J2SE,J2EE,J2ME。這次市場(chǎng)推廣革命順應(yīng)了網(wǎng)絡(luò)急速發(fā)展的潮流,對(duì)Java 2平臺(tái)的發(fā)展起到了很好的催化劑的作用。
● API供應(yīng)標(biāo)準(zhǔn)革命
而隨著供應(yīng)商的不同,Java的API分為三大類:
Java Core API:由Sun公司制定的基本的API,所有的Java平臺(tái)都應(yīng)該提供。
Java Optional API:由Sun公司制定的擴(kuò)充API,Java平臺(tái)可以有選擇地提供。
特殊API:由特殊廠商或者組織提供的API。
● API制定過程的革命
如果你有需求不能通過遵循標(biāo)準(zhǔn)的API來實(shí)現(xiàn),可以向JCP提出制定新的API的請(qǐng)求,經(jīng)過審核,你的請(qǐng)求可能被通過或者駁回;如果是被通過,則開始進(jìn)入制定該API的程序。
J2SE 1.2時(shí)代進(jìn)行的這些革命形成的制度一直沿用到現(xiàn)在,對(duì)Java技術(shù)的發(fā)展形成了深遠(yuǎn)的影響。
除了上述的三大革命,Java 2還支持并新增了許多新特性,最受追捧的當(dāng)屬Swing庫。Swing是輕量級(jí)的API,它不但有各式各樣先進(jìn)的組件,而且連組件風(fēng)格都可抽換。Swing出現(xiàn)之后,大家很快地就不太使用AWT了。Java 2還廢棄了一些API,最重要的莫過于Thread類中對(duì)suspend(),resume()和stop()等方法的廢棄。由于JDK 1.1的集合類庫中的Vector類和HashTable類都考慮了同步,在平常的使用中影響效率,所以Java 2專門添加了對(duì)應(yīng)的非同步類,并完善了集合類庫。
J2SE1.3:拓廣
Java 2平臺(tái)推出后,得到了市場(chǎng)的強(qiáng)烈反響,所以,在2000年5月8日推出的J2SE 1.3對(duì)J2SE 1.2的改進(jìn),主要是對(duì)各種已有API的加強(qiáng)和對(duì)新API的拓展。
數(shù)字運(yùn)算:加入了java.lang.StrictMath,方便我們的一般的數(shù)字運(yùn)算。
新的Timer API:相信大家對(duì)其中的java.util.Timer和java.util.TimerTask一定不陌生。
Collections包:加入了一些新的API,方便我們的使用。
虛擬機(jī)停止鉤子:J2SE 1.3還加入了一個(gè)強(qiáng)大的功能,那就是虛擬機(jī)停止鉤子(Virtual Machine Shutdown Hooks),這個(gè)功能使得我們能夠在虛擬機(jī)停止時(shí)完成我們自己的操作,比如關(guān)閉網(wǎng)絡(luò)連接或者保存會(huì)話狀態(tài)或者清除臨時(shí)文件等等。
DNS服務(wù):在JNDI接口方面,加入了一個(gè)DNS服務(wù)的實(shí)現(xiàn)。
Jini實(shí)現(xiàn):J2SE 1.3包含了一個(gè)Jini實(shí)現(xiàn),這使得我們可以方便地把諸如打印機(jī)、攝像機(jī)和磁盤驅(qū)動(dòng)設(shè)備插入現(xiàn)有網(wǎng)絡(luò)中,并且能自動(dòng)搜索已在網(wǎng)上的設(shè)備可以提供的服務(wù)并享用這些服務(wù)。
XML支持:由于計(jì)算機(jī)網(wǎng)絡(luò)和XML技術(shù)的快速發(fā)展, J2SE 1.3在Optional API中引入了Java API for XML包。
HotSpot虛擬機(jī):J2SE 1.3引入了HotSpot虛擬機(jī)。在Solaris版的JDK 1.3中,已經(jīng)不支持傳統(tǒng)的虛擬機(jī),而Windows版的JDK 1.3同時(shí)支持傳統(tǒng)虛擬機(jī)和HotSpot虛擬機(jī)。
從上面的分析可以看出,J2SE 1.3主要是對(duì)J2SE 1.2查漏補(bǔ)缺和拓展新的API。從應(yīng)用領(lǐng)域方面考慮,J2SE 1.3已經(jīng)涵蓋了數(shù)據(jù)庫、WEB、多媒體、網(wǎng)絡(luò)、電話、影像、加解密、圖形等等大部分的信息技術(shù)領(lǐng)域。
在這個(gè)時(shí)期Java 2還有一個(gè)重要活動(dòng)就是推出SCSL(Sun社區(qū)源代碼許可)許可協(xié)議。Sun公司開放源代碼項(xiàng)目的“女1號(hào)”Danese Cooper在1999年加入公司,負(fù)責(zé)Sun(包括Java)和開放源代碼社區(qū)之間的協(xié)調(diào)工作。Sun一直盡可能在贏利和開放源代碼之間尋求更好的平衡。
Java的大行其道引起了Microsoft的警惕并直接導(dǎo)致了.Net的產(chǎn)生,這同時(shí)也宣布了Java作為獨(dú)一無二的Internet平臺(tái)地位的結(jié)束。這兩個(gè)對(duì)手在較量中相互學(xué)習(xí),現(xiàn)在在技術(shù)架構(gòu)上的目標(biāo)上已趨相同。
J2SE 1.4:快速
J2SE 1.4平臺(tái)的推出發(fā)生在2002年2月13日,由于此前在Java平臺(tái)和.NET平臺(tái)間發(fā)生了規(guī)模浩大的孰優(yōu)孰劣的論戰(zhàn),而論戰(zhàn)中,Java平臺(tái)最大的缺點(diǎn)就是性能問題,所以J2SE 1.4平臺(tái)把性能的改善放在了最重要的位置。
HotSpot虛擬機(jī):HotSpot虛擬機(jī)能夠很大程度上提高性能,所以J2SE 1.4已經(jīng)不支持傳統(tǒng)的虛擬機(jī)。現(xiàn)在,啟動(dòng)應(yīng)用程序應(yīng)該通過-client或者-server選項(xiàng)來啟動(dòng)。
鎖機(jī)制:由于舊版的HotSpot虛擬機(jī)的鎖機(jī)制會(huì)導(dǎo)制嚴(yán)重的性能和功能問題,J2SE 1.4已經(jīng)改寫了該鎖機(jī)制。
安全API:JCE、JSSE和JAAS這三大安全API從optional API移到了core API中。這樣,J2SE 1.4的安全域(SecureRandom)實(shí)現(xiàn)可以利用操作系統(tǒng)提供的安全機(jī)制,以便縮短應(yīng)用程序的啟動(dòng)時(shí)間。
RandomAccess標(biāo)記接口:加入了RandomAccess標(biāo)記接口,如果一個(gè)List實(shí)現(xiàn)了該接口,則表示它支持快速的隨機(jī)訪問,這樣可以提高List訪問的速度。
LinkedHashMap:加入了LinkedHashMap,這是一個(gè)插入排序的Map實(shí)現(xiàn),但它的運(yùn)行速度和HashMap一樣快。
反射:很多產(chǎn)品中都要使用反射(Reflection)機(jī)制,但大家知道,反射是相當(dāng)耗時(shí)的,所以,J2SE 1.4中重寫了java.lang.reflect.Field、java.lang.reflect.Method.invoke()、java.lang.reflect.Constructor.newInstance()和Class.newInstance()等方法,使得我們利用反射也能寫出高性能的應(yīng)用程序。
64位計(jì)算:J2SE 1.4支持64位計(jì)算。
新的I/O API:J2SE 1.4在API層面最大的變動(dòng),就是它更新了原有的java.io包,以及加入了一組更有效率更多功能的New I/O API。
斷言和日志處理:J2SE 1.4版本在Java語言層面上加入了斷言(assert關(guān)鍵字),在API層面上加入日志處理API,這些為程序的調(diào)試提供了強(qiáng)有力的支持。
從上面的分析可以看出,Java 2平臺(tái)在經(jīng)過數(shù)年的發(fā)展后,已經(jīng)比較成熟穩(wěn)定,J2SE 1.4主要是對(duì)平臺(tái)的性能進(jìn)行較多的考慮和修改。在分布式程序方面,1.4版比1.3版的運(yùn)行效率提高了一半以上;而在客戶端程序方面,1.4版比1.3版的效率提高了1/3。
J2SE 1.4版是J2SE第一個(gè)參與了 Java共同體過程(JCP)的J2SE版本。 像Borland、Compaq、Fujitsu、 SAS、 Symbian、 IBM這樣的公司,和Sun一起定義并發(fā)展了J2SE 1.4規(guī)范。在開放、良好的文檔編撰與管理的過程中,形成了一個(gè)高質(zhì)量的、代表了Java共同體的多樣性的規(guī)范。
J2SE5.0:易用
在2004年十月J2SE 5.0發(fā)布的時(shí)候,Sun公司這樣解釋這次版本名稱不是J2SE 1.5而是J2SE 5.0的原因:“從Java誕生至今已有9年時(shí)間,而從有J2SE算起也有5個(gè)年頭了;在這樣的背境下,將該版本號(hào)從1.5改為5.0可以更好的反映出新版的J2SE的成熟度、穩(wěn)定性、可伸縮性、安全性。”
J2SE的這次變更之重大和意義之深遠(yuǎn),的確也值得我們?yōu)橹寻姹咎?hào)變換到J2SE 5.0。我們?cè)倏纯碨un公司網(wǎng)站對(duì)J2SE 5.0的features描述:“通過增強(qiáng)Java平臺(tái)的力量,允許開發(fā)者更容易地使用,Java編程語言的這些改進(jìn)將吸引大量各種Java開發(fā)者”,這是“Java技術(shù)發(fā)展歷程的一個(gè)重要里程碑” 。從這個(gè)描述我們可以看出,J2SE 5.0最大的目標(biāo)是通過提供易用性而吸引各種開發(fā)者(當(dāng)然包括以前的C/C++開發(fā)者) ,而它對(duì)以前版本的修改并不僅僅是API的升級(jí),而且包括對(duì)Java語言層面的改進(jìn),被譽(yù)為是”自Java問世以來的最大一次語言標(biāo)準(zhǔn)變化”。
訪問環(huán)境變量:最初的Java語言有一個(gè)訪問環(huán)境變量的方法System.getenv(),但因?yàn)镴ava宣稱的”Write Once,Run AnyWhere”特性,所以在JDK 1.0中去掉了這個(gè)能夠訪問平臺(tái)專有信息的方法。在J2SE 5.0中,它又來了,并有所擴(kuò)充。由此可見J2SE 5.0對(duì)編程方便性的重視程度。
泛型:J2SE 5.0提供了強(qiáng)大的泛型機(jī)制,讓程序員可以減少代碼重復(fù),這個(gè)變化應(yīng)該可以吸引小部分的C#開發(fā)人員吧。
增強(qiáng)的for循環(huán):為了克服普通for循環(huán)的代碼臃腫特點(diǎn),J2SE 5.0提供了增強(qiáng)的for循環(huán),我們現(xiàn)在可以這樣寫一個(gè)for循環(huán):
public void printAll(Collection coll)
{
for(String str : coll)
{
??System.out.println(str);
}
}
怎么樣?是不是簡單了很多?
自動(dòng)的裝箱/拆箱:
可變參數(shù)數(shù)目J2SE 5.0開始支持Varargs(不固定自變量個(gè)數(shù)),J2SE 5.0中還加入了以前拋棄的枚舉和C風(fēng)格的格式化輸出,這應(yīng)該是為了吸引以前的C開發(fā)者吧。畢竟,在C開發(fā)中枚舉和格式化輸出用的是太多了。
并發(fā) J2SE 5.0中加入了java.util.concurrent包,并向集合框架中加入了Queue接口,J2SE 5.0還為各種集合提供了并發(fā)情況下的實(shí)現(xiàn)。
Properties類增強(qiáng) 由于XML的普及性應(yīng)用,J2SE 5.0為java.util.Properties類加入了從XML文件中裝載屬性和把屬性值存儲(chǔ)到XML文件中的方法。
Annotation功能J2SE 5.0提供了注解(annotation)/元數(shù)據(jù)(metadata)功能,相信以后的大部分應(yīng)用產(chǎn)品都將充分利用它的注解而實(shí)現(xiàn)產(chǎn)品的各種特性。
其它J2SE 5.0還在多線程(并發(fā)機(jī)制)、安全、國際化、UI等方面進(jìn)行了大規(guī)模的變更,使得我們能夠更方便地進(jìn)行Java開發(fā)。
其實(shí),上面的這些變更,并不是我們程序員非要不可的內(nèi)容。我們完全可以通過自己的辦法來達(dá)到這些變更實(shí)現(xiàn)的功能。但J2SE 5.0的目標(biāo)就是讓我們程序員能夠更加方便地進(jìn)行開發(fā),所以,我們?cè)诨贘2SE 5.0開發(fā)時(shí),應(yīng)該能夠明顯的體會(huì)到它的易用性。
展望
時(shí)至今日,J2SE已經(jīng)發(fā)展為一個(gè)覆蓋面廣、效率高、易用性強(qiáng)的技術(shù)平臺(tái)(見如下的J2SE API體系結(jié)構(gòu)圖),但Java并沒有停止前進(jìn)的腳步。Mustang版本的J2SE正在緊鑼密鼓的開發(fā)當(dāng)中,按以前的慣例,每兩年會(huì)發(fā)布一個(gè)全新的J2SE版本,所以Mustang開發(fā)版對(duì)應(yīng)的J2SE 6.0發(fā)布版將在2006年完成。
2005年5月23日是Java技術(shù)十周年慶典日,在這十年的發(fā)展中,Java平臺(tái)吸引了四百萬開發(fā)者,在網(wǎng)絡(luò)計(jì)算遍及全球的今天,更是有17.5億臺(tái)設(shè)備使用了Java技術(shù)。作為Java技術(shù)的基礎(chǔ),J2SE的功績不可掩沒,我們期望J2SE伴隨Java平臺(tái)一路走好!
MATRIX社區(qū)介紹:
Matrix,面向Java愛好者的非贏利性組織。成立以來,Matrix一直不遺余力地為推動(dòng)中國Java技術(shù)和開源軟件的進(jìn)步和發(fā)展而努力,發(fā)布了Jasmin反編譯器,Jmatrix全站系統(tǒng)等開源產(chǎn)品。加入Matrix,與Java共舞([url]www.matrix.org.cn[/url])
中國企業(yè)走近JCP
文/黃海波
對(duì)Java開發(fā)人員,JCP(Java Community Process)這個(gè)名詞并不陌生。但對(duì)國內(nèi)大部分Java開發(fā)人員來說,JCP更多的是一個(gè)符號(hào),一個(gè)國際Java開發(fā)社區(qū)的象征。而對(duì)JCP這個(gè)組織的來源、組成、運(yùn)作模式以及JCP對(duì)中國軟件產(chǎn)業(yè),甚至是我們自身工作事業(yè)的影響可能不甚了了。由于歷史原因、文化語言的差異,國內(nèi)Java廠商一直未能對(duì)JCP引起足夠重視,從而導(dǎo)致國內(nèi)的軟件廠商無法參與到JCP的行業(yè)標(biāo)準(zhǔn)的制定過程中去,結(jié)果就使我們只能跟隨制定好的標(biāo)準(zhǔn),而不能影響標(biāo)準(zhǔn)向著有利于國內(nèi)軟件產(chǎn)業(yè)的方向發(fā)展。
跟隨的劣勢(shì)是很明顯的,以萬眾期待的下一代Java持久化標(biāo)準(zhǔn)EJB 3為例。EJB 3規(guī)范目前仍在早期規(guī)范階段,預(yù)計(jì)要到2006年中期才能完成最終版本,但EJB 3專家組中的Java廠商都已經(jīng)根據(jù)討論的初步意見開始了產(chǎn)品開發(fā),有些甚至開始發(fā)布預(yù)覽版本。而國內(nèi)的J2EE廠商卻可能要等到EJB 3的最終版才可以著手進(jìn)行研究和開發(fā)(根據(jù)早期規(guī)范不可靠,變動(dòng)通常很大),差距自然巨大。在其他諸如如商業(yè)智能、工作流、數(shù)據(jù)挖掘等領(lǐng)域都存在類似情況。
可喜的是國內(nèi)軟件業(yè)的Java行業(yè)組織和管理部門都已經(jīng)認(rèn)識(shí)到,繼續(xù)徘徊在JCP的門外不利于國內(nèi)Java產(chǎn)業(yè)的生存和發(fā)展,也和國內(nèi)龐大的軟件市場(chǎng)不相符合。在許許多多有志之士(很多是筆者的前輩,他們?yōu)閲鴥?nèi)軟件業(yè)發(fā)展默默努力,實(shí)在讓人欽佩)的共同努力下,JCP的中國分支也即將成立。而作為第一個(gè)嘗試,中國的Java應(yīng)用體驗(yàn)認(rèn)證實(shí)驗(yàn)室在國家應(yīng)用軟件產(chǎn)品質(zhì)量監(jiān)督檢驗(yàn)中心、Sun計(jì)算機(jī)系統(tǒng)(中國)有限公司、中國軟件行業(yè)協(xié)會(huì)中間件分會(huì)、北京軟件與信息服務(wù)業(yè)促進(jìn)中心四單位共同努力下在北京成立,為中國的Java軟件廠商在國內(nèi)進(jìn)行軟件的JCP認(rèn)證和兼容測(cè)試。
http://www.souzz.net/bbs/archiver/?tid-49.html