gpt4 book ai didi

ruby - 解释型语言(如 Ruby)如何运行?

转载 作者:数据小太阳 更新时间:2023-10-29 07:05:21 25 4
gpt4 key购买 nike

我打算学习 Ruby。我知道这是一种解释语言。我知道编译语言最终会被翻译成机器码,但是 ruby​​ 解释器是做什么的呢?我读到解释器是用 C 编写的,但是每一行 ruby​​ 都转换为 c,然后再次编译为机器代码吗?我也听说过 JIT,但是如果这会增加答案的复杂性,那么您就不需要回答它了。我正在寻找的是我的 Ruby 代码发生了什么。

最佳答案

它将 Ruby 代码转换为某种更简单的“中间”表示形式(在最近的版本中,它编译为字节码)。它还会在您计算机的内存中构建一个虚拟机,模拟执行该表示的物理机。

这台机器是一台物理机器的镜像,至少在合理和有用的范围内。它通常有一个指令存储器、一个程序计数器、一个用于存储中间值和返回地址的堆栈等。一些更复杂的机器也有寄存器。有一个固定且相对原始的(与 Ruby 之类的语言相比,而不是与实际的 CPU 指令集相比)指令集。虚拟机就像一个 CPU,无限循环:

  • 读取当前指令(由程序计数器识别)。
  • (对其进行解码,尽管这通常比在真正的 CPU 中简单得多,至少比 CISC 的简单。)
  • 执行它(适本地操纵堆栈和/或进程中的寄存器)。
  • 更新程序计数器。

有了解释器,所有这一切都通过一个间接层发生。您实际的物理 CPU 不知道它在做什么。 VM 本身就是软件,上面的每个步骤都是在几个(在具有相当高级的字节码指令的情况下,可能是几十个或数百个)物理 CPU 周期中委托(delegate)给 CPU。每次读取指令时都会发生这种情况。

进入JIT编译。最简单的形式只是用解释器遇到它时将执行的代码的(稍微优化的)副本替换每个字节码指令。这已经带来了速度上的胜利,例如可以忽略程序计数器操作。但还有更智能的变体。

例如,跟踪 JIT 从常规解释器开始,另外观察它们执行的程序。如果他们注意到程序在特定的代码部分(几乎总是循环或从循环调用的函数)花费大量时间,它就会开始记录它在此期间所做的事情 - 它会生成一个trace。当它到达它开始记录的点时(在循环的一次迭代之后),它称它为一天并将跟踪编译为机器代码。但由于它看到了程序在运行时的实际行为,它可以生成完全符合这种行为的代码。以循环添加整数为例。机器代码不包含解释器实际执行的任何类型检查和函数调用。至少,它不会包含其中的大部分。它,以确保正确性,添加检查记录跟踪的条件(例如,涉及的变量是整数)是否仍然成立。当这样的检查失败时,它会退出并继续解释,直到记录下一个跟踪。但在此之前,它可能会以与手写 C 代码相媲美的速度执行一百次迭代。

关于ruby - 解释型语言(如 Ruby)如何运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6579931/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com