2007 年 2 月 26 日
2007 年將是載入史冊(cè)的一年,Sun Microsystems 公司將于這一年在開(kāi)源許可協(xié)議下發(fā)布 Java 開(kāi)發(fā)包(JDK),從而放棄了對(duì) Java? 平臺(tái)的統(tǒng)馭,將權(quán)力交給了 Java 開(kāi)發(fā)人員社區(qū)!在本文中,Java 開(kāi)發(fā)人員 Elliotte Rusty Harold 從各個(gè)方面預(yù)測(cè)了 Java 平臺(tái)的新方向,從腳本到 bug 修復(fù)到新語(yǔ)法。
2006 年又是 Java 平臺(tái)繁榮的一年。盡管遭遇了來(lái)自 Microsoft(C#)和腳本語(yǔ)言社區(qū)(Ruby)的沖擊,但 Java 語(yǔ)言仍然保持著其世界頭號(hào)編程語(yǔ)言的地位。同時(shí),盡管 Java 6 的發(fā)布很值得慶祝,但比起宣布 Java 將在 GNU General Public License 下完全開(kāi)源這一事件來(lái)說(shuō),卻不免有些黯然失色。Java 在 2007 年還能保持這種勢(shì)頭嗎?讓我們來(lái)看一下成敗的可能。
Java 平臺(tái)將成為開(kāi)源平臺(tái)
2007 年上半年,Sun 將在一個(gè)開(kāi)源許可協(xié)議下發(fā)布 Java 開(kāi)發(fā)包(JDK)。解除 JDK 的禁錮對(duì)于 Java 開(kāi)發(fā)人員社區(qū)來(lái)說(shuō)是巨大的一步,它將在今后的十年中推動(dòng) Java 平臺(tái)的發(fā)展。
JDK 的質(zhì)量將會(huì)顯著改善,因?yàn)槌绦騿T們不再僅僅報(bào)告 bug 并開(kāi)始修復(fù)。Java Developer Connection 的 bug 報(bào)告將會(huì)包括對(duì) JDK 中的問(wèn)題部分的詳細(xì)分析,并提供修復(fù)的補(bǔ)丁。正如Linus 法則 所陳述的那樣,“只要給予足夠的關(guān)注,任何 bug 都是顯而易見(jiàn)”,即調(diào)試是可并行進(jìn)行的。優(yōu)化也是一樣。開(kāi)源使兩者得以 并行。
分支項(xiàng)目
遺憾的是,設(shè)計(jì)并不是和調(diào)試、優(yōu)化一樣可以并行完成的。清潔的 API 有時(shí)也需要有一只獨(dú)裁的手。但獨(dú)裁者的缺點(diǎn)是:有時(shí)他們知道在做什么,有時(shí)卻不知道。意圖成為獨(dú)裁者的各方面之間的競(jìng)爭(zhēng)往往是發(fā)現(xiàn)問(wèn)題最佳解決方案的惟一方式。
很少有公司能夠負(fù)擔(dān)得起這樣的代價(jià),為一個(gè)產(chǎn)品開(kāi)發(fā)多個(gè)獨(dú)立的實(shí)現(xiàn),以便在多個(gè)產(chǎn)品中選定保留一個(gè)而摒棄其余的產(chǎn)品,但開(kāi)源社區(qū)卻在朝這個(gè)方向努力。所以,您會(huì)在 Java 平臺(tái)的各個(gè)層次中發(fā)現(xiàn)分支產(chǎn)品:語(yǔ)言、虛擬機(jī)和庫(kù)。大多數(shù)的分支產(chǎn)品會(huì)失敗,但這沒(méi)什么。好主意會(huì)脫穎而出。一些分支產(chǎn)品會(huì)一直存在下去,一些會(huì)重新并入標(biāo)準(zhǔn) JDK 中。明年的這個(gè)時(shí)候,分支產(chǎn)品與主流產(chǎn)品之間的差異也許不會(huì)很明顯,但這個(gè)過(guò)程會(huì)繼續(xù)下去。
Sun 會(huì)在幾個(gè)月后發(fā)布 Java 7,Dolphin 的一個(gè)早期的 beta 版,以此作為開(kāi)端。Sun 無(wú)法發(fā)布更早的 JDK 版本,因?yàn)榇嬖谝恍┲挥性?Dolphin 中才能解決的構(gòu)建問(wèn)題和許可協(xié)議問(wèn)題。盡管如此,仍有望看到第三方著手進(jìn)一步細(xì)分 Sun 的版本,來(lái)提供 Java 6、Java 5、Java 1.4,甚至更早版本的流行開(kāi)源實(shí)現(xiàn)。
早期的一些探尋分支產(chǎn)品的人們可能會(huì)侵犯 Sun 公司的商標(biāo),收到 Sun 的律師寄來(lái)的討厭的律師信。我們需要一個(gè)通用的未注冊(cè)為商標(biāo)的名字,讓所有人都能使用。我建議用 “J” —— 我希望沒(méi)人用單字母作商標(biāo)。
開(kāi)源項(xiàng)目從未消亡,只是有些褪色。就像之前的 Blackdown Project、GNU Classpath、Kaffe 和其他開(kāi)源 JDK 項(xiàng)目一樣,他們的開(kāi)發(fā)人員都轉(zhuǎn)向其他事情了。如果一個(gè)項(xiàng)目至今還沒(méi)有達(dá)到 1.0,那么恐怕以后永遠(yuǎn)也達(dá)不到了。
期待 Java 7
Dolphin 不會(huì)在 2007 年發(fā)布。2008 年是更為現(xiàn)實(shí)的目標(biāo)。那就是說(shuō),工作尚在進(jìn)行中,它的一些功能也許會(huì)作為早期的標(biāo)準(zhǔn)擴(kuò)展或至少作為 beta 登場(chǎng)。
遺憾的是,為一門(mén)語(yǔ)言添加功能遠(yuǎn)比刪除功能要簡(jiǎn)單得多。幾乎不可避免地,隨著時(shí)間的推移,語(yǔ)言不是朝著簡(jiǎn)單的方向發(fā)展,而是越來(lái)越復(fù)雜,越來(lái)越讓人困惑。即使是那些單獨(dú)看起來(lái)很好的功能,在彼此疊加后也會(huì)出現(xiàn)問(wèn)題。
令人遺憾,Java 社區(qū)沒(méi)有接受這個(gè)教訓(xùn),盡管這種失敗并無(wú)特殊性。但總有一些太酷又太讓人激動(dòng)的新語(yǔ)法令語(yǔ)言設(shè)計(jì)者難以抗拒 —— 即便這樣的新語(yǔ)法不能解決任何實(shí)際問(wèn)題。于是對(duì) Java 7 的新語(yǔ)言功能就有了巨大的要求,包括閉包、多繼承和操作符重載。
我猜想在這一年結(jié)束前,會(huì)在 Java 7 beta 中看到閉包,也許還能看到操作符重載(有五成的把握),但不會(huì)出現(xiàn)多繼承。Java 中有太多東西是基于單個(gè)根的繼承層次。沒(méi)有可行的方式改進(jìn)多繼承,使之適應(yīng)這門(mén)語(yǔ)言。
目前有許多語(yǔ)法糖方面的提議,有一些有意義,有一些沒(méi)有。許多提議都專(zhuān)注于將像 getFoo() 這樣的方法替換為像 -> 這樣的操作符。
列表
最有可能的是使用數(shù)組語(yǔ)法來(lái)實(shí)現(xiàn)集合訪(fǎng)問(wèn)。例如,不再采用下面這樣的代碼:
List content = new LinkedList(10);
content.add(0, "Fred");
content.add(1, "Barney");
String name = content.get(0);
|
而是編寫(xiě)如下代碼:
List content = new LinkedList(10);
content[0] = "Fred";
content[1] = "Barney";
String name = content[0];
|
另一種可能性是:允許為列表使用數(shù)組初始化程序語(yǔ)法。例如:
LinkedList content = {"Fred", "Barney", "Wilma", "Betty"}
|
這兩項(xiàng)提議都可以在不改變虛擬機(jī)(VM)的前提下由編譯器稍顯神通即可實(shí)現(xiàn),這是任何修訂過(guò)的語(yǔ)法的一項(xiàng)重要特征。這兩項(xiàng)提議都不能使任何現(xiàn)有的源代碼失效或重定義現(xiàn)有的源代碼,對(duì)于新語(yǔ)法來(lái)說(shuō),這是一個(gè)更為重要的問(wèn)題。
真正能夠影響開(kāi)發(fā)人員生產(chǎn)力的特性功能應(yīng)該是用于管理表、樹(shù)和映射表的內(nèi)置原語(yǔ),比如在使用 XML 和 SQL 時(shí)遇到的那些。JavaScript 下的 E4X 項(xiàng)目和 Microsoft 的 Cω 和 Linq 項(xiàng)目是實(shí)現(xiàn)這一想法的先驅(qū),但可悲的是,Java 平臺(tái)似乎錯(cuò)過(guò)了這個(gè)機(jī)會(huì)。如果有人想要通過(guò)編譯器來(lái)玩一個(gè)潛在的救場(chǎng)的游戲,這里是一個(gè)不容錯(cuò)過(guò)的好地方。
屬性
很可以還有一些針對(duì)屬性訪(fǎng)問(wèn)的語(yǔ)法糖。一個(gè)建議是使用 -> 作為調(diào)用 getFoo 和 setFoo 的縮寫(xiě)。例如,不再使用如下代碼:
Point p = new Point();
p.setX(56);
p.setY(87);
int z = p.getX();
|
而是使用如下代碼:
Point p = new Point();
p->X = 56;
p->Y = 87;
int z = p->X;
|
也有人建議用另外一些符號(hào)來(lái)代替 -> ,包括 . 和 # 。
將來(lái),您有可能必須將 Point 類(lèi)中的相關(guān)字段顯式地標(biāo)識(shí)為屬性,如:
public class Point {
public int property x;
public int property y;
}
|
我個(gè)人對(duì)此并未產(chǎn)生什么深刻的印象。我寧愿 Java 平臺(tái)采納一項(xiàng)更為激進(jìn)的方法,讓我們可以真正地使用公共字段。然而,如果將 getter 或 setter 定義為與字段相同的名稱(chēng),然后讀寫(xiě)字段就會(huì)自動(dòng)地分派到相應(yīng)方法中。這樣做所使用的語(yǔ)法更少,也更加靈活。
隨機(jī)精度算法
 |
