2. 编译与执行分层
V8 不会一上来就把所有 JS 编译成最强机器码,因为这样启动慢、内存高。它采用 分层执行:先快启动,再按热度逐步优化。
四层执行链路
- Ignition:解释器,把 JS 编译成字节码并解释执行,启动快。
- Sparkplug:Baseline 编译器,从字节码快速生成机器码,优化少但省掉解释器分发开销。
- Maglev:中层优化,适合已经变热但还不值得重度优化的函数。
- Turbofan:最高优化层,做内联、类型推测、逃逸分析等深度优化。
为什么不是直接 Turbofan
Turbofan 编译成本高。如果冷代码也走重优化,用户会先感受到编译卡顿,而不是执行变快。
所以 V8 的策略是:
- 冷代码:解释执行,减少启动成本。
- 温代码:快速 baseline。
- 热代码:根据反馈信息进入 Maglev / Turbofan。
反馈驱动优化
V8 会在执行过程中收集类型和对象形状信息,例如属性访问、函数参数类型、IC 状态等。优化编译器基于这些反馈做推测。
如果后续运行打破了假设,例如类型突然变化,就会触发 deopt,从优化代码回退到更保守的层。
OSR
OSR 是 On-Stack Replacement,意思是在函数还没返回时,把正在执行的栈帧切换到优化代码。
它主要解决热循环问题:一个大循环可能运行很久,如果必须等函数返回后才能优化,优化代码就用不上。
总结
V8 的性能来自分层执行和反馈优化:Ignition 保启动,Sparkplug 降解释成本,Maglev 做中等优化,Turbofan 负责重优化;推测失败时通过 deopt 保证语义正确。