聊聊V8引擎

V8 是什么

	V8 是 Google 开源的 JavaScript 引擎。可以理解为:V8 将程序员写的代码,最终解析成机器码能够让计算机识别。其中的具体操作,就是 V8 干的事。
	我们把 V8 看成一个黑盒, 程序语言进去,通过黑盒子的处理,经过一系列操作后,解析成机器码。【V8被广泛用于各种JavaScript执行环境。】
	了解V8,对于性能优化的思考会有更多理解和方向。能够更轻松理解babel语法分析原理,eslint语法检查机制,前端框架的底层实现。

V8的发展

  • 第一个版本的特点:由 JavaScript 直接转成 机器码。因此执行速度很快。但是只有一个编译器「Codegen」来处理,所以优化很有限。
  • 第二个版本的特点:有两个编译器。会先被编译器「Full-Codegen」编译,多次执行的部分会通过优化编译器「Crankshaft」生成更优的代码。
  • 第三个版本有三个编译器。

但是上面三个版本的V8本质上都是 「由 JavaScript 直接转成 机器码」的核心。
这个核心的特点是:执行速度快,内存消耗非常大。

于是后来加入了编译器「lgnition」,用来引入了字节码,达到减少内存使用的目的。

V8 的最新版本大概长这样:

聊聊V8引擎_第1张图片

V8 引擎的运行过程:

  • 首先通过解析器「Parser」将 JavaScript 解析成 AST
  • 然后解释器「lgnition」会将AST翻译成字节码。此阶段边解释边执行。同时解释器「lgnition」会记录特定代码段的执行次数,当运行次数达到一定值「称为阈值」,解释器「lgnition」就会将该段代码标记为热代码,并将信息反馈给优化编译器「TurboFan」。
  • 优化编译器「TurboFan」会对标记的代码段进行优化,最终生成优化后的字节码。这样当该段代码需要再次执行时,就会直接使用优化后的机器码执行,不用再进行解释编译。从而大大提高代码运行效率。

V8的解析过程:

V8 只有等编译完成后才能运行代码。所以解析和编译过程的性能很重要。V8 的整个解析过程分两个部分:词法分析和语法分析。
聊聊V8引擎_第2张图片

  • 词法分析:将字符流「即一行行的代码」转换为 tokens「即不能再分割的最小单位,可能是单个字符,也可能是字符串」。
所以写代码的时候,注意尽可能地减少代码数量,代码行数,精简代码,有利于性能优化。成熟的开发者,应该追求精简优雅的代码。这样可以减少词法分析的工作量。
  • 语法分析:根据语法规则,将 tokens 组成一个有嵌套层级的抽象语法结构树「即 AST」,在此过程中,如果源码不符合语法规范,解析过程就会终止,并抛出语法错误。图中的 Parser 和 Pre-Parser 都是 V8 的语法分析器。

如果一次性全部解析出来所有代码,会占用磁盘空间,也非常消耗内存,并且执行的时间会很长。
所以存在预解析,比如当词法分析阶段读到函数声明时,因为函数不需要立即执行,所以会进行预解析。「即只解析函数声明,不解析函数内部的代码,不会为函数生成AST」。 Pre-Parser 就是用来预解析的。当函数调用的时候才会真正开始解析生成AST。最终会将AST转成字节码。

你可能感兴趣的:(JavaScript,javascript,v8)