【问题标题】:MRI and YARV Ruby implementations - what happened in Ruby 1.9?MRI 和 YARV Ruby 实现 - 在 Ruby 1.9 中发生了什么?
【发布时间】:2017-06-16 14:09:02
【问题描述】:

据我了解,在 Ruby 1.9 之前,MRI 和 YARV 是 Ruby 编程语言的两个独立实现。

Ruby 1.9 版到底发生了什么变化? MRI 是否被 YARV 所取代?还是这两个代码库以某种方式合并了?

我看到 Ruby 1.9 之后的版本同时被称为“MRI”和“YARV”——这些名称中哪一个是正确的(或者它们都是正确的)?

【问题讨论】:

标签: ruby terminology mri yarv


【解决方案1】:

据我了解,在 Ruby 1.9 之前,MRI 和 YARV 是 Ruby 编程语言的两个独立实现。

这只是对了一半。

MRI 和 YARV 确实是 Ruby 编程语言的两个独立实现。

但是,在“Ruby 1.9 之前”谈论 YARV 是没有意义的。 YARV 只实现了 Ruby 1.9,YARV 是 Ruby 1.9 的第一个实现。 Ruby 1.9 之前没有 YARV,YARV 之前没有 Ruby 1.9。

Ruby 1.9 版到底发生了什么变化? MRI 被 YARV 取代了吗?还是这两个代码库以某种方式合并了?

YARV 只实现了 Ruby 1.9,它没有实现 Ruby 1.8。 MRI 只实现了 Ruby 直到 Ruby 1.8(包括 Ruby 1.8),它没有实现 Ruby 1.9。因此,当 Ruby 1.8 消失时,MRI 也消失了。

YARV确实重用了 MRI 的解析器,尽管有明显的删除、更改和添加使 Ruby 1.9 的语法与 Ruby 1.8 不同。 (事实证明,Ruby 的语法非常复杂,而且可悲地没有明确说明,以至于几乎所有 Ruby 实现都以某种方式重用了 MRI 的解析器。例如,JRuby 的当前解析器一开始是手动逐行移植MRI 的。Rubinius 经历了许多不同的解析器,所有这些解析器都是从 MRI 派生的。IronRuby 使用 Microsoft 从 Ruby.NET 创建者那里获得许可的解析器,该解析器又是从 MRI 的parse.y 生成的。等等......)

我看到 Ruby 1.9 之后的版本同时被称为“MRI”和“YARV”——这些名称中哪一个是正确的(或者它们都是正确的)?

都没有。

MRI 和 YARV 都不是 Ruby 的版本。它们是 Ruby 的实现。 MRI 从未实现过 Ruby 1.9,只有 YARV、IronRuby、MacRuby、JRuby、Rubinius、Opal、Topaz、TruffleRuby、Ruby+OMR、HotRuby、unholy 和 MRuby 实现了 Ruby 1.9 或更高版本。 (我不确定 MagLev,我认为(废弃的)2.0 版本实现了 Ruby 1.9。)

人们确实有时将 YARV(Yet Another Ruby VM)称为“MRI”(Matz 的 {Ruby | Reference} {Implementation | Interpreter}),但这是错误的:YARV 是由 Koichi 编写的“ ko1" Sasada,而不是 Yukihiro "matz" Matsumoto,所以它只是不是“Matz 的 Ruby 实现”。 Matz 当前的 Ruby 实现是 MRuby,它是 ISO Ruby 编程语言规范的一个实现。

【讨论】:

  • 那么,Ruby 1.8 及更早版本的参考实现是MRI,而Ruby 1.9 及更高版本的参考实现是YARV?使用“MRI”一词来指代 Ruby 2.4 的参考实现的人说错了吗?
【解决方案2】:

YARV 不是 Ruby 的单独实现。它是 Ruby 的虚拟机,或又一个虚拟机。当 Ruby 被解释时,它被编译成YARV instructions

MRI 是 C 语言中 Ruby 的 Matz 实现,它是规范的实现。第二个最常用的可能是 JRuby,它不使用 YARV,因为它最终使用 Java 虚拟机,因此编译为 Java 字节码。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-06
  • 1970-01-01
  • 1970-01-01
  • 2021-12-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多