Java 戰場一天不得閒,早先的 web framework 已經結束,喔,最少是沒人有興趣了。上一次戰很大的還有 closure,這也隨著 Sun 被 Oracle 買下後結束了。最新的戰場是改革 Java 語言本身。大家都知道在 JVM 上能跑的語言很多,多到滿出來了。不過,近來有個新趨勢逐漸成形,大家似乎了解到 "革命" 在這個圈子是不會成功的,尤其是面對那一大票保守、平庸的 Enterprise Java 開發者,而他們上面還有更保守的上司們。現在採取的策略是 "演進",設計者不再熱衷創造很前衛的語法,反而盡可能的相似原有的語言,而且提供原本 Java 開發者就習慣的開發體驗 (i.e. IDE)。另外,與過去不同的是,這一次語言不是什麼某某某的回家作業,而是有組織的推動。
這是最近剛推出的,不過並不是 Eclipse Foundation 主推的語言,而是 Xtext 計畫衍生的語言 (Xtext 是設計 DSL 的工具, Xtend 是為了產生 Java code 而特別設計的語言)
策略:static typed。Xtend 語言 compile 成 Java code,而不是 byte code。而產生的 Java code 可讀性很好。由於是Eclipse 旗下計畫,理所當然會擁有最好的 Eclipse IDE 支援。對於企業來說,導入的成本很低。
今年 JetBrain 發表的新語言,目前還只在 JetBrain 內部開發。發展的目的是讓 JetBrain 的 IDE 賣的更好。(笑)
策略:static typed。主打新語言配合 IDE 的支援可以避免常犯的錯誤 (例如在 IDE 的幫忙下可以完全避免 NullPointerException),這個語言自然會有 IntelliJ IDE 最好的支援。而為了推廣,他們也計畫開發 Eclipse plugin。
從學術界起家的語言,帶有濃厚的學術色彩。很早就開始發展,可以說是 Java.next 的先趨,後來其他的新語言都受到 Scala 的影響。盡管發展的早,推廣還是很慢,設計者後來了解到要在 Java 界起飛必需具備優良的 IDE 和商業支援,因此成立 TypeSafe 公司,投入更多資源開發 Eclipse Plugin。但近一兩年飽受語言過於複雜的批評。
策略:static typed。Scala 訴求是 a scalable language。它融合物件導向和函數型兩大編程範型,使用者可以逐步轉換到函數範型,進而滿足在多核心時代 scale 的需求。語言的彈性極大,可設計出類似 DSL 的 API。
在 Ruby on Rails 發展時,搭順風車起飛的語言。後期由 Spring 主導和支援,而且有固定的社群,但是無法繼續再成長。事實上 Groovy 已經不在 Java.next 的行列了,列在這裡只是純做為參考。如果又有另一個新的 Java 語言跟 Groovy 的訴求一樣 (動態語言、但效能差,而且 IDE 支援弱),那麼它是無法動搖 Java 界。
策略:dynamic typed。大部份的 Java code 都可以直接在 Groovy 上 compile,所以學習門檻最低,也可以設計 DSL。在 Rails 起飛之時,算是 Java 界對它做的回應。
這不是 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 語言本身進程太慢,迫使市場自行衍生出各式各樣的 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 很大的問題。