作者都是各自领域经过审查的专家,并撰写他们有经验的主题. 我们所有的内容都经过同行评审,并由同一领域的Toptal专家验证.
瑞恩·威尔科克斯的头像

Ryan Wilcox

Ryan拥有超过12年的多种语言编程经验,是工作流分析和优化方面的专家.

Previously At

Green River
Share

Introduction

Just as there are 许多深浅不一的红宝石, Ruby解释器有多种实现.

最常用的Ruby解释器是参考实现, Ruby MRI,由Ruby的创建者(Yukihiro Matsumoto)和Ruby核心团队用C语言开发.

Our Ruby on Rails Hiring Guide 提到Rails中的一些缺点可以通过使用替代的Ruby解释器来解决或避免. 本文展示了目前可用的各种现有Ruby解释器实现和运行时, 讨论各自的优点和缺点.

Ruby解释器和运行时列表,包括mruby、JRuby、RubyMotion、Rubinius和Ruby MRI

Ruby版本历史(以及它如何影响替代实现)

可悲的是,没有等同的 Python Language Reference for Ruby (ISO/IEC 30170:2012 describes Ruby 1.8 / Ruby 1.但是Ruby 2没有相应的规范.x). 在没有此类语言规范的情况下, Ruby实现者通常依赖于社区驱动 RubySpec 它通过可以在任何Ruby解释器中运行的测试指定Ruby语言的预期行为. 因此Ruby实现者使用RubySpec来验证他们的Ruby实现与事实标准的行为遵从性.

由于缺乏正式的规范, Ruby的新版本通常只是与Ruby MRI的新版本相对应. 值得注意的是,有一个 open issue 讨论了将Ruby(语言)与Ruby MRI解耦的设计过程.

给定当前的紧密耦合, though, Ruby语言和MRI参考实现之间的差异, 替代Ruby实现的开发人员有时很难跟上每一个新的MRI版本中引入的语言变化.

从没有比Ruby 1和Ruby 2之间的转换更困难的了.8 and Ruby 1.9. In 2007, 为了清理和巩固Ruby的语法(因为该语言自Ruby 1以来已经发展了十年).Ruby的核心团队发布了Ruby 1.9.0,这个版本引入了 many 语言的向后不兼容性. As a result, 并不是所有的Ruby实现都投入了必要的精力来实现从1.8 to 1.9. 因此,有几个1.社区不再使用的基于8的Ruby实现, 但你仍然可以在网上找到它,或者被Ruby老手谈论过.

Ruby MRI的新版本遵循语义版本控制原则,每年圣诞节都会发布. Ruby 2.0 (released 2013) and 2.1(2014年发布)每个版本都引入了额外的语言特性 Ruby developers 可以在不丧失与Ruby 1的向后兼容性的情况下利用.9.

为什么要使用另一种Ruby实现? What’s wrong with MRI?

有多种可选的Ruby实现, 支持广泛的用例和环境. Java企业环境. Mobile applications. JavaScript implementations. Low CPU/RAM machines. 除了支持这些用例之外, 替代实现有时也可以提供额外的速度提升或更有效的内存利用, 这取决于应用程序的特性.

For a long time many Ruby on Rails developers used Ruby企业版(REE) instead of MRI, 利用了REE中比当时的MRI版本更好的内存管理技术. (REE随后于2012年停产.)

而MRI是默认的Ruby实现, 它不一定是所有环境和场景的正确选择. 例如,MRI的并发支持不如JRuby或Rubinius. Also, 尽管MRI的内存和垃圾收集方案在不断改进, 他们仍然存在一些问题.

下面对Ruby实现的调查旨在帮助您选择最适合项目操作目标和约束的解释器.

Matz的Ruby解释器(MRI) / CRuby

由Yukihiro Matsumoto(“Matz”)领导的Ruby核心团队用C语言编写。, the creator of Ruby), MRI是Ruby的参考实现,作为事实上的标准. 如果操作系统供应商将Ruby版本作为操作系统安装软件的一部分, for example, 通常是核磁共振成像. 与其他Ruby实现相比,MRI受益于更多的付费核心团队成员, 以及想要改进Ruby生态系统的个人或公司贡献的资源.

Ruby MRI的新版本——经常实现新的语言特性, 除了标准的库更改之外-每年圣诞节都会发布. 特性首先在Ruby MRI中实现,通常基于对 Ruby核心开发者邮件列表. 其他Ruby实现落后,在某些情况下甚至落后数年.

