v8的工作原理

145 阅读2分钟

v8引擎的工作原理:

v8是blink的内置JavaScript引擎,Blink 是谷歌浏览器的渲染引擎 先来看张图:

e0cf9f3b0419b99e8b8b51e499dda7dd.png

要想了解v8的工作原理,我们得先了解几个重要的模块:

Scanner 扫描器

Scanner 用于对纯文本的 JavaScript 代码进行词法分析,它会将js代码分析为tokens

注意,token为不可再分的最小单位,可能是单个字符,也可能是一个字符串

Parser 解析器

Perser会将tokens集合解析为抽象语法树AST(Abstract Syntax Tree), 解析过程是一个语法分析的过程,同时会验证语法,如果有错误就会抛出语法错误; 这里可分为 预解析 和 全量解析,

预解析pre-parsing: Layze有以下特点

  • 预解析会跳过未被使用的代码
  • 不会生成 AST,会产生不带有变量引用和声明的 scopes 信息
  • 解析速度快
  • 根据规范抛出特定的错误 全量解析Full-parsing: Eage: 它会解析所有立即执行的代码。
  • 解析被使用的代码
  • 生成 AST
  • 构建具体的 scopes 信息,变量的引用,声明等
  • 抛出所有的语法错误 因此使用预解析是一种有效的优化手段

Ignition 解释器

Ignition将形成的AST语法树转换成字节码,也就是(bytecode),并且收集下一阶段(编译)所需的信息,可以理解为预编译的过程

TruboFan 编译器

TruboFan将字节码编译为汇编代码,也就相当于执行的过程, Ignition 收集大量的信息,交给 TurboFan 去优化,多方面条件都满足的情况下,会被优化成机器码,这个过程称为 Optimize,当判断无法优化时就会触发去优化「De-optimize」操作,这些代码逻辑会重新回到 Ignition 中称为字节码。

在这个过程中,有一个建议能够帮助我们避免去优化操作,从而提高代码执行效率。那就是不要总是改变对象类型。 所以保持函数的参数类型不变是一种优化手段,也是typescript的作用之一

Ignition + TruboFan是v8的黄金组合,边解释边执行,也是v8的未来

Orinoco 垃圾回收器

执行完毕内存中会有许多用不到的垃圾,垃圾回收器就是用来处理这些垃圾的,

垃圾回收器会定期的执行以下任务

  • 标记活动对象,和非活动对象「标记阶段」
  • 回收被非活动对象占用的内存空间「清除阶段」
  • 合并或者整理内存「整理阶段」