0. V8介绍
官方文档这么介绍:V8是谷歌开源高性能JavaScript和WebAssembly引擎,用C++编写。它主要用在Chrome和Node.js中,等等。
简单的来说,我们知道,JavaScript是解释型的语言,需要逐行解释执行
V8则是一种C++开发的JavaScript解释器,它将JavaScript编译成可执行代码,即机器码。
1. V8工作流程概述
JavaScript是解释型的语言,解释型的语言先天就有执行效率上的不足。为此,V8引擎同时采用了解释执行和编译执行这两种方式,也就是在解释执行的同时进行编译,这种方式称为JIT (Just in Time) 即时编译。
解释执行:V8在执行JavaScript源码时,会先通过解析器Parser将源码解析成AST,解释器Ignition会将AST转化为字节码,一边解释一遍执行。
即时编译:Ignition同时会记录某一代码片段的执行次数,如果执行次数超过了某个阈值,这段代码便会被标记为热点代码(HotSpot),同时将运行信息反馈给优化编译器TurboFan,会将这部分热点代码的字节码优化并编译,生成机器码更高效地运行。
graph LR
源代码 --Parser--> AST
AST --Ignition--> 字节码
字节码 --Ignition--> 逐行解释为机器码执行
字节码 -.Ignition高频执行.-> HotSpot
HotSpot --TurboFan--> 编译为机器码执行