什么是 JavaScript 引擎

简单来讲,就是能够将 Javascript 代码处理并执行的运行环境。

JavaScript 语言是一种解释性脚本语言,因此在运行时,需要先将代码转变成抽象语法树,然后在抽象语法树上解释执行。

当然为了提高 js 的执行速度,同时随着 JIT (Just In Time)的技术引入,现在的 js 引擎大多会做一些性能优化,就是在执行前会将抽象语法树再转成一个中间表示(这个中间表示可能是字节码,也可能是直接转成本地代码)。这样就会极大的提高代码的执行速度。

不过 js 从抽象语法树转成中间表示的过程都是处在代码执行阶段的(解释性语言并不像编译性语言那样,编译和执行是分开的),所以在代码执行阶段进行额外的转换本身也是需要开销的。

综上描述,一个 JavaScript 引擎一般需要包括以下几个部分

  • 编译器。主要工作是将源代码编译成抽象语法树,在某些引擎可能还包含了将抽象语法树转换成中间表示(字节码)。
  • 解释器。在某些引擎中,解释器主要是接收字节码,解释执行这个字节码,同时也依赖垃圾回收机制等。
  • JIT 工具。一个能够 JIT 的工具,将字节码或者抽象语法树转换成本地代码。
  • 垃圾回收器和分析工具。它们负责垃圾回收和收集引擎中的信息,帮助改善引擎的性能和功效。

JavaScript 引擎和渲染引擎

之前在说 DOM 树的构建的时候,了解过在 HTML 解释器的工作过程中,可能会有 JavaScript 代码需要执行,而渲染引擎主要负责渲染页面。js 引擎提供调用接口给渲染引擎,以便让渲染引擎使用 js 引擎来处理 js 代码并获取结果。渲染引擎同时需要提供桥接接口让 js 可以访问 DOM。它们之间属于互相调用的关系。