V8中的JavaScript编译

博尼·加西亚(Boni Garcia)

V8主页(Google的JavaScript引擎)中,我们阅读了以下内容:

V8编译并执行JavaScript源代码

  • 这是否意味着JavaScript在V8中不是一种解释性语言?

  • V8是否对JavaScript使用即时编译方法?


编辑:有另一个现有的问题已经解决了我的第一个问题,但不是第二个。

谢尔顿

这是否意味着JavaScript在V8中不是一种解释性语言?

答案是“取决于”。

从历史上看,V8使用其“ full-codegen”编译器直接编译为机器代码,该编译器生成未优化的代码,该代码使用内联缓存来实现大多数操作,例如算术运算,加载和存储变量及属性等。

full-codegen生成的代码通过在调用函数时以及跳转到循环顶部时调整计数器来跟踪每个函数的“热度”。

它还跟踪每个表达式中使用的变量的类型。

如果确定某个函数(或函数的一部分)非常热,并且已收集了足够的类型信息,则会触发“曲轴”编译器,该编译器会生成更好的代码。

但是,V8开发人员正在积极地朝着另一个系统迁移,他们从一个名为“点火”的解释器开始,然后使用一个名为“ Turbofan”的编译器为热功能生成优化的代码。

这是V8开发人员博客中的几篇帖子,对此进行了描述:

V8是否对JavaScript使用即时编译方法?

是的,有多种方式。

首先,它具有延迟解析和延迟编译机制。这意味着,当它解析Javascript源文件时,它会急切地解析最外部的作用域,并立即生成完整的代码生成代码。

但是,对于文件中定义的函数,它会跳过它们,仅记录函数的名称及其源代码的位置。它生成一个伪函数,该伪函数仅调用V8运行时以触发该函数的实际编译。

其次,它具有如上所述的两级编译器流水线,使用完整代码源+曲轴或点火+涡轮风扇。

触发编译时,它将首先生成未优化的代码或点火字节码(可以非常快速地执行),然后,如果代码很热,它将触发优化的重新编译(速度较慢,但​​生成的代码更好)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

V8中的Javascript等效项?

来自分类Dev

V8中的Javascript奇怪的性能

来自分类Dev

节点或v8中内置JavaScript类型的参考

来自分类Dev

如何在C ++中从V8调用Javascript函数

来自分类Dev

节点或v8中内置JavaScript类型的参考

来自分类Dev

V8中JavaScript对象的内存布局

来自分类Dev

什么时候在Node.js V8中分配和编译闭包?

来自分类Dev

如何从v8脚本编译错误中获取行号和列?

来自分类Dev

如何在 V8 引擎中打印已编译的指令?

来自分类Dev

V8 Hello World编译错误:无法从“ v8 :: Local <v8 :: String>”转换为“ v8 :: String”

来自分类Dev

在V8上进行JavaScript测试

来自分类Dev

如何禁用V8的优化编译器

来自分类Dev

无需联网等即可编译V8

来自分类Dev

如何为Windows编译最小的V8库?

来自分类Dev

RenderScript支持库V8无法编译

来自分类Dev

如何使用Visual Studio编译V8?

来自分类Dev

RenderScript支持库V8无法编译

来自分类Dev

交叉编译-Windows上的V8和Linux

来自分类Dev

可以在Chrome中的JavaScript中获取V8 JavaScript引擎版本号

来自分类Dev

V8中的隐藏课程

来自分类Dev

V8中的Typeof和Expression *

来自分类Dev

在V8中使用TerminateExecution

来自分类Dev

在v8中检测无限递归

来自分类Dev

Windows中的V8构建错误

来自分类Dev

V8 Javascript引擎:v8 ::参数和功能模板

来自分类Dev

在V8 JavaScript引擎中,如何使每个实例重新使用ObjectTemplate的构造函数?

来自分类Dev

在嵌入式V8引擎中调试JavaScript

来自分类Dev

客户端上的JavaScript中的哈希计算(Chrome / V8)

来自分类Dev

如何删除 Bing Maps V8 Javascript API 中的军械测量选项?