关于 Ruby 解释器:一些你需要知道的

原文:Ruby Interpreters: What You Need to Know

使用正确的 Ruby 解释器来运行程序可以发挥重要作用,不幸的是很难找到关于不同 Ruby 解释器选择的文章,或者如何选择正确的解释器。

下面我们在 Ruby 中汇编了大量有关解释器的内容,即使你在这篇文章开始时问到 “什么是Ruby解释器?”,你仍将了解做出正确决策所需知识。

什么是解释器? 编译和解释编程语言

语言是沟通的基础,它们由一组标准的词汇、语法和语法组成,两人同意交换信息。但是,当两个人不说同一种语言时,您需要一种方法将相同的想法从一种语言翻译或解释成另外一种。

翻译和解释的概念也同样适用于编程,机器无法自己理解人类编程产出的的高级代码,它们只能执行机器码,这是计算机 CPU 可以立即理解的一组有限的低级指令。

机器有两种运行编程语言的方法,比如 Ruby:编译和解释

编译型语言需要一个称为编译器的工具,在用户运行程序之前,编译器必须将高级代码转换为一系列低级指令,此机器代码特定于运行程序的机器。

解释型编程语言需要一个称为解释器的工具,在程序运行时,解释器逐行将源代码转换为机器代码。

这种差异就像翻译和口译外语之间的区别,翻译人员会在需要翻译人员使用之前提前完成工作。口译员现场进行翻译,而需要的人现场倾听。

编译型语言和解释型语言都有其优点和缺点,某些语言(如 Java)使用两种方法混合。通常解释型语言更灵活,对不同系统更具可移植性,并且更易于调试。但他们通过牺牲速度和性能来为这些优势付出代价。

编译型语言通常比解释语言更快,这是因为编译器有时间优化运行程序的特定机器的代码。

虽然 Ruby 经常被解释,但它其实也可以根据语言实现进行解释和编译,在本文的其余部分,我们将仅讨论 Ruby 的解释器。

什么是 Ruby 解释器?

Ruby 解释器是能够解释用 Ruby 语言编写的源代码的程序。

就像可以让不同的人来翻译或口译一样,这不是一个单一版本的 Ruby 解释器。

相反,Ruby 开发人员有多个解释器选择。每个版本赋予语言略有不同的 “味道”。

那么你怎么能确定你使用的解释器实际上运行的是 “真正的” Ruby?

通过使用 Ruby Spec Suite (也称为 ruby/spec),Ruby Spec Suite 是一组测试,用于在解释程序时验证给定的 Ruby 实现是否具有正确的行为和结果。

Ruby 解释器选择:YARV, Ruby MRI, JRuby, and Rubinius

下面,我们将讨论 Ruby 解释器最流行的替代方案:YARV,Ruby MRI / CRuby,JRuby 和 Rubinius,下面的所有解释器都通过了 Ruby Spec Suite,是运行 Ruby 代码的可靠、成熟的选择。

YARV

YARV (Yet Another Ruby VM) 是基于堆栈的解释器技术,为 Ruby 的官方解释器提供支持。从Ruby 1.9 版开始,YARV 取代了旧版本的 Ruby MRI(也称为 CRuby);从 Ruby 2.6 开始,YARV 即是 Ruby 的官方解释器。

当您运行 Ruby 程序时,YARV 会将代码转换为可在 Ruby 虚拟机(VM)中运行的有限指令集。 VM 是在您的计算机上运行的程序,它模拟独立的计算机以具有更好的可预测性和稳定性。这可确保所有计算机都可以运行 Ruby,无论他们使用哪种特定的机器码。

Ruby MRI/CRuby

在 YARV 版本在 Ruby 1.9 之前,默认的 Ruby 解释器是 Ruby MRI,也称为 CRuby。 Ruby MRI 代表着 Matz 的 Ruby Interpreter(以“Matz”命名,或者是 Ruby 的首席设计师 Yukihiro Matsumoto 松本行弘)。

替代名称 CRuby 反映了解释器采用 C 编程语言的事实。 CRuby 与 YARV 的不同之处在于:YARV 使用堆栈来解析 Ruby 代码,而 CRuby 使用抽象语法树

JRuby

正如 CRuby 在 C 语言中一样,JRuby 是 Java 编程语言中的 Ruby 解释器。 JRuby 遵循其他在 Java 虚拟机(JVM)上运行的编程语言的脚步,例如 Clojure 和 Scala

