自从 JRuby 1.6 系列的首个版本发布以来已经过去了一年多的时间,现在 JRuby 1.7.0 的首个预览版也已经发布了。
JRuby 1.6 是首个兼容于 Ruby 1.9.2 的版本,借助于 JRuby 1.7,Ruby 1.9 甚至已经成为了默认的运行时模式。在此次发布声明中,其他值得关注的变化有:
- 修复了众多 1.9.x 的兼容性问题
- 支持 Java 7 的 invokedynamic
- 性能与并发的改进
- 放弃了对 Java 5 的支持(需要使用 Java 6+)
- 更新到 Rubygems 1.8.24
- 更新到 Rake 0.9.2.2
对 invokedynamic 的支持是自动开启的,但为了能够充分利用这一点,你需要在最新发布的 Java 7 上运行。InfoQ 有幸采访到了Charles Nutter以深入了解 JRuby 是如何从对 invokedynamic 的支持上获益的:
JRuby 对 invokedynamic 的使用使得我们更加接近于这一目标:让 Ruby 达到 Java 一样的运行速度。由于现在 JVM 能够清楚地理解我们是如何进行动态调用的,因此它可以对这些动态调用进行优化,就像对常规的静态类型调用所做的那样。突然间,那些使得 Java 运行速度加快的小技巧都能够应用到普通的老式 Ruby 代码上了。这真是太奇妙了。 无论是 JRuby 还是 JVM 都有很多尚未挖掘出的潜力。目前 JRuby 对 invokedynamic 的使用尚未达到 100% 的优化程度,在某些情况下存在一些不必要的浪费会导致其运行速度变慢。既然我们已经可以使用 invokedynamic,那么我们就可以将精力放在改进对其的使用上。JVM(特别是 Hotspot)还能为我们带来更大的帮助。最初的 Java 7 发布并未很好地优化 invokedynamic,但这是功能性的。Update 2 为我们带来了可靠的 JVM JIT 支持以及对服务端编译的优化。Update 6 应该会对 JIT 逻辑进行重写,使得完整的 JVM 优化集合能够更加轻松地应用到 invokedynamic 调用上。
我们将会继续与 Hotspot 开发人员合作以确保 invokedynamic 能够持续得到改进。
InfoQ:目前的 JRuby 是最快的 Ruby 实现么?
我觉得最终我们可以这么说。总会存在一些情况是我们没有处理的,或是需要未来的 JVM 改进支持的,但一般来说,JRuby 总是要比其他的 Ruby 实现快一些。随着在 JRuby 与 OpenJDK 上 invokedynamic 工作的不断进行,我们会走得更远。
InfoQ:Fibers 怎么样了,我听坊间传闻 Java 8 将会对协程提供一些支持。你了解么?
很遗憾,协程并不会添加到 Java 8 中,但可能会添加到 Java 9 中。为了降低 JRuby Fiber 实现的代价,我们现在正与 Google 代码之夏的一个学生一同探索基于 Kilim 的实现。但我们也不知道付出的努力是否能够成功,但他已经取得了一些进展。
InfoQ:Tom Enebo 与你从 Engine Yard 来到了 Red Hat ,可你还是在继续从事 JRuby 的工作。你还打算从事 Red Hat 自己的 JVM 语言 Ceylon 的开发么?
一切皆有可能!我对自己的这个转变感到兴奋异常,因为我的工作除了继续开发 JRuby 外,还会探索其他的 JVM 语言以及 JVM 对其的支持。我完全相信对于语言来说,JVM 是最棒的运行时,无论这些语言是静态还是动态的;现在,我就会证明给大家看。
InfoQ:感谢你能接受我们的采访!
感兴趣的读者可以从 JRuby 网站上下载 preview1 版,如果使用的是 RVM ,那么你可以通过 rvm install jruby-1.7.0.preview1 安装。
查看英文原文: JRuby 1.7 Preview 1 Released: Defaults to 1.9 and Improves Performance With Invokedynamic
评论