1

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

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

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

4

2 回答 2

5

据我了解,在 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 使用微软从 Ruby.NET 创建者那里获得许可的解析器,而后者又是从 MRI 生成的parse.y。等等......)

我见过 1.9 之后的 Ruby 版本被称为“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 编程语言规范的一个实现。

于 2017-06-16T23:33:03.233 回答
2

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

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

于 2017-06-16T16:17:32.317 回答