话接上一章,我们知道了由于JavaScript
每次执行都要翻译成中间代码,当JS的越来越繁杂时就必须出现一个更高性能的解释器去解析JS。
1.V8脚本引擎的由来。
2. V8脚本引擎的演进。
3. V8核心模块:解析器,解释器,优化编译器。
V8脚本引擎的演进
2008 年 V8 发布了第一个版本,性能远超同时期竞争对手(如 SpiderMonkey、JavaScriptCore),关注度颇高。
当时 V8 架构比较激进,直接将 JavaScript 代码编译为机器码并执行,所以执行速度很快,但在该架构中,V8 只有 Codegen 一个编译器,对代码的优化很有限。
所以,2010年,V8发布了Crankshaft编译器,JavaScript函数通常会先被Full-Codegen编译,如果后续该函数被多次执行,那么就用Crankshaft再重新编译,生成更优化的代码,之后使用优化的代码执行,进一步提升性能。
但是Crankshaft对代码的优化有限,所以2015年V8中加入了TurboFan。
不过这时,V8依旧是直接将源码编译为机器码的架构,这种架构存在的核心问题:内存消耗特别大。尤其是在移动设备上,通过 Full-Codegen 编译出的机器码几乎占整个 Chrome 浏览器的三分之一,这样为代码运行时留下的内存就更少了。
于是 2016 年 V8 加入了 Ignition 解释器,重新引入字节码,旨在减少内存使用。
2017 年,V8 正式发布全新编译 pipeline,即用 Ignition 和 TurboFan 的组合,来编译执行代码,从 V8 5.9 版开始,早期的 Full-Codegen 和 Crankshaft 编译器不再用来执行 JavaScript。
其中,最核心的是三个模块:
解析器(Parser)
解释器(Ignition)
优化编译器(TurboFan)
下一章我们从解析、解释、编译三部分出发,学习 V8 中 JavaScript 代码的执行原理。
如果此文章对您有帮助或启发,那便是我的荣幸