JRuby 9.2.9.0 发布,Java 的 Ruby 解释器

JRuby 9.2.9.0 发布,Java 的 Ruby 解释器。JRuby 9.2.9.0 发布了,JRuby 是面向 Ruby、基于 Java
虚拟机(JVM)的一种解释程序,它结合了 Ruby 语言的简易性和功能强大的 JVM
执行机制,并与 Java 库全面集成。

JRuby
1.7最显著的变化就是使用Ruby1.9.3作为默认运行模式,当然它仍然支持1.8.7.
从以下发布说明上看,尽管JRuby
1.7修复了很多与1.9不兼容的问题,但仍未完全支持Ruby 1.9的 所有特性。

自从JRuby
1.6系列的首个版本发布以来已经过去了一年多的时间,现在JRuby
1.7.0的首个预览版也已经发布了。

JRuby 9.2.x 与 Ruby 2.5.x 兼容,并与 C Ruby 保持同步。

“虽然JRuby
1.7对1.9的某些特性还不支持,比如Ripper,但已经可以稳定地在1.9模式中运行产品应用程序了。在可预见的未来,我们会每隔2到3周发布一个1.7.x补丁包,这些补丁将会解决用户向我们报告的问题以及那些尚未完成的1.9的库。”

JRuby 1.6是首个兼容于Ruby 1.9.2的版本,借助于JRuby 1.7,Ruby
1.9甚至已经成为了默认的运行时模式。在此次发布声明中,其他值得关注的变化有:

此版本主要更新内容包括:

JRuby 1.7不再继续支持Java 5,同时Rubygems和Rake的相应版本也更新到1.8.24
和0.9.2.2。

  • 修复了众多1.9.x的兼容性问题
  • 支持Java 7的invokedynamic
  • 性能与并发的改进
  • 放弃了对Java 5的支持(需要使用Java 6+)
  • 更新到Rubygems 1.8.24
  • 更新到Rake 0.9.2.2

Ruby Standard Library

  • Ruby 标准库已更新为 Ruby
    2.5.7 (#5917)
  • RubyGems 已更新至版本 2.7.10

JRuby1.7能使用Java 7
的invokedynamic功能,但和第一个预览版不同,此功能现在默认为关闭状态。详细原因可见JRuby
wiki:

对invokedynamic的支持是自动开启的,但为了能够充分利用这一点,你需要在最新发布的Java
7上运行。InfoQ有幸采访到了Charles
Nutter
以深入了解JRuby是如何从对invokedynamic的支持上获益的:

Security Updates

  • 此版本删除了 rdoc 库使用的可用版本的 JQuery

“OpenJDK7的现有版本有时会发生错误或者无法优化代码。为了提供一致的JRuby体验,在Java
7中将默认关闭invokedynamic功能。

对于那些没有出现运行错误或者性能降低的应用,我们推荐开启invokedynamic功能以获得最大性能。可以通过强制传递以下参数
“Xcompile.invokedynamic=true”给JRuby(或者添加到JRUBY_OPTS里),或者在Java虚拟机层面设置
“jruby.compile.invokedynamic=true” 参数来开启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能够持续得到改进。

Java Modules Support

  • 在此发行版中,通过在尝试从该模块中的类反映之前检查开放性,可以更好地支持
    Java 模块。这将减少 Java 9+ 上模块警告的数量,并使配置 JVM
    更加容易,以向 JRuby 应用程序打开适当的模块和软件包。
    (#5841, 5832, #5843, #5855, #5860)

在Java 8 builds 的Java虚拟机中invokedynamic功能默认是开启的。

InfoQ:目前的JRuby是最快的Ruby实现么?

Java Launcher Improvements

  • 现在可以将 JVM 选项添加到全局或应用程序本地 .jruby.java_opts
    文件中,并由 JRuby 启动器自动处理。注意:JRuby
    本机启动程序尚不支持此功能,默认情况下,该功能安装在 RVM
    中。开发团队将尽快发布对本机启动器的更新。(#5824, #5826)
  • 现在可以将 –environment 传递给 JRuby
    启动器,以获取有关如何执行应用程序的确切日志。(#5840)
  • JRuby 的开发模式(通过 –dev 标志)为 Java 9+ 和 OpenJ9 JVM
    添加了其他选项。在 OpenJ9 上,-Xquickstart 和 -Xshareclasses
    标志是通过 OPENJ9_JAVA_OPTIONS
    环境变量传递的。(#5831)

其他大量更新内容可见更新说明。

下载地址:

(文/开源中国)    

您是否已经尝试过在JRuby1.7中开启invokedynamic功能?
您的应用的性能有了多少提升?

我觉得最终我们可以这么说。总会存在一些情况是我们没有处理的,或是需要未来的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安装。