V8的点火装置真正起什么作用?

时间:2019-03-02 11:22:38

标签: javascript google-chrome v8 ignition

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执行。

但是在这里: enter image description here

在这里: enter image description here

您可以看到正是点火产生了字节码。

此外,在这段视频https://youtu.be/p-iiEDtpy6I?t=722中,点火被称为基准编译器。

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

此图片似乎最合适: enter image description here

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

enter image description here

3 个答案:

答案 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后端编写的基于寄存器的快速底层解释器

  

是的,总结起来。要添加更多细节:

  • 名称“点火”指的是字节码生成器和字节码解释器。通常,整个事情也被视为一个大黑匣子,并随意地称为“解释器”,有时可能会导致术语混淆。
  • 字节码生成器采用解析器为给定的JavaScript函数生成的AST,并从中生成字节码。
  • 字节码解释器采用字节码生成器生成的字节码,并通过将其发送到一组字节码处理程序进行解释来执行它。
  • 构成字节码解释器的字节码处理程序是使用Turbofan流水线的一部分生成的。这是在V8编译时发生的,而不是在运行时发生的。换句话说,您需要Turbofan来 build (部分)点火,而不是 run 点火。
  • 解析器(及其产生的AST /抽象语法树)不是点火的一部分。
  
    

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

  
     

因此,似乎点火工作是将BytecodeGenerator生成的字节码转换为字节码处理程序,然后通过Turbofan执行它

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

  

此外,在这段视频https://youtu.be/p-iiEDtpy6I?t=722中,点火被称为基准编译器。

那时候,演讲是指所有现代JavaScript引擎都具有“基准编译器”的一般想法(从非常一般的概念意义上讲,我同意幻灯片可以使这一点变得更加清晰)。请注意,幻灯片未提及点火。 next 幻灯片说,点火在V8中扮演着这个角色。因此,更准确的说法是说“点火代替了基线编译器”或“点火是基线执行引擎”。或者,您可以稍微重新定义术语,然后说“点火是生成字节码然后解释它的编译器”。

  

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

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

答案 2 :(得分:0)

请更正我在理解转换过程中的错误:

  • 已将JS代码解析为AST
  • 发送到点火的AST转换为字节码
  • 生成机器码
  • 如果字节码最佳,则将其发送到CPU进行处理
  • 如果字节码需要优化,则将其发送给Turbofan进行优化
  • 如果Turbofan收到字节码,它将进一步优化并发送到计算机进行处理。