Groovy 或 JRuby
2007 年 11 月 28 日
目前對於 Groovy 和 JRuby 作為執行於 Java 虛擬機上的腳本語言的相對優缺點,正展開激烈的辯論。好奇的人想知道,這些語言中哪一種會贏得這場即將到來的語言戰爭?人們想知道要為專案選擇哪一種語言,或要致力學習哪一種語言。
或許首先要指出的是,將這視為這兩匹特定馬匹之間的競賽,可能有點不公平。腳本已經在 JVM 上可用很長一段時間了。Jython,Python 的 Java 實作,已經存在好幾年了。還有許多其他較不為人知的語言,我不敢提及,因為害怕冒犯所有我遺漏的語言。
JRuby 獲得許多關注,是因為 Ruby 語言普遍受到關注,特別是 Rails 周圍的興趣點燃了這種關注。我們看到 Thoughtworks 周圍的 Ruby 和 Rails 工作出現大幅的興趣激增,而 JRuby 增加了一個額外的層面,因為它允許人們使用現有的 Java 基礎架構來部署 Rails 應用程式。
Groovy 獲得關注,是因為它比任何其他語言更適合與 JVM 無縫運作,並且從早期 JSR 獲得許多關注。
就我個人而言,幾年前當 Groovy 的開發似乎陷入困境時,我就把它從我的雷達中刪除了。隨著它的 1.0 版本發布,以及一些同事進一步發出正面的積極訊息,我開始再次關注它。
讓我們從談論相似之處開始。JRuby 和 Groovy(當然還有 Jython)都是現代的 OO 腳本語言。它們結合了腳本語言精心選擇的簡潔性,以及用於建構較大型程式碼的良好穩固結構。因此,它們既適合傳統腳本,也適合撰寫較大型程式碼。兩者都樂於使用動態類型檢查,儘管 Groovy 也提供了一些靜態功能。兩者都支援 Lambda,這是人們希望從這種語言獲得更強表達力的重要功能。
它們之間最大的差異在於其較廣泛的平台哲學。Groovy 被設計為 Java 的腳本語言。它的語法盡可能嘗試與 Java 中的等效語法相符。(包括像 switch 陳述式中的預設穿透等醜陋事物。)它也直接與 Java 的類別庫一起運作,儘管它動態地將許多方法新增到 Java 的類別中,這對於利用封閉等事物至關重要。
然而,JRuby 是 Ruby 平台的 Java 實作。Ruby 可以直接在具有 C 執行時期的主流作業系統上執行,並開始在 .NET 的 CLR 上執行。當您使用 JRuby 進行程式設計時,您主要使用以 Java 實作的 Ruby 函式庫,並且也可以自行決定使用 Java 的函式庫。如果您堅持使用 Ruby 的函式庫,或至少包裝任何外來元素,您可以在 C、Java 或(未來).NET 執行時期上執行 Ruby 程式。因此,您可以使用 JRuby 在 JVM 上執行 Ruby 程式,也可以將其作為編寫 JVM 腳本的語言。
JRuby 和 Jython 之間最大的差異之一在於函式庫。將這類型的腳本語言移植到 JVM 的棘手面向之一,就是這些語言通常與以 C 實作的函式庫緊密結合。將這些函式庫移植到 Java 中涉及以 Java 重新撰寫函式庫。Jython 沒有執行太多這類動作,因此許多 Python 應用程式無法在 Jython 中執行。然而,JRuby 的實作人員從一開始就決定他們的目標是執行 Rails 應用程式,因此需要移植許多函式庫,包括所有 Ruby 標準函式庫。
JRuby 是 JVM 上的 Ruby 平台,這表示在 JRuby 中您有兩種物件 - JRuby 物件和 Java 物件。儘管有方法讓這兩種物件彼此對話和轉換,但仍有差異。有時您需要知道您處理的是 Java 字串還是 JRuby 字串。使用 Groovy 時您沒有這樣的界線,只有 Java 物件。
要說哪一種語言會勝出還為時過早,或更確切地說,還太困難。這兩種語言都相當年輕,才剛在 JVM 上站穩腳步。在更個人的層面上,您的選擇與您預期如何使用它有很大關係。如果您只對在 JVM 上執行有興趣,那麼 Groovy 很可能是較容易的選擇。您直接使用 Java 的函式庫和物件模型,而且語法需要較少的適應時間。偏好 Ruby 的一個強而有力的原因是它存在於多種實作中。Ruby 是您可以在許多其他地方使用的工具。作為一個長期的 Rubyist,儘管我從所見中非常喜歡 Groovy 這門語言,但對我個人而言,並沒有太大的誘因讓我深入研究 Groovy。
Rails 是個重要的因素。Java 世界並非缺乏 Web 框架,但 Rails 廣受使用過它的人喜愛。我還沒有收到太多關於 Grails(Groovy 的仿冒品)的報告,因此無法對此發表明確的意見。但我可以想像,使用 Rails 部署 Web 應用程式的能力可能是讓 JRuby 廣受歡迎的主要因素。另一個值得關注的是 RSpec 作為測試環境的新轉折而成長。
對於任何平台而言,考量社群中參與的人員與任何技術因素一樣重要。優秀的人員可以快速克服技術上的弱點,而一個充滿活力的社群是重大創新的有力來源。RubyPeople 已經形成一個特別強大的社群,並已衍生出 Rails、Rake 和 Rspec 等事物。
這對 Java 來說是否重要?畢竟 Jython 已經存在很長一段時間了,卻未對 JVM 造成重大影響。坦白說,與目前 Java 的工具支援相比,這些語言的工具支援相當可憐。
我認為我們實際上正處於 Java 的轉捩點。直到最近,Java 的口號都是「一個 VM」和「一種語言」。(與 CLR 相反,CLR 一開始的口號是「一個 VM」和「多種語言」,只要是 C# 或 VB 即可。)隨著人們意識到 Java 的限制並開始尋求不同的功能,這似乎正在改變。未來很可能會看到多種語言緊密整合在 JVM 中。
有很多人不喜歡 Rails 和 Ruby 周圍的炒作。但即使你不喜歡 Ruby,炒作也導致了人們對新語言的興趣重新燃起。我懷疑如果沒有這股炒作,Groovy 的興趣會像現在這麼大,Jython 也不會從沉睡中甦醒。Ruby/Rails 的炒作也引起了人們對其他異國 JVM 語言的興趣。這裡真正好的事情是 JRuby 人員一直在鼓勵他們的動態競爭對手,認識到此處的重點是鼓勵多語言互操作性和創新。