首页 > 解决方案 > V8 的点火装置到底有什么作用?

问题描述

https://v8.dev/docs/ignition我们可以看到:

Ignition 是使用 TurboFan 后端编写的基于寄存器的快速低级解释器

https://docs.google.com/document/d/11T2CRex9hXxoJwbYqVQ32yIPMh0uouUZLdyrtmMoL44/edit?ts=56f27d9d#

Ignition 项目的目标是为 V8 构建一个执行低级字节码的解释器,从而使一次性运行或非热代码以字节码形式更紧凑地存储。

解释器本身由一组字节码处理程序代码片段组成,每个代码片段处理一个特定的字节码并分派给下一个字节码的处理程序。这些字节码处理程序

要将函数编译为字节码,需要解析 JavaScript 代码以生成其 AST(抽象语法树)。BytecodeGenerator 遍历这个 AST 并在适当的时候为每个 AST 节点生成字节码。

一旦生成了字节码处理程序的图形,它将通过 Turbofan 管道的简化版本并分配给解释器表中的相应条目。

因此,Ignition 的工作似乎是将BytecodeGenerator生成的字节码转换为字节码处理程序并通过Turbofan.

但在这儿: 在此处输入图像描述

和这里: 在此处输入图像描述

你可以看到产生字节码的是点火。

更重要的是,在这个视频中https://youtu.be/p-iiEDtpy6I?t=722 Ignition 据说是一个基线编译器。

那是什么?基线编译器?字节码解释器?AST 到字节码转换器?

这张图片似乎是最合适的: 在此处输入图像描述

点火只是一个解释器,之前的一切都是无名的字节码生成器/优化器。

在此处输入图像描述

标签: javascriptgoogle-chromev8

解决方案


V8 开发人员在这里。

https://v8.dev/docs/ignition我们可以看到:

Ignition 是使用 TurboFan 后端编写的基于寄存器的快速低级解释器

是的,总结一下。添加更多细节:

  • “Ignition”这个名称既指字节码生成器,也指字节码解释器。通常,整个事情也被视为一个大黑匣子,并被随便称为“解释器”,这有时会导致对术语的一些混淆。
  • 字节码生成器获取解析器为给定 JavaScript 函数生成的 AST,并从中生成字节码。
  • 字节码解释器获取字节码生成器生成的字节码,并通过将其发送到一组字节码处理程序来解释它来执行它。
  • 构成字节码解释器的字节码处理程序是使用 Turbofan 管道的一部分生成的。这发生在 V8 编译时,而不是运行时。换句话说,您需要 Turbofan 来构建(部分)Ignition,但不需要运行Ignition。
  • 解析器(以及它产生的 AST/抽象语法树)不是 Ignition 的一部分。

一旦生成了字节码处理程序的图形,它将通过 Turbofan 管道的简化版本并分配给解释器表中的相应条目。

所以看起来Ignition的工作是把BytecodeGenerator生成的字节码转换成字节码处理程序并通过Turbofan执行

设计文档的这一部分讨论了生成字节码处理程序,它使用 Turbofan 的部分“提前”(即在编译 V8 时)发生。在运行时,字节码不会转换为处理程序,它由现有的固定处理程序集“处理”(=运行、执行、解释),并且不涉及 Turbofan。

更重要的是,在这个视频中https://youtu.be/p-iiEDtpy6I?t=722 Ignition 据说是一个基线编译器。

在那一刻,演讲是指所有现代 JavaScript 引擎都有一个“基线编译器”的一般想法(在非常一般的概念意义上——我同意幻灯片可以更清楚地说明这一点)。请注意,幻灯片并未提及 Ignition。下一张幻灯片说 Ignition 在 V8 中扮演了这个角色。所以更准确的说法是“Ignition取代了基线编译器”或“Ignition 是基线执行引擎”。或者您可以稍微重新定义您的术语并说“Ignition 是一个生成字节码然后解释它的编译器”。

点火只是一个解释器,之前的一切都是无名的字节码生成器/优化器

该幻灯片将“解释器”框显示为“点火字节码管道”的一部分。字节码生成器/优化器也是 Ignition 的一部分。


推荐阅读