Chrome v8学习1
资料收集
- 参考博客:请说下V8、chrome、chromium三者之间的关系 - 王铁柱6 - 博客园
- 参考文章:即时编译 - 维基百科,自由的百科全书
- 参考课件:plctlab/v8-internals: 面向编译器开发人员的V8内部实现文档
- V8github仓库链接:v8/v8: The official mirror of the V8 Git repository
初步了解
chrome v8是Google开发的开源高性能JavaScript和WebAssembly引擎,使用C++编写。
V8负责执行JavaScript代码,管理内存,以及进行垃圾回收。V8引擎通过即时编译技术JIT技术优化代码执行效率,先将JavaScript源码转换为抽象语法树(AST),再转换为字节码,最终编译成优化的机器码执行。V8可以独立运行,也可以嵌入到任何C++应用程序中,最著名的应用方案就是Node.js
chrome v8发展
- 2008年
V8发布了第一个版本,其性能远超同时期其他js解释器,例如:SpiderMonkey、JavaScriptCore。但是此时的V8是直接将js源码直接编译成机器码再执行,此时v8只有Codegen一个编译器,对于代码优化功能比较有限。(具体的过程先不深究)

- 2010年
v8发布了另一个编译器,也就是Crankshaft编译器。其工作原理如下:Js函数通常会被Full-Codegen编译- 如果后续该函数会被多次执行,那么就会用
Crankshaft再重新编译,生产优化代码。但是Crankshaft对代码的优化有限

- 2015年
v8又再发布了一个优化编译器,TurboFan。此时的v8依旧是将源码编译为机器码的架构。这个架构存在的一个问题就是内存消耗较大,尤其是在移动设备上。

- 2016年
v8的架构开始改变,引入了Ignition解释器,重新引入字节码,减少内存使用。

- 2017年
v8发布全新编译的pipeline,其架构如下图所示。- 从
v8 5.9版本去除了Full-Codegen以及Crankshaft编译器。 - 现在这个架构最核心有三个,分别是解析器、解释器、优化编译器
- 简单介绍一下该架构下
js的执行过程,首先解析器会将js代码解析成抽象语法树(AST),解释器再将(AST)翻译为字节码边解释边执行。 - 在解释过程中,解释器还提供记录特定代码片段运行次数的功能,当特定代码运行次数达到一定程度时,会将该代码片段标记为热代码,并反馈给优化编译器
TurboFan。 TurboFan根据反馈信息优化并编译字节码,最终生成机器码,当再次执行该段代码时,就会直接使用优化后的机器码。
- 从

Chrome v8版本号
- 直接打开
谷歌浏览器,输入网址chrome://version/,会看到V8的版本以及谷歌浏览器的版本。V8的版本号定义形如x.y.z.w- 其中
x.y是由谷歌浏览器的主版本号除以10得到的,比如图中的谷歌浏览器主版本号为143除以10就是14.3。 - 而
z每出现新的 LKGR(Last Known Good Revision)(最后一个已知良好版本)时自动递增。 - 而
w分支点后回合并补丁次数(其实就相当于补丁号)
- 其中

Parser解析器
Ignition解释器
TurboFan优化编译器
Chrome V8项目文件架构
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 iyheart的博客!

