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

Do V8 execute Byte code produced by the interpreter or binary code produced by the turbofan compiler?

我对 v8 的工作原理以及它如何执行 js 代码感到困惑。

我知道 v8 首先解析代码并创建 AST,然后将该 AST 作为输入引入解释器并生成字节码,然后将该字节码引入 turbofan 编译器,将中间代码转换为计算机可以理解的机器码.

我正在阅读有关此主题的 article,这很好,但结果让我有些困惑

  1. Execution Phase: The byte code is executed by using the Memory heap and the Call Stack of the V8 engine’s runtime environment

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

(此处为 V8 开发人员。)

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

(您链接到的文章确实提到了其中的大部分概念,但我同意它写得有些混乱,而且我不同意它的某些特征。请参阅 v8.dev/blog 以了解事情如何发生的官方描述工作。)