05 November 2011

Java 戰場一天不得閒,早先的 web framework 已經結束,喔,最少是沒人有興趣了。上一次戰很大的還有 closure,這也隨著 Sun 被 Oracle 買下後結束了。最新的戰場是改革 Java 語言本身。大家都知道在 JVM 上能跑的語言很多,多到滿出來了。不過,近來有個新趨勢逐漸成形,大家似乎了解到 "革命" 在這個圈子是不會成功的,尤其是面對那一大票保守、平庸的 Enterprise Java 開發者,而他們上面還有更保守的上司們。現在採取的策略是 "演進",設計者不再熱衷創造很前衛的語法,反而盡可能的相似原有的語言,而且提供原本 Java 開發者就習慣的開發體驗 (i.e. IDE)。另外,與過去不同的是,這一次語言不是什麼某某某的回家作業,而是有組織的推動。

.Eclipse Xtend 2

這是最近剛推出的,不過並不是 Eclipse Foundation 主推的語言,而是 Xtext 計畫衍生的語言 (Xtext 是設計 DSL 的工具, Xtend 是為了產生 Java code 而特別設計的語言)

策略:static typed。Xtend 語言 compile 成 Java code,而不是 byte code。而產生的 Java code 可讀性很好。由於是Eclipse 旗下計畫,理所當然會擁有最好的 Eclipse IDE 支援。對於企業來說,導入的成本很低。

.Kotlin

今年 JetBrain 發表的新語言,目前還只在 JetBrain 內部開發。發展的目的是讓 JetBrain 的 IDE 賣的更好。(笑)

策略:static typed。主打新語言配合 IDE 的支援可以避免常犯的錯誤 (例如在 IDE 的幫忙下可以完全避免 NullPointerException),這個語言自然會有 IntelliJ IDE 最好的支援。而為了推廣,他們也計畫開發 Eclipse plugin。

.Scala

從學術界起家的語言,帶有濃厚的學術色彩。很早就開始發展,可以說是 Java.next 的先趨,後來其他的新語言都受到 Scala 的影響。盡管發展的早,推廣還是很慢,設計者後來了解到要在 Java 界起飛必需具備優良的 IDE 和商業支援,因此成立 TypeSafe 公司,投入更多資源開發 Eclipse Plugin。但近一兩年飽受語言過於複雜的批評。

策略:static typed。Scala 訴求是 a scalable language。它融合物件導向和函數型兩大編程範型,使用者可以逐步轉換到函數範型,進而滿足在多核心時代 scale 的需求。語言的彈性極大,可設計出類似 DSL 的 API。

.Groovy

在 Ruby on Rails 發展時,搭順風車起飛的語言。後期由 Spring 主導和支援,而且有固定的社群,但是無法繼續再成長。事實上 Groovy 已經不在 Java.next 的行列了,列在這裡只是純做為參考。如果又有另一個新的 Java 語言跟 Groovy 的訴求一樣 (動態語言、但效能差,而且 IDE 支援弱),那麼它是無法動搖 Java 界。

策略:dynamic typed。大部份的 Java code 都可以直接在 Groovy 上 compile,所以學習門檻最低,也可以設計 DSL。在 Rails 起飛之時,算是 Java 界對它做的回應。

.Dart

這不是 JVM 語言,不過它的目標是 Java 開發者。Dart 是由 Google 開發,企圖取代 javascript 成為新一代的 web 語言。過去 Google 曾致力於開發 GWT,但重心已經轉換到 Dart 上。目前已釋出 preview 版和 IDE (Eclipse based)。

策略:Dart 有自己的 VM,是 optional typed 的動態語言。optional typed 的意思是 type 只對開發工具有用,在執行期間 type 被捨棄了。雖然是動態語言但 Dart VM 是由原 V8 engine 的設計者開發,效能上不會是問題。它可以 compile 成 javascript 在非 chrome 的瀏覽器上執行。它將會同時佈署在 browser 和 server 上,取代 javascript 和 java 的地位。Google 為其後盾是其他語言無法抗衡的優勢。(個人預測 google 遲早會讓 Dart 在 JVM 上執行,或是讓 Dart 可 compile 成 java code)

.Java 8

Java 語言本身進程太慢,迫使市場自行衍生出各式各樣的 Java.next。不過 Java 語言最終也會跟上 Java.next,但會是最為保守,並且完全相容舊版,尤其是在 Brian Goetz 的領導之下。(Oracle Language Architect)

策略:Goetz 的做法是統計,他會統計開發者的意見來決定 Java 的新語法。比方說對於該不該去除 CheckedException,他統計後發現大家抱怨的其實是那一大串的 catch block,而不是 CheckedException 本身,因此最後 CheckedException 沒有去除,反而讓 catch 支援 multi-catch。而在 Java8 的 closure 語法上,他選擇了 Scala 和 C# 的語法,理由是它們的語法被廣為接受而沒有太多的負面批評。

結語

Java.next 的語法會和 Java 很像。因此各家語法的不會有太大的差異,發展的功能也會很類似:就是替 Java 加上 closure、簡化 getter/setter property、去除無謂的型別宣告、去除 CheckedException、替 collection 加入 map/filter/each、first class function、operator overloading 等等

如果和原來的 Java 語法差異過大,將會影響企業接受的程度,進而失去可能的 Java.next 寶座,這也是目前 Scala 很大的問題。