【发布时间】:2026-02-15 17:30:02
【问题描述】:
它是语言解释器吗?还是字节码解释器/JIT 编译器?我在哪里可以了解更多关于实现的信息(除了浏览源代码)?
【问题讨论】:
标签: ruby implementation interpreter
它是语言解释器吗?还是字节码解释器/JIT 编译器?我在哪里可以了解更多关于实现的信息(除了浏览源代码)?
【问题讨论】:
标签: ruby implementation interpreter
注意:“MRI”一词令人困惑。它的意思是“Matz 的 Ruby/参考实现/解释器”。但是,MRI 已经退役,不再开发或维护。
MRI 是一个纯 AST-walking 解释器,不涉及任何编译。
令人困惑的是:Matz 编写了一个新的实现,但它叫做 MRuby,而不是 MRI。而现在称为 MRI 的实现并不是由 Matz 编写的。因此,实际上,最好根本不使用该术语,并具体说明您正在谈论的实现。
现在人们称之为 MRI 的实现名称实际上是 YARV(代表 Yet Another Ruby VM),它是由 Koichi Sasada 编写的。它由一个将 Ruby 源代码编译为 YARV 字节码的 Ahead-Of-Time 编译器和一个解释所述字节码的解释器组成。因此,它是一个完全典型的字节码 VM,与 Python 的 CPython、PHP 的 Zend Engine、Lua VM、Rubinius 的旧版本、ECMAScript 的 SpiderMonkey 的旧版本等完全一样。
关于将 YARV 字节码的 JIT 编译器添加到 YARV 3 的本机机器代码到 VM 的讨论,这将使 VM 成为混合模式执行引擎。
Matz 当前的实现 MRuby 也是一个字节编码的 VM。
为了完整起见,这里有几个其他的 Ruby 实现,首先是当前可用于生产的实现,然后是几个历史上有趣的实现:
一些不再维护但历史上有趣的实现:
目前有几个有趣的研究项目是:
最后但并非最不重要的一点是,您有时可能会听说“Rite”。十多年来,Rite 一直被用作完全重写 MRI 的代号。 Matz 说,当他编写 MRI 时,他实际上对语言实现一无所知,所以他想第二次“正确”地做(明白了吗?)。同时,也有很多关于 Ruby 2.0 的讨论,希望修复该语言中一些长期存在的设计缺陷。两者混为一谈,因此 Rite 被称为 Ruby 2.0 的新实现。然而,YARV 出现并且非常好,以至于 Matz 认为他根本不需要编写自己的 VM,他基本上认为“YARV 就是 Rite”。
但现在,他确实编写了自己的 VM,这就是为什么您有时会听到 MRuby(或其 VM 组件)被称为“Rite”的原因。
【讨论】:
这是一个名为YARV 的字节码解释器,由 Sasada Koichi 编写。
这是一个外观示例:
puts RubyVM::InstructionSequence.compile("1+1").disasm
== disasm: #<ISeq:<compiled>@<compiled>>================================
0000 trace 1 ( 1)
0002 putobject_OP_INT2FIX_O_1_C_
0003 putobject_OP_INT2FIX_O_1_C_
0004 opt_plus <callinfo!mid:+, argc:1, ARGS_SIMPLE>, <callcache>
0007 leave
进一步阅读:
虽然 MRI 还没有 JIT,但有一个 Ruby+OMR 项目,它正在尝试添加一个基于 Eclipse OMR 的 JIT 编译器:
【讨论】:
Ruby 现在有一个由 VM 生成的 JIT 编译器!
自从 2.6.0-preview1 分支合并后,Ruby 现在有了一个名为“MJIT”(YARV MRI Jit)的基本 JIT 编译器。它的灵感来自 Vladimir Makarov 的作品,他提出了基于 RTL(寄存器传输语言)的指令集,而不是基于堆栈的指令集。加速尚不明显,因为并非所有指令路径都由 MJIT 处理,但分支包含未来工作的基础。
【讨论】: