在V8 主页(Google 的 JavaScript 引擎)中,我们读到以下内容:
V8 编译并执行 JavaScript 源代码
这是否意味着 JavaScript 在 V8 中不是一种解释型语言?
V8 是否对 JavaScript 使用即时编译方法?
编辑:还有另一个现有问题已经解决了我的第一个问题,但不是第二个问题。
这是否意味着 JavaScript 在 V8 中不是一种解释型语言?
对此的答案是“视情况而定”。
从历史上看,V8 使用其“full-codegen”编译器直接编译为机器代码,该编译器生成未优化的代码,该代码使用内联缓存来实现大多数操作,例如算术运算、变量和属性的加载和存储等。
full-codegen 生成的代码通过在函数被调用和跳回循环顶部时调整计数器来跟踪每个函数的“热”程度。
它还跟踪每个表达式中使用的变量的类型。
如果它确定一个函数(或函数的一部分)非常热,并且它已经收集了足够的类型信息,它会触发“Crankshaft”编译器生成更好的代码。
然而,V8 开发人员正在积极地转移到一个不同的系统,他们从一个名为“Ignition”的解释器开始,然后使用一个名为“Turbofan”的编译器为热函数生成优化代码。
以下是 V8 开发者博客中的几篇文章描述了这一点:
V8 是否对 JavaScript 使用即时编译方法?
是的,在很多方面。
首先,它具有惰性解析和惰性编译机制。这意味着当它解析 Javascript 源文件时,它会急切地解析最外面的范围,立即生成完整的代码生成代码。
但是,对于文件中定义的函数,它会跳过它们,只记录函数的名称及其源代码的位置。它生成一个虚拟函数,它只是调用 V8 运行时来触发函数的实际编译。
其次,它有一个如上所述的两级编译器管道,使用全代码生成+曲轴或点火+涡轮风扇。
当编译被触发时,它最初会生成未优化的代码或点火字节码(它可以非常快地完成),然后如果代码很热,它会触发优化的重新编译(这会慢得多,但会生成更好的代码)。