V8 引擎执行机制
约 746 字大约 2 分钟
2026-02-26
编译器和解释器
由于计算机无法直接解析代码,所以程序在执行前,需要把代码进行 "翻译",这个翻译的过程就需要借助编译器和解释器。代码翻译过程中,使用编译器的被称为编译型语言,使用解释器的被称为解释型语言
编译型语言在程序执行前,需要经过编译器编译,编译后会直接保留二进制文件,每当程序运行时,可以直接运行二进制文件,无需再次编译

解释性语言在每次运行时都需要通过解释器对程序进行动态解释和执行

V8 执行机制
V8 引擎在解析执行 JavaScript 的过程中既需要使用 解释器 Lgnition,也需要使用编译器 TurboFan

词法分析(Tokenize)
源代码会被解析器拆解程一个个的 "词法单元 Token"(关键字、标识符、字面量、操作符等最小语法单元)

token 示意 语法分析(Parse)
Token 按语法规则组合成 AST(抽象语法树),如果语法不合法,解析阶段就会抛错并中止
AST 结构
var myName = 'ZhaoJiSen' function foo() { return 23 } myName = 'zjs' foo()
AST 结构 生成字节码
Ignition 根据 AST 生成字节码。字节码是介于 AST 和机器码之间的中间表示,便于解释执行。一旦代码开始执行,V8 引擎遍会为当前执行环境创建执上下文
解释执行字节码
重要
首次执行时,Ignition 会按字节码逐条执行,并收集运行时反馈信息。如果发现有热点代码(HotSpot),那么后台的编译器就会把该热点代码编译为高效的机器码,当再次执行这段代码时,只需执行编译后的机器码,这样就提升了代码执行的效率
字节码配合解释器和编译器这种技术被称为即时编译(JIT)。具体到 V8 引擎中,就是 Lgnition 在解释执行字节码的同时,收集代码信息,当它发现某一部分代码 "变热" 了之后,TurboFan 开始工作,把热点的字节码转换为机器码,并把转换后的机器码保存起来,以备下次使用
Ignition 和 TurboFan
Ignition是 "点火器",表示先把程序点起来TurboFan是 "涡轮增压",表示热点路径再提速
图解流程

JIT 技术
