待到Java 8面世之時 .Net的進度時鐘恐怕已經又走過了兩到五年——屆時微軟做出的調整將使二者差距進一步拉大。
就在幾周之前,我詳細介紹了Java 8中值得期待的幾大主要功能。不過當時我并沒有提到.Net的新變化,事實上Java 8中的大部分(甚至全部)功能都能在.Net中找到。更夸張的是,不少將被推遲到Java 9中實現的功能也將在.Net中出現。我并不贊成將一切功能盲目塞進Java語言的激進行為,不過我認為Java平臺(相對于語言本身)確實應該在功能多樣性方面下點功夫。在我看來,.Net技術堪稱杰出,C#與.Net平臺自Java 3時代就開始在各個方面迎頭趕上。就個人而言,我對微軟的操作系統非常抵觸,而且很擔心無法修復討厭的bug(至少在理論上不行)。
兩套平臺、一個故事
很多朋友認為微軟公司在提供較小安裝基礎與激發開發者擁護熱情方面行動更快,這樣的論斷還算公正。我還記得上世紀九十年代與兩千年初時,微軟公司決定以幾乎每周一次的速度變更數據庫API,于是ODBC、RDO、ADO乃至OLEDB等等一下子涌到我們面前。然而隨著.Net的出現,微軟的研發強度達到了臨界值,后續而來的是更兇猛、更頻繁的發展進程。
然而Java為什么會落后如此之多?在Java出現的早期,其發展速度同樣令人贊嘆。從Java 1.0.2到Java 1.1,我們僅在一年之間就迎來了眾多根本性(通常也意味著存在兼容性問題)改變。其后,從1.1版本到1.2版本用了一年半時間,之后的1.22——一個看似小更新、實為大升級的版本——僅在七個月后就火熱出爐。短短十個月后,里程碑式的Java 1.3版本整裝待發,這也是第一個考慮在服務器端加入垃圾收集功能的版本。
Java 1.4給我們帶來了NIO(即網絡接口對象)與正則表達式,與前代版本相隔不到兩年。Java 1.4.2則在多核環境中實現了垃圾收集功能(雖然還不太穩定),開發周期為一年。接下來是Java 1.5,這個開發周期超過一年的新版本將并發一致性GC引入生產流程,并且加入了其它一些重要的并發及NIO功能。
Java 1.6將關注重點放在性能節約方面,雖然效果還算顯著,但其改進幅度仍然無法與1.5版本相提并論、更遑論用去了無數開發者兩年的等待時間。Java 1.7是自1.4.2以來第一個針對底層虛擬機技術(G1 collector)做出大幅改動的新版本,利用invokedynamic指令幫助我們在JVM環境下更好地與其它語言對接。盡管屬于大版本升級,但五年的更新周期無疑標志著Java的迭代步伐已經明顯放緩。
Sample features in Java and .Net and their release dates
Java功能
.Net或C#功能
Java 版本及日期
.Net 或 C# 版本及日期
java.util.concurrentFuture/ ForkJoinPool / java.util.stream
任務并行庫
Java 5 / 2004年9月30日
Java 7/2011年7月28日
Java 8 / 2014年4月
.Net 4.0 /2010年4月12日
Lambda表達式
Lambda 表達式
Java 8/2014年4月
.Net 3.5 /2007年11月19日
switch語句中的字符串
C# switch
Java 7 / 2011年7月28日
.Net 1.1 / 2003年4月24日
泛型
泛型
Java 5 / 2004年9月30日
.Net 2.0 / 2005年11月7日
NIO
異步I/O
Java 1.4 / 2002年2月6日
.Net 2.0 / 2005年11月7日
Jigsaw
程序集與應用程序域
Java 9 / ?
.Net 1.1 / 2003年2月3日 (在后續版本中持續改進)