2017-03-05 126 views

回答

3

这是一个由Sasada Koichi编写的称为YARV的字节码解释器。

下面是它的外观一个例子:

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的是,有红宝石+ OMR项目,这是试图添加一个JIT编译器基于Eclipse OMR

+0

哇!十分有趣!我不知道它是从语言本身提供的。 – user6245072

+0

我刚刚为你添加了一些信息:-) –

+0

我仍然不明白字节码解释器和JIT编译器之间有什么区别。刚刚在软件工程中问了一个关于它的问题。感谢您的回答! – user6245072

5

注:术语 “MRI” 令人困惑。它的意思是“Matz的Ruby /参考实现/解释器”。但是,MRI已经退休,不再开发或维护。

MRI是一个纯粹的AST行走解释器,没有编译涉及任何地方。

令人困惑的是:Matz写了一个新的实现,但这叫做MRuby,而不是MRI。而实际上是现在叫做MRI不是由Matz写的。所以,最好不要使用这个术语,而要具体说明你正在谈论的是哪个实现。

人们现在称为MRI的实现名称实际上是YARV(另一个Ruby VM),它由Koichi Sasada编写。它由一个将Ruby源代码编译为YARV字节码的前期编译器和一个解释所述字节码的解释器组成。因此,它是一个完全典型的字节码VM,与Python的CPython,PHP的Zend Engine,Lua VM,Rubinius的旧版本,ECMAScript的SpiderMonkey的旧版本等等完全相同。

有一个关于将YARV字节码中的JIT编译器添加到本地机器代码到YARV 3的VM的讨论,然后YARV 3将使该VM成为混合模式执行引擎。

Matz目前的实现MRuby也是一个字节编码的虚拟机。

为了完整性,这里有一些其他的Ruby实现的,首先是目前生产就绪的,然后一对夫妇的历史意义的国家:

  • 了Rubinius:编译Ruby源代码Rubinius的字节然后将字节码转交给由字节码解释器和基于LLVM的JIT编译器组成的混合模式执行引擎;他们最近引入或正在为JIT编译器引入单独的中间代理(IR),因此解释器使用Rubinius字节码,但JIT编译器在编译器IR中运行。 Rubinius也属于“历史上有趣的”类别,因为它是第一个成功的Ruby实现,其中很大一部分是在Ruby中实现的;之前还有其他项目,但Rubinius是第一个可以投入生产的项目。
  • JRuby:主模式是一个混合模式执行引擎,由一个AST行走解释器和一个JIT编译器组成,它首先将AST转换为IR,然后再将它编译为JVM字节码。另一种模式是提前将Ruby源代码编译为JVM字节码的AOT编译器。
  • Opal:一种将Ruby源代码编译为ECMAScript源代码的前期编译器。
  • MagLev:基于GemStone/S Smalltalk VM的实现。不幸的是,我不太了解它,我相信它将Ruby源代码编译为GemStone/S字节码,然后GemStone/S VM是一个带有字节码解释器和JIT编译器的标准混合模式VM。

一些不再保持,但历史上有趣的实现:

  • 黄玉:使用RPython/PyPy VM框架的实现; PyPy框架很有趣,因为它包含跟踪JIT编译器,与其他JIT编译器不同,除了解释器并编译用户程序,而是在解释用户程序时编译解释器。这基本上意味着JIT只能由PyPy开发人员编写一次,每个使用PyPy框架的语言实现者只需编写一个简单的字节码解释器就可以免费获得一个优化的本机JIT编译器。
  • XRuby:Ruby的第一个静态AOT编译器,为JVM实现。 IronRuby:它开始时是一个没有解释器的纯JIT编译器,但后来又添加了一个解释器,因为事实证明,这实际上改进了的性能(这与解释器速度较慢的流行神话相反)。 unholy:概念验证的AOT编译器,它将YARV字节码编译为CPython字节码;这被Google的App Engine首次推出并且只支持Python时的幸运僵局所破坏,它的想法是,您可以使用YARV将Ruby源代码编译为YARV字节码,使用unholy将YARV字节码编译为CPython字节码,编译将CPython字节码转换为使用反编译的Python源代码,然后将Python源代码上传到GAE以运行您的闪亮的新Ruby应用程序。
  • 荣誉奖去:tinyrb,metaruby,Ruby.NET,红太阳,HotRuby,BlueRuby,SmallRuby

几个有趣的目前的研究项目有:

  • 的JRuby +松露:此项目正在使用Oracle Labs的Truffle AST解释器框架重新实现JRuby的内部构件;这个版本在启用Graal的JVM(另一个Oracle Labs研究项目)上运行时,能够获得与Java相似的性能,有时甚至达到(并超过)C。
  • Ruby + OMR:IBM打破了其J9 JVM转换为可独立重用的,独立于语言的VM实现者构建块,并在Eclipse开放源代码许可证下作为Eclipse Open Managed Runtime发布。这不是一个学术项目:IBM J9的Java 8版本实际上是使用OMR实现的。 Ruby + OMR项目是OMR开发人员的概念验证,用OMR代替YARV的垃圾回收器,并将OMR的JIT编译器,分析器和调试器添加到YARV中。这是相当令人印象深刻的如何语言无关的所有东西真的是,整个补丁小于10000行,这不仅是胶水代码,它实际上包括所有所需的OMR组件。(还有一个等价的Python + OMR项目,但是这仍然非公开)

最后但并非最不重要的,你有时会听到关于“礼”。 Rite被用作十多年来完全重写MRI的代号。 Matz说,当他写MRI时,他实际上并不知道语言实现的任何内容,所以他想第二次“正确”(得到它?)。与此同时,还有很多关于Ruby 2.0的讨论,希望解决语言中一些长期存在的设计缺陷。这两者被集中在一起,所以Rite被称为Ruby 2.0的新实现。然而,YARV出现了,并且非常好,Matz决定他不需要写自己的VM,他基本上决定“YARV是Rite”。

但现在,他确实编写了自己的虚拟机,这就是为什么你有时会听到MRuby(或其VM组件)被称为“Rite”。