Javascript V8';你真的喜欢什么?
在这方面,我们可以看到: Ignition是一个使用涡扇发动机后端编写的基于寄存器的快速低级解释器 在 点火项目的目标是为V8构建一个执行低级字节码的解释器,从而使一次性运行或非热代码能够以字节码形式更紧凑地存储 解释器本身由一组字节码处理程序代码段组成,每个字节码处理程序代码段处理一个特定的字节码,并将下一个字节码分派给处理程序。这些字节码处理程序 要将函数编译为字节码,需要解析JavaScript代码以生成其AST(抽象语法树)。字节码生成器遍历该AST,并根据需要为每个AST节点生成字节码 生成字节码处理程序的图形后,它将通过一个简化版本的涡扇发动机管道,并分配给解释器表中的相应条目 因此,点火工作似乎是将字节码生成器生成的字节码转换为字节码处理程序,并通过涡轮风扇执行 但在这里: 在这里: 您可以看到,正是点火产生字节码 更重要的是,在这个视频点火被称为是一个基线编译器 那是什么? 基线编译器?字节码解释器?AST到字节码转换器 这张图片似乎最合适: 点火只是一个解释器,而之前的一切都是没有名字的字节码生成器/优化器 正如我在评论中提到的,遗憾的是,有些文档已经过时,包括上面带有第一张图片的文档。完整的codegen和曲轴是,它是纯粹的解析和点火+涡轮风扇。(您已经从过时的文档中删除了该图像,遗憾的是,这些文档仍然由一些V8文档链接) 点火开关是一个高速字节码解释器 V8的解析器产生点火字节码。该字节码由点火执行(解释)。仅运行一次(启动代码等)或未运行的代码通常保持字节码级别,并继续由点火执行 “热”代码进入第二阶段,涡扇发动机开始工作:涡扇发动机的输入是点火装置解释的同一字节码(而不是源代码,就像曲轴一样),然后它积极地编译成直接运行(而不是被解释)的高度优化的机器代码 探讨了脱离完整的codegen和Crankshow的动机(前一种情况下节省内存,第二种情况下难以实现,特别是优化语言特性)。涡扇发动机的设计也有助于V8作者减少他们必须编写的特定于平台的代码量(通过具有中间表示,除其他外,他们还可以使用中间表示来编写Ignition的字节码处理程序)。V8开发者在此 在这方面,我们可以看到: Ignition是一个使用涡扇发动机后端编写的基于寄存器的快速低级解释器 是的,总而言之。要添加更多细节,请执行以下操作:Javascript V8';你真的喜欢什么?,javascript,google-chrome,v8,Javascript,Google Chrome,V8,在这方面,我们可以看到: Ignition是一个使用涡扇发动机后端编写的基于寄存器的快速低级解释器 在 点火项目的目标是为V8构建一个执行低级字节码的解释器,从而使一次性运行或非热代码能够以字节码形式更紧凑地存储 解释器本身由一组字节码处理程序代码段组成,每个字节码处理程序代码段处理一个特定的字节码,并将下一个字节码分派给处理程序。这些字节码处理程序 要将函数编译为字节码,需要解析JavaScript代码以生成其AST(抽象语法树)。字节码生成器遍历该AST,并根据需要为每个AST节点生成字节码
- 名称“点火”指字节码生成器和字节码解释器。通常,整个事件也被视为一个大黑匣子,随意地称为“解释器”,这有时会导致术语的混淆
- 字节码生成器获取解析器为给定JavaScript函数生成的AST,并从中生成字节码
- 字节码解释器获取字节码生成器生成的字节码,并通过将其发送到一组字节码处理程序来解释来执行它
- 组成字节码解释器的字节码处理程序是使用涡扇管道的一部分生成的。这发生在V8编译时,而不是运行时。换句话说,您需要涡轮风扇来构建(部分)点火装置,但不需要运行点火装置
- 解析器(以及它生成的AST/Abstract语法树)不是Ignition的一部分
该幻灯片显示了作为“点火字节码管道”一部分的“解释器”框。字节码生成器/优化器也是点火的一部分。请纠正我在理解转换过程中的错误:
- JS代码解析成AST
- 发送至点火装置的AST将转换为字节码
- 生成机器代码
- 如果字节码是最优的,则将其发送到CPU进行处理
- 如果字节码需要优化,它会