因为 JRuby 使用 JVM,所以您可以在任何可以运行 Java 程序的地方运行 Ruby 程序,从笔记本电脑到 Android 手机。 JRuby 还可以利用 Java 标准和三方库。

Rubinius

Rubinius 试图将 Ruby 程序解释为尽可能少的 C 代码,区别于 Ruby MRI / CRuby。 Rubinius 的基础是 C++,而其他部分使用尽可能多的 Ruby 代码。

Rubinius 包含一个 “Just In Time”(JIT)编译器,它在程序运行时编译代码,帮助它更加动态地运行,这使其在内存管理和速度方面比 Ruby MRI 有所改进。

你应该使用哪个 Ruby 解释器?

Ruby 解释器使用是一个开放式问题,取决于你的具体情况。

⚠️(非原文)

总的来说重视性能性能用Rubinius或JRuby,默认使用YARV。未来YARV的性能也会提升,本质是单线程改为多线程。

如果您已经安装了 Ruby 的默认版本,那么您几乎肯定会使用 YARV(如果是 Ruby 1.9 及更高版本)或 Ruby MRI(如果是Ruby 1.8 及更低版本)。在许多情况下,这个默认选择足以满足 Ruby 开发人员的需求。

但是,如果您的 Ruby 程序具有高性能要求,Rubinius 或 JRuby 可能会更好。根据一项基准测试,Rubinius 和 JRuby 的性能大约是 Ruby MRI 的两倍。

Ruby 解释器使用的另一个考虑因素是线程和并行性问题。 Ruby MRI 使用称为全局解释器锁(GIL)。 GIL 可防止多个程序线程同时访问相同的数据。默认情况下,Ruby 是单线程的,不允许并行和多线程。

但是,这种限制在 Ruby 解释器的其他实现中不存在,例如 Rubinius 和 JRuby,你可以充分利用多核和多 CPU 系统,显着提升性能。

好消息是,Ruby 团队希望通过一种称为 Guilds 的机制在即将发布的 Ruby 3 版本中绕过GIL的限制。将来你可能会在默认版本的 Ruby 中看到并行和多线程的一些变好的情况。但你必须耐心等待 Ruby 3(目前没有明确发布日期)。

最后

上面列出的替代方案绝不是 Ruby 实现的唯一选择。 mruby 是一个 Ruby 实现,适用于 Raspberry Pi 等嵌入式系统。同时 Opal 是一个将 Ruby 转换为 JavaScript 的编译器。

但是,对于大多数 Ruby 场景,选择以下这些不会错:

默认的 Ruby 实现,YARV 或 Ruby MRI,可能适合许多 Ruby 程序员的需求。它以最快的迭代新的 Ruby 语言功能,并且与不同的 Ruby gems 具有最大的兼容性。但是,它目前缺乏真正的并行,并且速度可能比其他解释器慢。

当你需要在许多不同的系统(包括企业计算机)上运行 Ruby 时,JRuby 是一个很好的选择。 JRuby 还可以轻松地与 Java 代码进行交互。

当需要性能非常高,或者想要并行性时,Rubinius 是一个很好的选择。它还使您能够使用 C 或 C++ 中的代码连接 Ruby。

