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)都是现代面向对象的脚本语言。它们将脚本语言的精心选择的简洁性与用于构建大型程序的良好稳固结构相结合。因此,它们既适用于经典脚本,也适用于编写大型程序。两者都对动态类型检查感到满意,尽管 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 是您可以在许多其他地方使用的工具。作为一名长期 Ruby 程序员,我个人没有太多动力去深入研究 Groovy,即使我实际上非常喜欢我所见过的这种语言。
Rails 是一个重要因素。Java 世界并不缺乏 Web 框架,但 Rails 受到使用过它的人的广泛喜爱。我还没有收到关于 Grails(Groovy 的仿制品)的太多报告,因此无法对此给出明确的意见。但我可以想象,能够使用 Rails 部署 Web 应用程序可能是使 JRuby 普及的一个主要因素。另一个需要关注的是 RSpec 作为测试环境的新方向的增长。
对于任何平台,考虑社区中的人员与任何技术因素一样重要。优秀的人员可以迅速克服技术弱点,而充满活力的社区是重大创新的强大源泉。RubyPeople 已经形成了一个特别强大的社区,它已经催生了 Rails、Rake 和 Rspec 等事物。
这两种语言对 Java 重要吗?毕竟,Jython 已经存在很长时间了,但对 JVM 的影响并不大。坦率地说,与您目前在 Java 中拥有的工具支持相比,这些语言中的任何一种的工具支持都非常糟糕。
我认为我们实际上正处于 Java 的一个拐点。直到最近,Java 的口号一直是“一个 VM 和一种语言”。(与从“一个 VM 和多种语言”开始的 CLR 相反 - 只要它们是 C# 或 VB。)随着人们意识到 Java 的局限性并开始寻求不同的功能,这种情况似乎正在改变。未来很可能看到多种语言紧密集成在 JVM 中。
很多人不喜欢围绕 Rails 和 Ruby 的炒作。但即使你不喜欢 Ruby,炒作也导致了人们对新语言的兴趣重新燃起。我怀疑如果没有这种炒作,Groovy 的兴趣不会像现在这样大,Jython 也就不会从沉睡中醒来。ruby/rails 的炒作也引起了人们对其他奇特的 JVM 语言的兴趣。这里真正令人高兴的是,JRuby 人们一直在鼓励他们的动态竞争对手 - 认识到这里的重点是鼓励多语言互操作性和创新。