V8如何执行JavaScript代码

113 阅读2分钟

什么是V8?

V8是一种JavaScript虚拟机;

JavaScript虚拟机可将人类能够理解的编程语言 JavaScript,翻译成机器能够理解的机器语言:

V8之前,所有的 JavaScript 虚拟机所采用的都是解释执行的方式,这是 JavaScript 执行速度过慢的一个主要原因。而 V8 率先引入了即时编译(JIT)的双轮驱动的设计,这是一种权衡策略,混合编译执行和解释执行这两种手段,给 JavaScript 的执行速度带来了极大的提升。

V8引入了惰性编译、内联缓存、隐藏类等机制,进一步优化了 JavaScript 代码的编译执行效率。

V8如何执行JavaScript代码?

计算机执行高级语言的两种基本的方式

  • 解释执行

    img

    解释执行的启动速度快,但是执行时的速度慢

  • 编译执行

    img

    编译执行的启动速度慢,但是执行时的速度快

V8执行JavaScript代码的方式

V8 并没有采用某种单一的技术,而是混合编译执行和解释执行这两种手段,这种混合使用编译器和解释器的技术称为 JIT(Just In Time)技术。

img

如图可以看出V8 执行一段 JavaScript 代码所经历的主要流程包括:

  • 初始化基础环境:V8 启动执行 JavaScript 之前,它还需要准备执行 JavaScript 时所需要的一些基础环境,这些基础环境包括了“堆空间”“栈空间”“全局执行上下文”“全局作用域”“消息循环系统”“内置函数”等
  • 解析源码生成 AST 和作用域。
  • 依据 AST 和作用域生成字节码。
  • 解释执行字节码。
  • 监听热点代码:如果发现了某一段代码会被重复多次执行,那么监控机器人就会将这段代码标记为热点代码。
  • 优化热点代码为二进制的机器代码:当某段代码被标记为热点代码后,V8 就会将这段字节码丢给优化编译器,优化编译器会在后台将字节码编译为二进制代码。
  • 反优化生成的二进制机器代码:某些被优化的结构可能会被 V8 动态修改了,这会导致之前被优化的代码失效,如果某块优化之后的代码失效了,那么编译器需要执行反优化操作。