V8中的JavaScript编译

Bon*_*cía 0 javascript jit v8 interpreted-language compiled-language

V8主页(Google的JavaScript引擎)中,我们读到了这个:

V8编译并执行JavaScript源代码

  • 这是否意味着JavaScript不是V8中的解释语言?

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


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

she*_*ond 5

这是否意味着JavaScript不是V8中的解释语言?

对此的答案是"它取决于".

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

full-codegen生成的代码通过在调用函数时调整计数器以及何时跳回到循环顶部来跟踪每个函数的"热"程度.

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

如果它确定函数(或函数的一部分)非常热,并且它已经收集了足够的类型信息,则它会触发"Crankshaft"编译器,该编译器生成更好的代码.

但是,V8开发人员正积极致力于迁移到另一个系统,他们从一个名为"Ignition"的解释器开始,然后使用名为"Turbofan"的编译器为热门功能生成优化代码.

以下是来自V8开发者博客的几篇帖子,描述了这一点:

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

是的,有很多方面.

首先,它具有惰性解析和惰性编译机制.这意味着当它解析Javascript源文件时,它会急切地解析最外层的范围,立即生成完整的codegen代码.

但是,对于文件中定义的函数,它会跳过它们,只记录函数的名称和源代码的位置.它生成一个虚函数,它只是调用V8运行时来触发函数的实际编译.

其次,它具有如上所述的两级编译器管道,使用全代码+曲轴或点火+涡轮风扇.

当编译被触发时,它将首先生成未经优化的代码或点火字节码(它可以非常快速地执行),然后如果代码很热,它会触发优化的重新编译(这会慢得多但生成更好的代码).