资料收集

初步了解

chrome v8是Google开发的开源高性能JavaScriptWebAssembly引擎,使用C++编写。

  • V8负责执行JavaScript代码,管理内存,以及进行垃圾回收。
  • V8引擎通过即时编译技术JIT技术优化代码执行效率,先将JavaScript源码转换为抽象语法树(AST),再转换为字节码,最终编译成优化的机器码执行。
  • V8可以独立运行,也可以嵌入到任何C++应用程序中,最著名的应用方案就是Node.js

chrome v8发展

  • 2008年V8发布了第一个版本,其性能远超同时期其他js解释器,例如:SpiderMonkeyJavaScriptCore。但是此时的V8是直接将js源码直接编译成机器码再执行,此时v8只有Codegen一个编译器,对于代码优化功能比较有限。(具体的过程先不深究)

image-20251013005547390

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

image-20251013082414157

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

image-20251013082838403

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

image-20251013082926474

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

image-20251013083039441

Chrome v8版本号

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

image-20251014155741323

Parser解析器

Ignition解释器

TurboFan优化编译器

Chrome V8项目文件架构