V8是执行解释器生成的字节代码,还是执行Turbofan编译器生成的二进制代码?

2022-06-15 00:00:00 google-chrome javascript v8

我搞不懂V8是如何工作的,以及它是如何执行js代码的。

我知道V8首先解析代码并创建AST,然后将此AST作为输入引入解释器并产生字节码,然后将此字节码引入Turbofan编译器,将中间代码转换为计算机能够理解的机器代码。

我正在读一篇关于这个主题的article,这很好,但结果有些事情让我困惑

  1. 执行阶段:使用V8引擎运行时环境的内存堆和调用堆栈执行字节码

我认为机器代码是被执行的代码,否则如果字节码是被执行的代码,为什么我们需要创建该代码??


解决方案

(此处为V8开发人员)

为了证实@Bergi在他的评论中所说的:字节码主要用于由解释器执行的目的,而这实际上是执行JavaScript所需的全部。V8(现在的)不会将所有函数编译成机器码,只有那些运行得足够热以进行优化编译的函数才值得(可能)投入时间。作为实现的一个特定细节,优化编译器使用字节码作为输入,这使字节码具有次要的用途;但这实际上只是一个可以用不同方式解决的细节,例如,当优化编译器开始工作时,通过再次将原始源代码解析为AST,这是几年前V8一直使用的方式。

(您链接的文章确实提到了这些概念中的大多数,但我同意它的写作有些令人困惑,我不同意它的一些描述。有关事物如何工作的官方描述,请参阅v8.dev/blog。)

相关文章