V8引擎详解(四)——字节码是如何执行的

前言

本文是V8引擎详解系列的第四篇,重点内容是关于V8是如何解释执行字节码的,关于字节码的执行在V8中所处的环节能够先看一下做者以前的V8引擎详解(三)——从字节码看V8的演变,本文会经过描述一个官方的例子来帮助你们理解,文末会有已经完成的系列文章的连接,本系列文章还在不断更新欢迎持续关注。前端

字节码的执行

简单来讲V8引擎一般会通过一下流程:源码 --> AST --> 字节码 --> 二进制代码,源码经过 Parse 转成AST的过程已经在系列V8引擎详解(二)——AST 中描述过了,接下来会经过v8 BytecodeGenerator类根据抽象语法树将AST结构转换成字节码的结构,字节码是机器码的抽象,字节码的相关内容能够看一下从字节码看V8的演变, 而Ignition引擎对生成的字节码进行解释执行。node

1、基于寄存器

Ignition引擎能够对字节码进行解释执行,那就是说他的功能相似于Java的JVM,本质上就是一个虚拟机。 虚拟机一般有两种分别是基于Stack(栈)的和基于Register(寄存器)的, 好比基于Stack的虚拟机有JVM,是一种比较普遍的实现方法,而咱们V8引擎中的Ignition是基于Register的,也就是基于寄存器的虚拟机,一般基于Register的虚拟机比基于Stack的虚拟机执行的更快,可是指令相对较长。程序员

Ignition是一个带有累加器(accumulator)的寄存器,我举一个小例子你们就明白了。 咱们先抛开字节码看这段简单的代码如何计算出结果。面试

var x = 100;
var y = x +10;
x = x * y;
复制代码

运用累加寄存器的大体运行流程以下:缓存

这种就是咱们基于寄存器虚拟机运行的一个大体流程,简单来讲就是建立一块虚拟空间来保存参数、中间计算结果。bash

2、经过官方案例解读字节码

接下来会经过Google官方PPT上面的一段案例来解读V8上字节码的执行。我会逐图配上一些文字注解帮助你们阅读。babel

  • 先将源码转换成字节码 框架

  • 进行函数 f 的初始化工做 ide

  • 将小整数 -100 存储到累加器中,LdaSmi 能够理解为一个定义好的handle函数 后面接的 #100 就是这个函数的参数 函数

  • 将a2中存储的150和累加器中的值求和,并将结果存于累加器 。

  • 将累加器中存储的50保存到寄存器r0中,此时r0的值为50。

  • 将寄存器a1也就是参数b的值存储到累加器中,此时累加器值为2。(a0、a一、a2 也是寄存器)

  • 将寄存器r0中的值和累加器中的值求乘积,并将结果存于累加器。

  • 将寄存器a0中的值和累加器中的值求和,并将结果存于累加器。

  • Return (包括上面的语句)自己都是定义好的handle函数,Return表明的就是将累加器中的值返回。

(随着v8版本的更新,不一样的版本生成的字节码结构可能有细微差异,可是这些定义好的函数通常不会有太大变化)

经过这个例子相信你们能够大概了解字节码的执行,可是v8定义的关键字可不止例子中这一点(完整的放在附录中了),在学习的过程当中开始不少关键字也确实很差理解,不过咱们能够经过本身写一些简单的js代码而后生成字节码,由于咱们已知js的执行结果,能够经过倒推的方式来理解字节码。

总结

本文主要带你们简单了解了v8是如何解释执行字节码的。

有人问我,做为一个前端学习这些东西到底有什么用?这些东西还没那么容易理解,有这个时间不如多刷两道题、看看面试问题、看看框架。
从短时间来看学习V8引擎并不能明显的提升面试的能力,可是万丈高楼平地起,想成为一个优秀的前端程序员v8引擎的学习能帮助你更加深入的理解js中的一些事情,好比经过对AST的学习更加了解了babel的工做原理,为何一个页面第二次加载比第一次快(不只仅是静态资源的缓存哦),为何node选择了v8做为js引擎,若是不能深刻的了解一下,也只是在复述别人得出的结论而已。

我在写本章的时候,想起来我面试被问的一道问题switch为何比if else快,当时回家查了一下相关文章发现有人说switch跳表巴拉巴拉的,我专门转成了字节码看了一下,发现起码在正常的v8环境中switch比if else快纯属扯淡,从字节码上发现,绝大部分条件下两个几乎都是同样快,若是有兴趣能够本身玩一下。

V8字节码表

参考文章

docs.google.com/presentatio…
time.geekbang.org/column/arti…

系列文章

V8引擎详解(一)——概述
V8引擎详解(二)——AST
V8引擎详解(三)——从字节码看V8的演变
V8引擎详解(四)——字节码是如何执行的
V8引擎详解(五)——内联缓存
V8引擎详解(六)——内存结构

相关文章
相关标签/搜索