📜  JavaScript 引擎内部发生了什么?

📅  最后修改于: 2022-05-13 01:56:25.620000             🧑  作者: Mango

JavaScript 引擎内部发生了什么?

JavaScript是一种基于多范式原型的语言,它使用JavaScript 引擎,如 Chrome 的 V8 引擎 Firefox SpiderMonkey 引擎等。它们将高级代码转换为机器可读的代码,让计算机执行一些特定的任务。我们将使用图像来理解这一点。

Google chrome 的 JavaScript V8 引擎:首先,原始 JavaScript 文件进入Parser

  • 解析器:它检查语法语义解析器只不过是一种词法分析,它导致将代码分解为标记以理解它们的含义,并且这些标记被转换为抽象语法树(AST)。
  • 抽象语法树:它是程序表示的分层树状结构,允许解释器理解程序。这个 AST 最初是交给Interpreter的。
  • 解释器:它让AST被转换成字节码。在V8 引擎中,这个过程称为点火,但是当一些代码一次又一次地重复时。
    例如:
javascript
// Arrow function
const multiply = (a, b)=> a*b;
 
for(let i=0;i<1000;i++){
    console.log(multiply(4, 3));
}


  • 在上面的代码中,我们调用了 multiply()函数1000 次。当这段代码进入解释器时,解释器的性能下降了,因为解释器不得不一次又一次地重复这段代码,然后分析器会将这段代码标记为温暖并开始行动。
  • Profiler:它将检查可以优化的重复代码。一旦获得重复代码,它基本上将代码移动到编译器中。
  • 编译器:它吐出最优化的字节码。在上述情况下,它将看到重复代码并通过将 multiply(4, 3) 替换为 12 来优化代码,因为它会一次又一次地重复,它将生成优化的字节码,该字节码会被较慢的字节替换解释器生成的代码。在 V8 引擎中,这个编译器被称为TurboFan 。这个过程一次又一次地重复,这意味着 JavaScript 引擎的速度得到了提高,因为分析器和编译器将生成和更新优化的字节码。

Mozilla 的 SpiderMonkey JavaScript 引擎: SpiderMonkey 是由JavaScript 的创造者 Brendan Eich创建的第一个引擎。他于 1995 年在 Netscape Communication 创建了这个引擎,现在它由 Mozilla Foundation 维护。我们将使用图像来理解这一点。

蜘蛛猴通过编译器将主要的 JS 代码转换为字节码,然后字节码进入InterpreterJIT Compiler两段。
Mozilla 的 SpiderMonkey Engine 三件事很重要,如下所示:

  • 解释器:使用 switch 语句跳转到当前指令的适当代码块。 JS-to-JS函数调用推送 JavaScript 堆栈帧,而不增加 C 堆栈。但是由于 JS-to-C-to-JS 调用堆栈很常见,解释器是可重入的。
  • IonMonkey JIT Compiler:主要用于代码优化。
  • 垃圾收集器:用于回收程序不再使用的对象使用的内存。 GC 是一种标记和清除的非保守收集器。它用于保存 JS 对象和字符串描述符。

Chrome V8 与 Mozilla 的 Spider Monkey 之间的区别: chrome 的 V8 引擎和 Mozilla 的 SpiderMonkey 之间的主要区别在于 ECMAScript 一致性 Test262,它用于检查 JavaScript 实现与 ECMA International 创建的 ECMAScript 第 5 版规范标准的紧密程度。该测试由数千个单独的测试组成,用于检查规范的要求。
一致性测试:

Chrome 的 V8 引擎 -> 98%

Mozilla 的 SpiderMonkey -> 87%