这是否意味着JavaScript在V8中不是一种解释性语言?
答案是“取决于”。
从历史上看,V8使用其“ full-codegen”编译器直接编译为机器代码,该编译器生成未优化的代码,该代码使用内联缓存来实现大多数操作,例如算术运算,加载和存储变量及属性等。
full-codegen生成的代码通过在调用函数时以及跳转到循环顶部时调整计数器来跟踪每个函数的“热度”。
它还跟踪每个表达式中使用的变量的类型。
如果确定某个函数(或函数的一部分)非常热,并且已收集了足够的类型信息,则会触发“曲轴”编译器,该编译器会生成更好的代码。
但是,V8开发人员正在积极地朝着另一个系统迁移,他们从一个名为“点火”的解释器开始,然后使用一个名为“ Turbofan”的编译器为热功能生成优化的代码。
这是V8开发人员博客中的几篇帖子,对此进行了描述:
V8是否对JavaScript使用即时编译方法?
是的,有多种方式。
首先,它具有延迟解析和延迟编译机制。这意味着,当它解析Javascript源文件时,它会急切地解析最外部的作用域,并立即生成完整的代码生成代码。
但是,对于文件中定义的函数,它会跳过它们,仅记录函数的名称及其源代码的位置。它生成一个伪函数,该伪函数仅调用V8运行时以触发该函数的实际编译。
其次,它具有如上所述的两级编译器流水线,使用完整代码源+曲轴或点火+涡轮风扇。
触发编译时,它将首先生成未优化的代码或点火字节码(可以非常快速地执行),然后,如果代码很热,它将触发优化的重新编译(速度较慢,但生成的代码更好)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句