非操作符重載
值得一提的是,對(duì)標(biāo)準(zhǔn)數(shù)學(xué)符號(hào)的重用不同于 操作符重載,至少不是在 C++ 中引起問(wèn)題的那種重載。加號(hào)和其他操作符在任何程序中都具有明確的意義。無(wú)論在哪一個(gè)程序中,它們的意義都不會(huì)有所更改。對(duì)于相似的操作重用相同的語(yǔ)法讓代碼更易于閱讀。若重新定義語(yǔ)法,使之在不同的程序中有不同的意義,代碼就會(huì)較難理解。
|
|
另一項(xiàng)將方法替換為操作符的建議致力于 BigDecimal 和 BigInteger 。例如,目前您不得不像這樣編寫(xiě)不限精度的算法:
BigInteger low = BigInteger.ONE;
BigInteger high = BigInteger.ONE;
for (int i = 0; i < 500; i++) {
System.out.print(low);
BigInteger temp = high;
high = high.add(low);
low = temp;
};
|
寫(xiě)成這樣會(huì)更清晰:
BigInteger low = 1;
BigInteger high = 1;
for (int i = 0; i < 500; i++) {
System.out.print(low);
BigInteger temp = high;
high = high + low;
low = temp;
};
|
這項(xiàng)建議似乎無(wú)關(guān)緊要,但它可能會(huì)導(dǎo)致過(guò)度使用這些類(lèi),進(jìn)而導(dǎo)致尚不成熟的代碼中性能降低。
將 JAM 從 JAR 中分離出來(lái)
Java 7 會(huì)撫平 Java 開(kāi)發(fā)人員長(zhǎng)久以來(lái)積聚的憤怒:各種各樣的類(lèi)加載器和相關(guān)的 classpath。Sun 公司在 Java Module System 這個(gè)問(wèn)題上經(jīng)受了又一次打擊。數(shù)據(jù)將存儲(chǔ)到 .jam 文件,而不是 .jar 文件中。這是一種 “superjar”,它包含了所有的代碼和元數(shù)據(jù)。最重要的是,Java Module System 將首次支持版本,所以可以說(shuō)一個(gè)程序需要 Xerces 2.7.1 而不是 2.6。它也允許指定依賴(lài)項(xiàng);例如,可以說(shuō)一個(gè) JAM 程序需要 JDOM。它也要允許在加載一個(gè)模塊時(shí)不必加載全部模塊。最終,它要支持一個(gè)集中式的存儲(chǔ)庫(kù),其中要能提供多個(gè)不同的 JAM 的不同版本,應(yīng)用程序能夠從中挑選所需。如果 JMS 適用,jre/lib/ext 將會(huì)成為過(guò)去時(shí)。
包訪(fǎng)問(wèn)
我也希望 Java 7 能夠稍微放松一下訪(fǎng)問(wèn)限制。子包也許能夠看到上層包里的包保護(hù)字段和類(lèi)方法。也就是說(shuō),子包也許能夠看到上層包里明確聲明友好性的包保護(hù)成員。不論用哪種方式,將應(yīng)用程序分割成多個(gè)包都會(huì)變得簡(jiǎn)單的多,也會(huì)顯著地改善可測(cè)試性。只要子包中含有單元測(cè)試,就不必使用公共方法去進(jìn)行測(cè)試。
文件系統(tǒng)訪(fǎng)問(wèn)
自從 1995 年開(kāi)始,文件系統(tǒng)訪(fǎng)問(wèn)就成為 Java 平臺(tái)的一個(gè)主要問(wèn)題。十多年后,還是沒(méi)有可信賴(lài)的跨平臺(tái)方式來(lái)執(zhí)行如復(fù)制或移動(dòng)文件這類(lèi)基本操作。處理這個(gè)問(wèn)題是過(guò)去至少三個(gè)版本的 JDK(1.4、1.5 和 1.6)的公開(kāi)問(wèn)題。遺憾的是,為了迎合不怎么普遍卻更具誘惑的操作,如內(nèi)存映射 I/O,有些乏味但卻很必要的 API 被擱到了一邊。JSR 203 可能會(huì)最終解決這個(gè)問(wèn)題,給我們一個(gè)可行的、跨平臺(tái)文件系統(tǒng) API。工作組也許會(huì)再一次對(duì)其無(wú)比崇尚的真正的異步輸入/輸出文件系統(tǒng)這個(gè)相對(duì)不重要的問(wèn)題上花費(fèi)過(guò)多時(shí)間,從而讓該 API 再一次束之高閣。下一年的這個(gè)時(shí)候我們就會(huì)知道。
實(shí)驗(yàn)
無(wú)論做出什么樣的改變,如果它們首先是在開(kāi)源社區(qū)里實(shí)現(xiàn),那么都是令人愉快的,所以我們只要看一下真正的區(qū)別有多大或多小。為此,Sun 公司的 Peter Ahè 開(kāi)始了 java.net 上的 Kitchen Sink Project。目標(biāo)是要分別地分派和指定 javac 編譯器,來(lái)測(cè)試像這樣的許多不同想法。在博客里寫(xiě)寫(xiě)這些可愛(ài)的功能是一回事;但真正制造運(yùn)行的代碼則全然是另一回事。
客戶(hù)機(jī) GUI
盡管許多人還沒(méi)注意到,但 Java 平臺(tái)真正出現(xiàn)在桌面上到現(xiàn)在已經(jīng)有四五年了。已經(jīng)有幾個(gè)優(yōu)質(zhì)的桌面應(yīng)用程序是用 Java 代碼編寫(xiě)的,包括 RSSOwl、Limewire、Azureus、Eclipse、NetBeans、CyberDuck 等等。這些應(yīng)用程序幾乎用了每一個(gè)可用的 GUI 工具包來(lái)編寫(xiě),包括 Swing、AWT、SWT,甚至是平臺(tái)原生的工具包,如 Mac OS X 的 Cocoa。我看不出下一年會(huì)有哪個(gè)工具包在眾多工具包中勝出,盡管 Swing 在制造一些保留本色的應(yīng)用程序方面似乎比其他工具包表現(xiàn)得更為出色。
用 Swing 進(jìn)行開(kāi)發(fā)仍是相對(duì)挑戰(zhàn)的,但隨著 Swing 應(yīng)用程序框架的到來(lái),這種情況也許會(huì)在下一年得到改善。這一框架目前尚在 Java Community Process 中作為 JSR 296 開(kāi)發(fā)。下面是 JSR 關(guān)于此的描述:
編寫(xiě)良好的 Swing 應(yīng)用程序試圖為啟動(dòng)和停止,以及管理資源、行為和會(huì)話(huà)狀態(tài)的代碼使用相同的核心元素。新應(yīng)用程序從頭開(kāi)始創(chuàng)建所有這些核心元素。Java SE 不支持構(gòu)造應(yīng)用程序,這常常讓開(kāi)發(fā)新手們感到有點(diǎn)茫然,特別是在他們打算構(gòu)建一個(gè)規(guī)模遠(yuǎn)超于 SE 文檔中提供的例子的應(yīng)用程序時(shí)。
通過(guò)定義 Swing 應(yīng)用程序的基本結(jié)構(gòu),這項(xiàng)規(guī)范(最終)會(huì)添補(bǔ)該空白。它會(huì)定義一小套可擴(kuò)展的類(lèi)或 “框架”,用于定義相對(duì)于大多數(shù)桌面應(yīng)用程序較普遍的基礎(chǔ)設(shè)施。
Swing 應(yīng)用程序框架應(yīng)支持典型應(yīng)用程序中的大多數(shù)東西,允許開(kāi)發(fā)人員恰在一些自定義的點(diǎn)處插入,如啟動(dòng)和停止時(shí)。在啟動(dòng)和停止之間,它將處理 windows 的保存和恢復(fù),以及應(yīng)用程序的其他部分。最后,它將允許開(kāi)發(fā)人員編寫(xiě)在 Swing 事件分派線(xiàn)程外運(yùn)行的異步行為。
改善 JavaBeans 以及所有依賴(lài)它的東西(包括 Swing)的工作尚在繼續(xù)。JSR 295 正在定義一種將 bean 綁定到一起的標(biāo)準(zhǔn)方式,這樣,對(duì)一個(gè) bean 的修改就會(huì)自動(dòng)地反映到其他的 bean。例如,一個(gè) GUI 網(wǎng)格 bean 會(huì)在其相關(guān)數(shù)據(jù)庫(kù) bean 改變時(shí)自動(dòng)更新。
最終,JSR 303 正在實(shí)現(xiàn)一門(mén)基于 XML 的驗(yàn)證語(yǔ)言,來(lái)聲明式地指定任何給定的 bean 將取什么值。int 屬性將必須介于 1 到 10 之間,或者 String 屬性必須包含一個(gè)合法的電子郵件地址。如果幸運(yùn),這一切都將在年底以 beta 形式提供,并將在來(lái)年的 Java 7 中按時(shí)完成。
作為桌面語(yǔ)言的 Java 平臺(tái)
一些程序員們選擇用 Java 代碼編寫(xiě)他們的桌面應(yīng)用程序是因?yàn)樗鼈兤珢?ài)這門(mén)語(yǔ)言,但大多數(shù)程序員則是被多平臺(tái)轉(zhuǎn)換這一強(qiáng)烈的渴望所驅(qū)動(dòng)。對(duì) Java 平臺(tái)作為桌面語(yǔ)言的興趣于是就同非 Microsoft 桌面的數(shù)目緊緊地聯(lián)系了起來(lái)。讓我們認(rèn)為 Java 編程會(huì)在來(lái)年出現(xiàn)在三大主流桌面上。
Windows
Swing 在下一年會(huì)繼續(xù)對(duì)其類(lèi)似 Windows 的外觀(guān)作出小的改進(jìn),尤其是轉(zhuǎn)換到開(kāi)源開(kāi)發(fā)這一部分。結(jié)果,純 Java 程序如 LimeWire 甚至?xí)仍?Windows 下看起來(lái)更加具原生感。但開(kāi)發(fā)原生 Windows 應(yīng)用程序所選擇的語(yǔ)言仍是 C#(還有一些 C 和 C++ 的追隨者),而開(kāi)發(fā)框架會(huì)選用 .NET。Java 代碼不會(huì)對(duì) Windows 生態(tài)系統(tǒng)造成任何顯著打擊。
Macintosh
像 Microsoft 一樣,Apple Inc. 也使用了相當(dāng)多被拋棄的 Java 代碼。Apple 公司喜愛(ài) Objective C 和 Cocoa,但最后的結(jié)果是相同的:只用 Mac 的開(kāi)發(fā)人員會(huì)繼續(xù)減少 Java 代碼,而選擇 Apple 偏愛(ài)的語(yǔ)言和環(huán)境。
積極的一面是,盡管 Apple 不再在其私有的 API(如 QuickTime 和 Cocoa)中支持 Java 代碼,Apple VM 已經(jīng)比前些年改進(jìn)了不少。Apple 的 Java 6 移植版不久就會(huì)發(fā)布。它不會(huì)是開(kāi)源的(不同于 Sun 的 JDK),但開(kāi)源程序員們還是會(huì)著手修補(bǔ)它的 bug。
Linux
GPL 許可協(xié)議將使這成為可能,即將 Java 代碼綁定到最純的開(kāi)源 Linux 發(fā)行版中,這將使 Java 平臺(tái)成為 Linux 開(kāi)發(fā)中更為吸引人的語(yǔ)言。如果這些在五年前發(fā)生的話(huà):Linux 社區(qū)將不會(huì)不得不掙扎于使用 C 語(yǔ)言,而 Mono 也不會(huì)成為必要。
已經(jīng)有了針對(duì) Gnome 和 KDE 的 Java 綁定,所以希望這些會(huì)在接下來(lái)的一年里吸引更多人的關(guān)注。也期望至少有一個(gè)即將進(jìn)行的開(kāi)發(fā) Linux GUI 程序的主要項(xiàng)目使用 Java 語(yǔ)言而不是 C、C++ 或 C#。
Ruby 取勝
 |
