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的博客!