【问题标题】:How is ruby code executedruby 代码是如何执行的
【发布时间】:2013-07-09 23:52:58
【问题描述】:

我最近开始学习 Ruby。我知道 Ruby 是一种解释型语言(尽管“每种”语言都是因为它被 CPU 解释为机器代码)。但是 ruby​​ 解释器如何将 Ruby 编写的代码转换为机器码呢?我读过解释器不读取源代码,而是读取字节码,但是我不必像在 Java 中那样编译。那么,这是 Ruby 为您做的另一件事吗?如果是,它会在运行时生成字节码吗?因为您永远不会像在 Java 中那样获得 .class 文件。最重要的是,我阅读了有关即时编译器的所有内容,这些编译器显然对字节码做了一些事情,因此它运行得更快。

如果是上述情况,解释器是否首先扫描所有源代码,将其转换为字节码,然后在运行时使用 JIT 再次编译?

最后我不是在寻找有关性能方面的答案,我只是想知道它是如何处理的,它经历了哪些阶段以及它在什么时间完成。

感谢您的宝贵时间。

我正在使用这个解释器http://www.ruby-lang.org/en/

【问题讨论】:

  • 根据您的问题,我们是否应该假设您使用 JRuby,即 ruby​​ 的 Java 实现?
  • 不,我使用的是 Ruby 网站上的标准。
  • JIT?你是说安卓吉特?你在 android 中使用 jruby 吗?
  • 哦,即时编译器...好的..

标签: ruby interpreter


【解决方案1】:

但是 ruby​​ 解释器如何将 Ruby 编写的代码转换为机器码呢?

它没有,至少不是所有的实现。

仅 Afaik Rubinius 正在尝试执行您所描述的操作,即编译为机器代码。

我读到解释器不读取源代码,而是读取字节码,但是我不必像在 Java 中那样编译。那么,这是 Ruby 为您做的另一件事吗?

是的

如果有,它会在运行时生成字节码吗?

是的,差不多。并将其保存在内存中。权衡是下一次它必须读取->翻译->重新执行。

如果是上述情况,解释器是否首先扫描所有源代码,将其转换为字节码,然后在运行时使用 JIT 再次编译?

不是所有的源代码,只是它需要的。那么是的,创建一个字节码表示将其保存在内存中,而不一定要编译为机器码。

【讨论】:

  • 感谢您的精彩回答!我已经更新了我的帖子以显示我使用的解释器。我想我明白了。你说只有需要的源代码转换成字节码,这是什么意思?仅转换程序使用的对象、方法等所需的源代码?然后转换后的源代码将存储在解释器中,以便下次(如果我不更改任何内容)执行得更快(即使它不是为了性能,只是理解)。那么解释器只理解执行生成的字节码对吗?
  • 我还需要补充一件事,解释器读取的字节码最终会被评估为机器码,对吧?如果它是一个 JIT 编译器,它会获取字节码并让它发生一些神奇的事情吗?
  • OscarRyz 所说的对于 Ruby 1.9 来说是准确的。 Ruby 1.8 是一个更简单的真正解释器,它通过了 AST。
【解决方案2】:

Ruby1.8 的标准实现使用一个名为MRI(Matz 的Ruby 解释器)的解释器。这是一个编译成机器码的程序:

  1. 将文本文件读入数据结构。
  2. 按照数据结构中的说明来决定要做什么

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    相关资源
    最近更新 更多