臃腫的軟件
JavaScript 已經(jīng)和 JDK 6 綁定到了一起。其他語(yǔ)言也許會(huì)添加進(jìn) JDK 7。我覺(jué)得那樣會(huì)有點(diǎn)臃腫。首先,Sun 公司絕不會(huì)加入一門(mén)語(yǔ)言就停下來(lái)。如果它選了 BeanShell,擁護(hù) Groovy 的家伙也會(huì)要求加入。如果加入了 Groovy,用 Ruby 的家伙也會(huì)堅(jiān)持要加入。如果 Ruby 加入,還能忽略 Python 嗎?標(biāo)準(zhǔn) JDK 已經(jīng)太龐大了。支持多種腳本語(yǔ)言是一回事,但將它們綁定到一起還是同一件事嗎?策略性的改進(jìn)應(yīng)該是支持所有這些語(yǔ)言,但一個(gè)也不綁定進(jìn)來(lái)。
積極的一面是,Sun 公司正在研究減小初始下載尺寸和減少應(yīng)用程序啟動(dòng)時(shí)間的方法,尤其是 applet 和 Java Web Start 應(yīng)用程序??赡艿姆椒ㄊ牵瑢⒋罅康念?lèi)庫(kù)放到服務(wù)器上或放到速度較慢的后臺(tái)線(xiàn)程中,只下載需要的部分。
|
|
如果我們只說(shuō)一門(mén)語(yǔ)言,世界將會(huì)索然無(wú)味。盡管 Java 平臺(tái)是開(kāi)發(fā)成熟應(yīng)用程序的絕佳選擇,但它從來(lái)就不適應(yīng)于小程序或宏。Java 6 意識(shí)到了這一點(diǎn),它添加了 javax.script 包實(shí)現(xiàn),以便和腳本語(yǔ)言(如 BeanShell、Python、Perl、Ruby、ECMAScript 和 Groovy)進(jìn)行互操作,也添加了一項(xiàng) invokedynamic 虛擬機(jī)指令來(lái)允許將動(dòng)態(tài)類(lèi)型語(yǔ)言直接編譯為 Java VM。
2007 年,我將寶押在 Ruby 上,盡管它并不是我個(gè)人的最?lèi)?ài)。對(duì)于我來(lái)說(shuō),Python 代碼似乎比 Ruby 代碼更簡(jiǎn)潔更易于理解,我認(rèn)為大多數(shù) Java 程序員都會(huì)這樣認(rèn)為。然而,Python 出來(lái)的不是時(shí)候。許多開(kāi)發(fā)人員不得不在學(xué)習(xí) Python 代碼還是學(xué)習(xí) Java 代碼間作出選擇,而多數(shù)人選擇了 Java 代碼。既然他們終于弄懂了 Java 語(yǔ)法,又打算在工具箱中添加另一門(mén)語(yǔ)言,他們想要的是明天的語(yǔ)言,而不是昨天的語(yǔ)言,而那門(mén)語(yǔ)言似乎就是 Ruby。更重要的是,Ruby 的 Ruby on Rails 是一個(gè)絕對(duì)殺手級(jí)的應(yīng)用程序。它的簡(jiǎn)單性對(duì)于多數(shù)覺(jué)悟了的 Java 企業(yè)版(Java Enterprise Edition,JEE)開(kāi)發(fā)人員來(lái)說(shuō)具有難以置信的魅力。
除了 Rails,比起其他腳本語(yǔ)言,JRuby 項(xiàng)目和現(xiàn)有的 Java 代碼很好或更好地集成到了一起。事實(shí)上,JRuby 也許會(huì)超越標(biāo)準(zhǔn) Ruby 分布,并成為 Ruby 程序員們更偏愛(ài)的平臺(tái),而不止是 Java 程序員們將 Ruby 作為第二種選擇。這很好。Python 程序員們會(huì)這樣反對(duì):他們這些年來(lái)已經(jīng)將 JRuby 最好的方面加入到 Jython 中,他們是對(duì)的,但我討論的是 2007 年將 發(fā)生什么,而不是應(yīng)該 發(fā)生什么。這很不幸但卻是事實(shí):Ruby 獲得了契機(jī),而 Python 沒(méi)有。
其他腳本語(yǔ)言會(huì)被逐漸逐出界外。Perl 太過(guò)時(shí)了,不能很好地適應(yīng)現(xiàn)代應(yīng)用程序。Groovy 缺少明確的視角,還趨向于將計(jì)算機(jī)科學(xué)的時(shí)髦用語(yǔ)凌駕于可用性和熟悉性之上,這讓它深受其苦。BeanShell、Jelly,還有半打其他語(yǔ)言可能都從未吸引過(guò)超過(guò)一個(gè)的稱(chēng)心追隨者。來(lái)年的這個(gè)時(shí)候,到處都會(huì)是這樣的吶喊:Ruby 將成為 Java 程序員們首選的腳本語(yǔ)言。
集成開(kāi)發(fā)環(huán)境(IDE)會(huì)變得更好
一批垂死的 IDE 真正點(diǎn)燃了 2006 之火,再一次證明競(jìng)爭(zhēng)是好事。由于 Eclipse 造成的窘境,Sun 將一些能量和資源注入到 NetBeans 當(dāng)中,最終開(kāi)始了一場(chǎng)貌似激烈的競(jìng)爭(zhēng)。通過(guò)采取一些措施,到 2006 年底,NetBeans 甚至超越了 Eclipse。它針對(duì)設(shè)計(jì) GUI 具有卓越的原生化外觀(guān)和出色得多的工具。它所不具有的是 Eclipse 社區(qū)。相比 NetBeans,更多的插件和第三方產(chǎn)品是基于 Eclipse 的 —— 至少?gòu)牧可细?—— 并且這種趨勢(shì)僅呈加速之勢(shì)。
來(lái)年,Eclipse 會(huì)努力開(kāi)發(fā) 3.3 版,應(yīng)于 2007 年發(fā)布。Sun 也可能成功地將 NetBeans 6 公諸于世。這兩個(gè)版本都不太可能是重要的版本:它們只是關(guān)注于添加這里或那里的小功能、修復(fù) bug 和簡(jiǎn)化用戶(hù)界面(盡管可能還沒(méi)有做到應(yīng)該要做的那么多)。
NetBeans 可能將繼續(xù)贏得 Eclipse 的市場(chǎng)份額。這是從很早以前就開(kāi)始了的,這方面還有更大的增長(zhǎng)空間。(Sun 無(wú)情地推動(dòng) NetBeans 和 JDK 下載并沒(méi)傷害到任何一個(gè))。到本年度結(jié)束時(shí),兩種 IDE 也許將瓜分這個(gè)市場(chǎng),平分天下。
同時(shí),自信滿(mǎn)滿(mǎn)的 IntelliJ IDEA 用戶(hù)將繼續(xù)疑惑于這一團(tuán)混亂的場(chǎng)面。他們的信念是:IntelliJ IDEA 是最好的 Java IDE。盡管如此,大多數(shù)用戶(hù)不會(huì)對(duì) 500 美元的標(biāo)價(jià)視而不見(jiàn),因此其市場(chǎng)份額將繼續(xù)在 5% 上下波動(dòng)。
Java 企業(yè)版
沒(méi)有哪部分 Java 編程像 JEE 這么成功,也沒(méi)有哪部分 Java 編程像 JEE 那樣招致如此多的斥責(zé)。它是一門(mén)每個(gè)人都喜歡去討厭的技術(shù)。它復(fù)雜、費(fèi)解并且是重量級(jí)的。沒(méi)有哪部分 Java 編程有這多么第三方努力將其整個(gè)替換或部分替換:Spring、 Hibernate、Restlet、aspects、Struts …… 等等。雖然如此,幾乎每一個(gè)招聘 Java 程序員的商家都要求其有 JEE 經(jīng)驗(yàn),因此 Sun 確實(shí)是正確的。
在企業(yè)級(jí)領(lǐng)域里,我能看到的全部趨勢(shì)就是簡(jiǎn)單。大塊頭的框架出局;小而簡(jiǎn)單的加入了進(jìn)來(lái)。隨之增長(zhǎng)的是,客戶(hù)拒絕大塊頭的 JEE 棧部分,這種趨勢(shì)還在繼續(xù)。作為替代的是,客戶(hù)轉(zhuǎn)向了像 Spring 這樣更簡(jiǎn)單的框架或者完全脫離 Java 平臺(tái)而投向 Ruby On Rails。對(duì)于更簡(jiǎn)單、更易理解的系統(tǒng)的需求也驅(qū)動(dòng)著對(duì)面向服務(wù)架構(gòu)(SOA)和具象狀態(tài)傳輸(Representational State Transfer, REST)的興趣。
我們能夠預(yù)料出,朝著簡(jiǎn)單發(fā)展的趨勢(shì)在 2007 年將會(huì)延續(xù)。許多對(duì) Rails 留下印象的人正試圖在其他語(yǔ)言上復(fù)制它的成功,比如 Python (Turbo Gears)、Groovy (Grails) 以及 Java (Sails)。這其中的某個(gè)有可能成功,但它們?nèi)绻惶岢鲆恍?qiáng)有力的新舉措的話(huà),就不會(huì)取得成功。因此,企業(yè)仍將加載他們已有的框架:SOA、REST 和 Rails。
Java 微型版(Java Micro Edition, Java ME)
將視線(xiàn)從最大平臺(tái)移到最小平臺(tái)上來(lái),我們能期待嵌入式世界帶給我們什么?多年以來(lái),Java 平臺(tái)已經(jīng)在小設(shè)備上取得了相當(dāng)大的成功,而 2007 很可能會(huì)以這一成功為基礎(chǔ)。首先,關(guān)注一下移動(dòng)信息設(shè)備描述(Mobile Information Device Profile,MIDP) 的第 3 版,來(lái)利用當(dāng)今更為強(qiáng)大的設(shè)備的功能。特別是,我們應(yīng)該很快就能在一個(gè)虛擬機(jī)上運(yùn)行多個(gè) MIDlet,包括在后臺(tái)運(yùn)行一個(gè)或多個(gè)。同樣也關(guān)注一下加密記錄管理系統(tǒng)(RMS)存儲(chǔ)和 IPv6 支持。
Java ME 的可擴(kuò)縮的 2D 矢量圖形(Scalable 2D Vector Graphics, SVG)API 2.0 當(dāng)前正在開(kāi)發(fā)中,它應(yīng)擴(kuò)展在許多設(shè)備中的動(dòng)畫(huà)功能。除 SVG 動(dòng)畫(huà)之外,它也將支持流式音頻和視頻。如果移動(dòng)網(wǎng)絡(luò)開(kāi)放,這是相當(dāng)重要的 —— 想想在手機(jī)上的 YouTube。(當(dāng)然,如果網(wǎng)絡(luò)開(kāi)放,那就只是沒(méi)人愿意看的兩英寸的公司廣告。在這點(diǎn)上,我對(duì)美國(guó)的情況持悲觀(guān)態(tài)度,而在歐洲也許會(huì)更有趣。)
移動(dòng)開(kāi)發(fā)者也能期望本年推出第一款支持 Java ME 的 XML API 的手機(jī)。此 API 是 SAX、DOM、 StAX 和 JAXP 的一個(gè)精選子集,設(shè)計(jì)它是為了適應(yīng)內(nèi)存受限的手機(jī)。許多人認(rèn)為真正的 XML 不適合手機(jī) —— 他們是對(duì)是錯(cuò)今年就能見(jiàn)分曉。
盡管好事連連,Apple 的 iPhone 仍對(duì) Java 平臺(tái)(作為移動(dòng)電話(huà)開(kāi)發(fā)平臺(tái))構(gòu)成了一個(gè)主要的威脅。iPhone 已經(jīng)是這個(gè)星球上最火爆、最有魅力的手機(jī),它已經(jīng)發(fā)布了六個(gè)月。問(wèn)題在于它將成為一個(gè)相對(duì)封閉的平臺(tái),甚至按手機(jī)網(wǎng)絡(luò)標(biāo)準(zhǔn)也是如此,并且它沒(méi)打算運(yùn)行 Java 代碼。無(wú)需多說(shuō),對(duì)于任何試圖向手機(jī)、PDA 和個(gè)人通訊設(shè)備推銷(xiāo)第三方應(yīng)用程序的人來(lái)說(shuō),這都是一個(gè)恐怖的消息。
結(jié)束語(yǔ)
由于 JDK 的開(kāi)源,2007 注定成為自互聯(lián)網(wǎng)炸彈(dot bomb)以來(lái) Java 編程界最令人激動(dòng)的年份。截至目前,Java 平臺(tái)一直被 Sun 公司的目標(biāo)和投資能力所制約,但這種情況即將改變。有了開(kāi)發(fā)者社區(qū)掌舵,我們有望看到 Java 編程全方位發(fā)展,而這種發(fā)展很可能突然出現(xiàn)。開(kāi)發(fā)人員將使用 Java 代碼(以及針對(duì) Java 代碼)完成比以往更多的任務(wù)。桌面、服務(wù)器以及嵌入式:一切都會(huì)加速!是的,在這個(gè)過(guò)程中會(huì)有一些重大的失敗,但失敗也是樂(lè)趣的一部分!好的想法將脫穎而出,不好的將被淘汰。如果您對(duì) Java 平臺(tái)有任何不滿(mǎn)意,或者有一直迷惑的地方,啟動(dòng)您的 IDE,開(kāi)始改造吧!
女士們、先生們!啟動(dòng)您的編譯器吧! |