聊聊Java平臺上的非Java語言
Java 的創造者們在一開始就把Java 語言和Java 虛擬機分開, 現在看來是個非常明智的決定。
Java虛擬機定義了一個"軟CPU", 和Intel 的x86 的指令集一樣, 這個軟CPU也有一套自己的指令,這就意味者對于任意一門編程語言, 只要你能編譯成Java 的字節碼指令,或者在運行時動態的生成字節碼指令, 就可以運行在Java虛擬機中。
Java 虛擬機發展了這么多年, 已經非常的成熟和穩定, 是一個很有吸引力的平臺。 除了Java 之外還有不少編程語言慕名而來, 今天就來聊一聊。
1.Jython和JRuby
從這兩位名字開頭的字母 "J" 就可以看出來這兩個語言和Java 的血緣關系。
沒錯,他們就是可以運行在Java 虛擬機上的Python 和 Ruby 。 不同于用C語言寫的CPython和 CRuby, 這兩者需要一個JVM才能運行。
既然是運行在JVM上的語言, 自然要能調用Java 類庫, 要不然放著這么多優質Java 資源不用多可惜!
下面就是一個在JRuby 腳本中調用 Java Swing的例子:
如果你思考的深入一些,就會有這么一個問題 : 由于Python 和ruby 都是腳本語言, 都是解釋執行的, 沒有編譯的過程, 那Jython和JRuby 在解釋的過程中,肯定得生成Java 字節碼, 要不然JVM就會把他們拒之門外。那字節碼是怎么在運行中生成的?
答案就是ASM , 一個可以動態生成字節碼的Java 類庫。
(碼農翻身注: 參見文章《ASM: 一個低調成功者的自述》)
我個人覺得Jyhton和JRuby能在JVM上運行起來,調用Java 類庫, 是個很好的賣點, 但是卻難以大規模流行, 原因可能也是類庫造成的。
最早的時候學習C語言, 由于沒有良好的類庫,就是對一個字符串操作都很麻煩, 那些更加高層的語言例如Java, Python, Ruby 就彌補了這個缺陷, 語言自帶強大的類庫, 再加上社區的貢獻, 用起來非常順手。 說個題外話, 這也直接導致了很多初學者的疑問: 語言都封裝好了, 我還學數據結構干嘛?!
Python, Ruby 社區已經積累了大量的、好用的庫, 他們才是Python, Ruby一派繁榮的主要原因, 但是這些庫都是Python, Ruby寫的, 也有不少是C語言寫的, 這些海量的類庫全部移植到Java 上絕非易事, 我們也不能要求類庫的作者同時提供Java 版本 。
而Java 現成的類庫總是感覺和Python , Ruby 有一點Gap, 語言設計的思維不同, 雖然可以集成互操作, 但還是感覺別扭。
也許Jython和JRbuy 只是小范圍內或者特定場合使用吧。
2.Groovy
Groovy 并不像Jython, JRuby, 它并不是一個現有語言在JVM上的移植, 而是一個全新設計的語言。
Groovy被定義為JVM上的動態腳本語言, 適合編寫腳本, 測試用例和 領域特定語言(DSL)。
用Groovy 寫的軟件中有兩個比較知名:
1). Gradle
一個風頭正勁的Build 工具, 得益于Groovy 簡潔的語法, 可以用“Build領域特定的語言”來描述一個軟件的構建過程, 寫出的Build腳本 和Ant, Maven 的xml 腳本 相比,讀起來更賞心悅目。 在Web項目,Android項目的 Build過程中有大量使用。
下面是一個例子, 大家可以感受一下和Maven 的區別:
2). Grail
這應該是模仿Ruby on Rail的一個項目,熱度已經過去, 估計使用的人不多了。
記得在2008年IBM的毛新生帶領著團隊搞了一個Project Zero出來, 基于Groovy和PHP, 目標是快速Web項目開發, 喧囂了一陣也是歸于沉寂。
在JVM上, Java 是毋庸置疑的老大, Spring 是一座難以撼動的大山, 所以Groovy ***還是把注意力集中到 小工具,測試 以及Build上, 這是它能***發揮能量的地方。
3.Scala 和 Clojure
Scala ***次進入我的視線是一則新聞: Twitter 決定把核心應用從Ruby on Rails 遷移到Scala,作為曾經的Ruby擁躉, 看到這個消息是讓人沮喪的 : Twitter 可是Ruby on Rails 經常拿來宣傳的一個明星系統了, 現在Twitter 竟然想轉到Scala , Scala是什么鬼? 怎么可能獲得Twitter 工程師的青睞?
后來看了一下,Scala是一個很有趣的語言, 在他的官網上寫著“Object-Oriented Meets Functional” , 面向對象遇上了函數式編程 ! 也就是說一門語言混合了兩種編程范型。 不僅如此,它還是一個可以運行在Java 虛擬機上的語言, JVM的成熟和穩定, 可能也是Twitter 工程師選擇Scala的重要原因。
(碼農翻身注: 關于函數式編程, 可以參考《命令式編程 vs 聲明式編程》)
有人說了,我面向對象還沒學完呢, 還學函數式編程? 我推薦你看看《黑客與畫家》一書, 看完以后十有八九會被Paual 自身成功的案例和 富有煽動性的語言給鼓動起來, 熱血沸騰的去嘗試函數式編程語言Lisp(我就是如此) :-)
但是我相信大部分人都只是淺嘗輒止, 因為純函數式編程和我們日常使用的C, Java, Python 這些命令式編程語言大相徑庭, 需要巨大的思維轉變, ***是完全忘掉之前所學的命令式編程才行, 所以學習曲線極為陡峭, 把很多人都嚇回去了。
現在好了, Scala即支持OO, 又支持Functional , 你可以在一個相對舒服的環境漸漸的去嘗試函數式編程的奧妙,確實是不錯的選擇。
如果你非要學習一個純粹的函數式編程語言, 可以考慮Clojure ,這是一個運行在JVM中的lisp方言, 同樣可以和Java 類庫互操作。
4.總結
說了這么多, 如果讓我為一個大型項目選擇語言, 我極有可能還是要選擇Java, 對于一個大型項目來說, 代碼的可讀性、可維護性是非常重要的,我之前讀一些動態語言的代碼, 看到一個變量而不知道它的類型,沒法查看它的行為, 這是非常令人抓狂的體驗。
而Java 這種靜態類型的語言,IDE的感知能力, 安全重構的能力是極為重要的, 讓人覺得安全,可控,適合大團隊協作。
【本文為51CTO專欄作者“劉欣”的原創稿件,轉載請通過作者微信公眾號coderising獲取授權】