JRuby on Rails 和 Ruby on Rails 有什么区别?

我想试试 JRuby 和 JRuby on Rails。我很难找到关于 JRuby on Rails 和 Ruby on Rails 之间区别的信息。

我需要注意的差异是什么?

63203 次浏览

大多数情况下应该是一样的。在 jRoR 中你可以访问 RoR 中没有的东西。通常它主要是一个部署问题。

但是,如果您的 RoR 应用程序使用的本机库没有在 JVM 上运行的等效程序,那么这可能是一个痛苦的问题。然而,大多数 lib 都有一个非本地版本(至少是我遇到的流行版本)。

JRuby 是运行在 JVM 上的 Ruby 实现,而 Matz 的 Ruby 是 C 实现。

需要注意的主要特点是:

  1. JRuby 运行在 JavaVM 上,它可以被编译或者解释为 Java 字节码。
  2. JRuby 可以与 Java 代码集成。如果您有 Java 类库(。) ,您可以在 Ruby 代码中引用和使用它们。在另一个方向上,您也可以从 Java 内部调用 JRuby 代码。JRuby 还可以使用 JVM 和应用服务器功能。
  3. JRuby 通常驻留在 Java 应用服务器中,比如 Sun 的 GlassFish,甚至 Tomcat web 服务器。
  4. 虽然不能在 JRuby 中使用本地 Ruby gems,但是大多数流行的 Ruby 库都有 JRuby 实现。

JRuby wiki 上还列出了其他一些不同之处:

我可能错了,但我认为你可以打包一个 JRuby on Rails 应用程序的方式,你不能做到正常的 RoR-看看 Mingle 或类似的。这样就可以不用脱裤子就能卖出去。

也就是说,我对 RoR 包装不够熟悉,所以不要指望我:)

我很惊讶在这个问题的所有答案中都缺少一个关键的东西,那就是 GIL

你应该关心的主要区别。在 web 应用程序中,比如使用 Rails 构建的应用程序,是免费的 真正的并发性(“ GIL”)。当两个线程使用 JRuby 运行时(例如为两个用户请求服务) ,它们能够在一个进程中并发运行,而在 MRI 中,GIL (即使是1.9的本机线程)避免并行执行 Ruby 代码。

对于应用程序开发人员来说,在考虑 JRuby 时首先要记住这一点,因为它确实在 config.threadsafe!中大放异彩,但需要确保代码(以及 gems 代码)是“真正”线程安全的。

这里已经有一些很棒的答案了。

Eebbesen 已经介绍了基础知识,而 kares (他自己!)告诉我们 JRuby 没有 GIL。

我将从一个更实际的角度来添加,我已经在 Ruby on Rails 上启动了应用程序,然后出于性能原因迁移到了 JRuby。

有两个主要的性能优势: 在某些情况下,jRuby 比 Ruby 快(或者曾经) ; 第二,kares 没有提到的 GIL,这使我能够进行多线程处理,这虽然有些棘手,但是解锁了数量级的性能优势。

一个非常大的 RubyonRails 应用程序的移植和运行只需要一个小时,包括 gems 和所有程序。唯一的实际故障是 Java 的正则表达式与 Ruby 的稍有不同。对于 JRuby 来说,这是一个不朽的成就。