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

Do V8 execute Byte code produced by the interpreter or binary code produced by the turbofan compiler?(V8是执行解释器生成的字节代码,还是执行Turbofan编译器生成的二进制代码?)
本文介绍了V8是执行解释器生成的字节代码,还是执行Turbofan编译器生成的二进制代码?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

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

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

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

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

推荐答案

(此处为V8开发人员)

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

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

这篇关于V8是执行解释器生成的字节代码,还是执行Turbofan编译器生成的二进制代码?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

Update another component when Formik form changes(当Formik表单更改时更新另一个组件)
Formik validation isSubmitting / isValidating not getting set to true(Formik验证正在提交/isValiating未设置为True)
React Validation Max Range Using Formik(使用Formik的Reaction验证最大范围)
Validation using Yup to check string or number length(使用YUP检查字符串或数字长度的验证)
Updating initialValues prop on Formik Form does not update input value(更新Formik表单上的初始值属性不会更新输入值)
password validation with yup and formik(使用YUP和Formick进行密码验证)