JRuby

JRuby 一个版本的Ruby是在 Java Virtual Machine (JVM). 随着Java以外的语言在JVM上运行变得越来越流行(我正在寻找您的方向), Clojure and Scala),基于jvm的Ruby实现可能会越来越受欢迎.

JVM中的Ruby也意味着Ruby可以在任何Java可以运行的地方运行(比如Android手机) Ruboto for example). Additionally, 多亏了JVM的互操作性, JRuby代码可以利用Java平台, 包括标准库和第三方库.

JRuby对于将基于rails的解决方案引入纯java部署环境也很有用, 将Rails应用程序打包为 .war file to deploy to a Tomcat 容器,或者作为web前端的一部分运行的Java applet.

对于那些不习惯JVM的人, though, JRuby带来了标准的jvm相关问题,比如Ruby解释器启动缓慢, 如果您正在使用第三方Java库,则可以调试CLASSPATH问题, larger memory usage, 事实上,现在编写代码时需要考虑到线程安全.

此外,Ruby的一些特性(C api)以及Ruby强大的自省工具之一 ObjectSpace 模块)在JRuby中没有实现.

All that said, 对于某些情况或项目,使用JVM的优点可能大于缺点. JVM允许进行许多性能优化, 比如打开JIT编译器, 或者使用原生Java对象和api.

作为一个引人注目的JRuby用例的例子, 我的一位前同事曾经遇到过一个cpu密集型问题,他最初用Ruby 1中的线程解决了这个问题.9.3. 当他切换到JRuby并使用Java的 java.util.concurrent.Executors, 他发现这种操作的性能提高了多个数量级(速度快了数万倍). See his experiment here.

Rubinius

Rubinius 是Ruby的一个实现,它实现了动态语言的通用运行时 低级别虚拟机(LLVM). 使用此基础结构和JIT编译器技术, Rubinius通常可以以比MRI更少的开销运行Ruby代码.

Rubinius还尽可能多地使用Ruby构建,以使解释器/运行时的开发更快、更容易.

有趣的事实:RubySpec最初是在实现Rubinius的过程中产生的.

Like JRuby, Rubinius包含一个JIT编译器, better memory management, 以及比Ruby MRI更成熟的虚拟机. However, unlike JRuby, Rubinius支持Ruby C库,并且Rubinius的基础是用c++编写的, not Java.

当您需要在Rails服务器上实现高性能而又不需要学习曲线或JRuby的其他缺点时,Rubinius可能是一个不错的中间地带.

mruby

mruby 是Ruby的可嵌入版本(支持Ruby 1.9.3). With mruby, 您可以在本机应用程序中提供Ruby作为脚本/自动化语言, use it for game scripting, and even for 单片机编程 boards like the Raspberry Pi.

如果您的平台有严重的资源限制,那么mruby可能就是适合您的Ruby解释器. Mruby还习惯于:

  • 开发iOS应用(作为RubyMotion的竞争对手,下文将讨论)
  • 将Ruby嵌入iOS应用程序,提高开发速度
  • 为最终用户提供用于自动化目的的嵌入式脚本语言

With the Internet of Things 越来越成为现实, 家庭自动化开始崭露头角, 极其便携(且功能相对强大)的电脑变得更加普遍, 需要支持的目标平台正变得越来越多样化. Mruby帮助我们使用与桌面相同的高效语言来实现这一目标.

Opal

Opal is a transpiler 将Ruby转换为JavaScript.

With the rise of Coffeescript,开发人员正在学习他们不必键入JavaScript get JavaScript. 虽然Coffeescript无可否认有其优点, 使用它的时间足够长,你一定会遇到你不喜欢这门语言的地方.

Enter Opal: Type Ruby, get Javascript. Pretty cool.

Opal努力尽可能与其他Ruby实现保持一致,因此也针对RubySpec的一个子集进行了测试. 确实存在一些不兼容性, though, 源于JavaScript和JavaScript运行时的本质. For example, Opal中的字符串和符号是相等的, Opal不提供任何线程或shell执行机制.

Opal独立运行,也可以作为组件的一部分使用 Rails asset pipeline (e.g.,自动编译您的 somefile.js.rb file into JavaScript).

也许您有一个非常适合JavaScript异步并发模式的问题域(比如小型Node).但想要Ruby语言或Ruby空间的某些宝石. 在这种情况下,蛋白石可能是一个很好的解决方案.

