在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管道的简化版本传递并分配给解释器表中的相应条目。
因此,似乎点火工作是将 BytecodeGenerator 生成的字节码转换为字节码处理程序,并通过Turbofan
执行。
您可以看到正是点火产生了字节码。
此外,在这段视频https://youtu.be/p-iiEDtpy6I?t=722中,点火被称为基准编译器。
那是什么? 基准编译器?字节码解释器? AST转换为字节码转换器?
点火只是一个解释器,之前的所有内容都是无名字节码生成器/优化器。
答案 0 :(得分:3)
正如我在评论中提到的那样,令人遗憾的是,有些文档已经过时,包括上面带有您的第一张图的文档。 Full-codegen和Crankshaft是no longer used at all,仅用于解析和Ignition + TurboFan。 (您已从过时的文档中删除了该图像,但遗憾的是,这些图像仍由某些V8文档链接)
点火是一种高速字节码解释器。
V8的解析器生成点火字节码。该字节码由点火执行(解释)。仅运行一次(启动代码等)或未运行的代码通常停留在字节码级别,并继续由Ignition执行。
“热”代码进入第二阶段,在此阶段TurboFan进入:TurboFan的输入与Ignition解释的字节码相同(而不是与Crankshaft相同的源代码),然后将其积极地编译为高度优化的机器。直接运行(而不是被解释)的代码。
链接的文章探讨了退出Full-codegen和Crankshaft的动机(在前一种情况下节省了内存,在第二种情况下难以实现,特别是优化了语言功能)。 TurboFan的设计还帮助V8作者最大程度地减少了必须编写的特定于平台的代码量(通过具有中间表示形式,这些中间表示形式还可以用于编写Ignition的字节码处理程序)。
答案 1 :(得分:2)
V8开发人员在这里。
在https://v8.dev/docs/ignition上我们可以看到:
Ignition是使用TurboFan后端编写的基于寄存器的快速底层解释器
是的,总结起来。要添加更多细节:
生成字节码处理程序的图形后,它会通过Turbofan管道的简化版本传递并分配给解释器表中的相应条目。
因此,似乎点火工作是将BytecodeGenerator生成的字节码转换为字节码处理程序,然后通过Turbofan执行它
设计文档的这一部分讨论生成字节码处理程序的过程,该过程使用Turbofan的一部分“提前”(即,在编译V8时)发生。在运行时,字节码不会转换到处理程序,而是由现有的固定处理程序集“处理”(=运行,执行,解释),并且不涉及Turbofan。
此外,在这段视频https://youtu.be/p-iiEDtpy6I?t=722中,点火被称为基准编译器。
那时候,演讲是指所有现代JavaScript引擎都具有“基准编译器”的一般想法(从非常一般的概念意义上讲,我同意幻灯片可以使这一点变得更加清晰)。请注意,幻灯片未提及点火。 next 幻灯片说,点火在V8中扮演着这个角色。因此,更准确的说法是说“点火代替了基线编译器”或“点火是基线执行引擎”。或者,您可以稍微重新定义术语,然后说“点火是生成字节码然后解释它的编译器”。
点火只是一个解释器,之前的所有东西都是无名的字节码生成器/优化器
该幻灯片将“解释器”框显示为“点火字节码管道”的一部分。字节码生成器/优化器也是点火的一部分。
答案 2 :(得分:0)
请更正我在理解转换过程中的错误: