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