或者你想写一个全栈Ruby web应用程序. With Opal, you can. 让一个Ruby解释器运行服务器端Ruby代码,然后让Opal生成JavaScript在客户端运行.

Opal认识到您可能会与其他JavaScript api (DOM,或 Node.js for example). 因此,它可以很容易地转换为JavaScript,并在常见的JavaScript库(如 jQuery.

然而,Opal以javascript为中心的特性既是它的优点,也是它的缺点. 缺点是,Opal的运行时是JavaScript运行时,Opal是由 JavaScript design decisions. 因此,如果您正在寻找一个好的Ruby实现来编写一个小的shell脚本, 或者为你的Rails应用寻找一个更好的Ruby运行时, 蛋白石可能不是你最好的选择.

RubyMotion

RubyMotion 都是(a) Ruby实现(使用Objective-C和 Cocoa(b)一组语言绑定,以便开发人员可以通过Ruby访问Cocoa api.

RubyMotion是一个商业产品,可以让你用Ruby编写Cocoa原生应用. RubyMotion 2.0允许你用Ruby编写iOS和Mac OS X应用程序, 而RubyMotion 3承诺将为Android带来同样的支持.

RubyMotion实现版本1.9 of the Ruby language.

Defunct Implementations

从Ruby第一次被引入到现在, 一些已经出现的Ruby实现已经被放弃或终止了, such as:

  • Ruby企业版(REE). REE was a fork of MRI 1.8 from the folks at Phusion Passenger 它为web开发人员实现了许多内存和垃圾收集方面的改进. 几年来,它一直是为Rails生产站点部署的默认Ruby实现. 它从未针对Ruby 1进行过更新.9 or Ruby 2.不过,该项目最终于2012年停产.
  • IronRuby. IronRuby是在Microsoft之上实现的Ruby .NET,用c#编写,有一段时间这个项目是由微软资助的. IronRuby最后一次支持Ruby 1是在2011年被抛弃的.8.6.

Wrap-up

Ruby环境中有各种各样的运行时和解释器可供选择. For most Ruby projects, Ruby参考实现(Ruby MRI)仍然是解释器的首选. However, 其他Ruby实现可能是您项目的正确选择, 这取决于您的功能和技术目标以及限制.

作为Ruby的参考实现, 核磁共振成像更快地获得新的语言特征, has good enough concurrency 记忆故事(只会越来越好), 并且与gems具有最广泛的兼容性(有些部分是用C编写的). 总而言之,对于通用Ruby代码来说,MRI是一个可靠的选择.

For larger, enterprise deployments, 或者用于需要与Java代码(或其他JVM语言)交互或需要高度发展的并发模式的情况, JRuby是一个引人注目的选择.

当然,如果你有独特的需求(例如.g., writing JavaScript, 运行在当前一代的嵌入式设备上, and so on), 其他Ruby替代品可能正是您正在寻找的.

有各种各样的Ruby运行时和解释器可供选择, Ruby显示出它是一种灵活的语言, 适用于各种计算环境, 从公司的大型Java部署商店, 到控制你办公室红绿灯的软件,上周你把树莓派挂在上面了. 为正确的目的选择正确的工具是至关重要的, yes, 但希望这篇文章已经向您展示了Ruby远不止操作系统自带的默认Ruby解释器.

Ruby的世界被其他Ruby实现团队与核心Ruby MRI团队合作极大地增强了,因为有人提出了对语言的更改. 它们为Ruby实现社区增加了多样性, 加上他们来之不易的Ruby实现经验,以及他们对语言特性的看法. Ruby爱好者集体对这些团队感激不尽. 他们的努力值得称赞!

就这一主题咨询作者或专家.
Schedule a call
瑞恩·威尔科克斯的头像
Ryan Wilcox

Located in 哈特福德,康涅狄格州,美国

Member since April 4, 2016

About the author

Ryan拥有超过12年的多种语言编程经验,是工作流分析和优化方面的专家.

Toptal作者都是各自领域经过审查的专家,并撰写他们有经验的主题. 我们所有的内容都经过同行评审,并由同一领域的Toptal专家验证.

Previously At

Green River

世界级的文章,每周发一次.

订阅意味着同意我们的 privacy policy

世界级的文章,每周发一次.

订阅意味着同意我们的 privacy policy

Toptal Developers

Join the Toptal® community.