【转】关于 Ruby 解释器:一些你需要知道的的更多相关文章

  1. PHP程序员应该知道的15个库

    最几年,PHP已经成为最受欢迎的一种有效服务器端编程语言.据2013年发布的一份调查报告显示,PHP语言已经被安装在全球超过2.4亿个网站以及210万台Web服务器之上.PHP代表超文本预处理器,它主 ...

  2. Android 程序员必须知道的 53 个知识点

    1. android 单实例运行方法 我们都知道 Android 平台没有任务管理器,而内部 App 维护者一个 Activity history stack 来实现窗口显示和销毁,对于常规从快捷方式 ...

  3. 程序员必须要知道的Hadoop的一些事实

    程序员必须要知道的Hadoop的一些事实.现如今,Apache Hadoop已经无人不知无人不晓.当年雅虎搜索工程师Doug Cutting开发出这个用以创建分布式计算机环境的开源软...... 1: ...

  4. 【转载】在IT界取得成功应该知道的10件事

     在IT界取得成功应该知道的10件事 2011-08-11 13:31:30 分类: 项目管理 导读:前面大多数文章都是Jack Wallen写的,这是他的新作,看来要成为NB程序员还要不停的自我总结 ...

  5. 理工科应该的知道的C/C++数学计算库(转)

    理工科应该的知道的C/C++数学计算库(转) 作为理工科学生,想必有限元分析.数值计算.三维建模.信号处理.性能分析.仿真分析...这些或多或少与我们常用的软件息息相关,假如有一天你只需要这些大型软件 ...

  6. 你应该知道的10个奇特的 HTML5 单页网站

    网页设计师努力寻找新的方式来展现内容.其中一个大的趋势是单页网站,现在被世界上的一些大的品牌广泛采用,使用它们来为用户提供一个快速,干净和简单的而且​​美丽的网站. 下面是10个令人惊叹的单页 H​​ ...

  7. Git / 程序员需要知道的12个Git高级命令

    众所周知,Git目前已经是分布式版本控制领域的翘楚,围绕着Git形成了完整的生态圈.学习Git,首先当然是学习Git的基本工作流.相比于SVN等传统版本控制系统来说,Git是专为分布式版本控制而生的强 ...

  8. 你应该知道的RPC原理

    你应该知道的RPC原理 在学校期间大家都写过不少程序,比如写个hello world服务类,然后本地调用下,如下所示.这些程序的特点是服务消费方和服务提供方是本地调用关系. 而一旦踏入公司尤其是大型互 ...

  9. 希望早几年知道的5个Unix命令

    原文: http://spin.atomicobject.com/2013/09/09/5-unix-commands/ 希望早几年知道的5个Unix命令 使用*nix系统已经有一段时间了.但是还是有 ...

随机推荐

  1. PHP学习(6)——代码重用与函数编写的一些注意事项

    一个新的项目是这样创建的:它将已有的可重新利用的组件进行组合,并将新的开发难度降低到最小. 代码重用的好处:降低成本.提升可靠性和一致性. 1.使用require()和include()函数 使用一条 ...

  2. day38 各种队列、Event事件、协程、猴子补丁

    1.各种队列 我们已经学习了队列这种存取值的方法,我们以前使用的队列是可以进行进程间通信的(IPC),但是今天学习的这两种队列是不能进行进程间通信的,只能进行线程间的通信 这两种队列分别是先进后出式队 ...

  3. 微信图片上传 wx.Imagechoose

    拍照或从手机相册中选图接口 wx.chooseImage({ count: 1, // 默认9 sizeType: ['original', 'compressed'], // 可以指定是原图还是压缩 ...

  4. Kafka主题体系架构-复制、故障转移和并行处理

    本文讨论了Kafka主题的体系架构,讨论了如何将分区用于故障转移和并行处理. Kafka主题,日志和分区 Kafka将主题存储在日志中.主题日志分为多个分区.Kafka将日志的分区分布在多个服务器或磁 ...

  5. 解决mac启动springboot项目很慢的问题

    1.打开终端输入: hostname 查看电脑名称 2.输入命令修改hosts文件 sudo vi /etc/hosts 3. 在127.0.0.1和::1后边分别增加你的电脑名称 127.0.0.1 ...

  6. 01背包方案数(变种题)Stone game--The Preliminary Contest for ICPC Asia Shanghai 2019

    题意:https://nanti.jisuanke.com/t/41420 给你n个石子的重量,要求满足(Sum<=2*sum<=Sum+min)的方案数,min是你手里的最小值. 思路: ...

  7. AC自动机练习2:修改串

    这道题的话用到了dp,一个比较简单的dp方程 1466: [AC自动机]修改串 poj3691 时间限制: 1 Sec  内存限制: 128 MB提交: 18  解决: 14[提交] [状态] [讨论 ...

  8. Java开源网页抓取工具httpClient以及jsoup

    网上看到不错的Java网页抓取工具和库 先记录一下 使用java开源工具httpClient及jsoup抓取解析网页数据

  9. django初步了解2

    目录 django初步了解2 表的字段增删改查 数据的增删改查 反向解析和分组 路由分发 名称空间 伪静态 虚拟环境 django初步了解2 表的字段增删改查 新增的字段 1.直接提供默认值 defa ...

  10. ccpc湘潭邀请赛 Partial Sum

    选定最多m的区间,使区间和的绝对值最大.但是左右端点不能重复选取 首先涉及到区间和的问题,就应该想到用前缀和去优化 这里对前缀和排序 然后贪心的去选取最大.次大 (比赛的时候脑子堵的很,没想出来 可惜 ...