Do V8 execute Byte code produced by the interpreter or binary code produced by the turbofan compiler?(V8是执行解释器生成的字节代码,还是执行Turbofan编译器生成的二进制代码?)
问题描述
我搞不懂V8是如何工作的,以及它是如何执行js代码的。
我知道V8首先解析代码并创建AST,然后将此AST作为输入引入解释器并产生字节码,然后将此字节码引入Turbofan编译器,将中间代码转换为计算机能够理解的机器代码。
我正在读一篇关于这个主题的article,这很好,但结果有些事情让我困惑
- 执行阶段:使用V8引擎运行时环境的内存堆和调用堆栈执行字节码
我认为机器代码是被执行的代码,否则如果字节码是被执行的代码,为什么我们需要创建该代码??
推荐答案
(此处为V8开发人员)
为了证实@Bergi在他的评论中所说的:字节码主要用于由解释器执行的目的,而这实际上是执行JavaScript所需的全部。V8(现在的)不会将所有函数编译成机器码,只有那些运行得足够热以进行优化编译的函数才值得(可能)投入时间。作为实现的一个特定细节,优化编译器使用字节码作为输入,这使字节码具有次要的用途;但这实际上只是一个可以用不同方式解决的细节,例如,当优化编译器开始工作时,通过再次将原始源代码解析为AST,这是几年前V8一直使用的方式。
(您链接的文章确实提到了这些概念中的大多数,但我同意它的写作有些令人困惑,我不同意它的一些描述。有关事物如何工作的官方描述,请参阅v8.dev/blog。)
这篇关于V8是执行解释器生成的字节代码,还是执行Turbofan编译器生成的二进制代码?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:V8是执行解释器生成的字节代码,还是执行Turbofan编译器生成的二进制代码?
基础教程推荐
- 角度Apollo设置WatchQuery结果为可用变量 2022-01-01
- 在 JS 中获取客户端时区(不是 GMT 偏移量) 2022-01-01
- 我什么时候应该在导入时使用方括号 2022-01-01
- 在for循环中使用setTimeout 2022-01-01
- 悬停时滑动输入并停留几秒钟 2022-01-01
- 动态更新多个选择框 2022-01-01
- Karma-Jasmine:如何正确监视 Modal? 2022-01-01
- 响应更改 div 大小保持纵横比 2022-01-01
- 有没有办法使用OpenLayers更改OpenStreetMap中某些要素 2022-09-06
- 当用户滚动离开时如何暂停 youtube 嵌入 2022-01-01