是语言翻译吗?还是字节码解释器/ JIT编译器?我在哪里可以了解有关实现的更多信息(浏览源代码除外)?
答案 0 :(得分:6)
注意:术语" MRI"令人困惑。这意味着" Matz的Ruby / Reference Implementation / Interpreter"。然而,MRI已经退役,不再开发或维护。
MRI是纯粹的AST行走解释器,任何地方都没有编译。
令人困惑的是:Matz编写了一个新的实现,但这称为MRuby,而不是MRI。现在现在称为MRI的实现并非由Matz编写。所以,实际上,最好根本不使用该术语,并具体说明您正在谈论的实现。
人们现在称之为MRI的实现名称实际上是YARV(对于Yet Another Ruby VM),它是由Koichi Sasada编写的。它包含一个Ahead-Of-Time编译器,它将Ruby源代码编译为YARV字节代码,以及一个解释所述字节代码的解释器。因此,它是一个完全典型的字节码VM,就像CPython for Python,Zend Engine for PHP,Lua VM,旧版Rubinius,旧版本的SpiderMonkey for ECMAScript等等。
有人谈到将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"。
答案 1 :(得分:3)
这是一个名为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编译器:
答案 2 :(得分:0)
Ruby现在有一个VM生成的JIT编译器!
由于2.6.0-preview1分支已合并,Ruby现在有一个基本的JIT编译器,名为&#34; MJIT&#34; (YARV MRI Jit)。它的灵感来自Vladimir Makarov的作品,他提出了一种基于RTL(寄存器传输语言)的指令集,而不是基于堆栈的指令集。加速比尚不明显,因为并非所有指令路径都由MJIT处理,但分支包含未来工作的基础。