了解JavaScript引擎


作者:Seiya

时间:2019年05月29日


前言


当前为止,最通用的JavaScript宿主环境是网页浏览器。一个典型的浏览器有一个图形引擎和一个独立的JavaScript引擎。近几年来,在浏览器开发者之间展开了一场开发更快的JavaScript引擎的竞赛,而在这之前,JavaScript引擎仅简单地被当作能阅读执行JavaScript源代码的解释器。

现如今一些比较知名的js引擎有:SpiderMonkey(Mozilla),V8(Google Chrome),还有Safari的JavaScriptCore引擎。



JavaScript语言


JavaScript 从设计之初,它的目的就是解决一些脚本语言的问题,因为设计的能力有限,性能不需要重点考虑。但是 Web 技术的发展让 JavaScript 远远超出了之前的设计初衷。

JavaScript 语言的一些特性,导致了它将面临性能方面的巨大压力。比如动态类型,我们没办法在编译的时候知道变量的类型,所以只能在运行的时候才能确定。而在运行时计算和决定类型,带来了很严重的性能损失,这导致 JavaScript 语言的运行效率比 c++ 或者 Java 要低很多。


JavaScript引擎


JavaScript 引擎简单来讲,就是能够处理并执行 JavaScript 代码的执行环境。


一个 JavaScript 引擎通常包括以下几个部分:

  1. 编译器:

    主要工作时将源代码编译成抽象语法树,在某些引擎中还将AST转化成字节码。

  2. 解释器:

    解释器主要是接受字节码,解释执行这个字节码,同时也依赖垃圾回收机制。

  3. JIT工具:

    主要是将字节码或AST转换成本地代码,它需要依赖牢记。

  4. 垃圾回收器和分析工具(Profiler)

    负责垃圾回收和收集引擎中的信息,帮助改善引擎的性能和功效。


JavaScript引擎的编译流程

首先,JavaScript 引擎不会有大量的(像其他语言编译器那么多的)时间用来进行优化,因为与其他语言不同, JavaScript 的编译过程不是发生在构建之前的。

对于 JavaScript 来说,大部分情况下编译发生在代码执行前的几微秒(甚至更短!)的时间内。 简单地说,任何 JavaScript 代码片段在执行前都要进行编译(通常就在执行前),JavaScript 引擎用尽了各种办法(比如 JIT,可以延迟编译甚至实施重编译)来保证性能最佳。


JavaScript代码的编译和执行过程:

JavaScript代码编译过程



渲染引擎

网页工作过程中需要使用两个引擎,也就是渲染引擎和 JavaScript 引擎,从模块上看,它们是两个独立的模块,分别负责不同的事情:JavaScript 引擎负责执行 JavaScript 代码,而渲染引擎负责渲染网页,事实上并没有那么简单。


从上图可以看到,渲染引擎需要通过调用接口来使用 JavaScript 引擎来处理 JavaScript 代码获取结果。JavaScript 引擎也需要通过桥接接口访问渲染引擎构建的 DOM 树。

最后更新时间: 2019-7-7 21:55:38