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

📅  最后修改于: 2023-12-03 14:42:33.853000             🧑  作者: Mango

JavaScript 引擎内部发生了什么?

JavaScript 引擎是用来执行 JavaScript 代码的程序,它是现代浏览器中的核心组件。在本文中,我们将深入了解JavaScript引擎内部发生了什么,以帮助程序员更好地理解它。

前置知识

在探索 JavaScript 引擎内部之前,我们需要了解一些前置知识,这对于理解JavaScript引擎架构以及避免常见错误非常重要。

抽象语法树

抽象语法树(Abstract Syntax Tree,AST)是代码的抽象表示形式。当 JavaScript 代码被解析时,它被转换成 AST。AST 由节点构成,每个节点表示语句、表达式或声明。

变量对象

变量对象(Variable Object,VO)是 JavaScript 引擎内部的一个数据结构,它用于存储所有声明的变量和函数。当执行 JavaScript 代码时,引擎会创建变量对象,并将变量和函数添加到它的作用域链中。

作用域

作用域指的是代码的可访问变量的区域。在 JavaScript 中,每个函数都有自己的作用域,这个作用域是由函数的参数、局部变量和内部函数组成的。作用域链是一个对象列表,它用于查找可访问的变量和函数。

JavaScript 引擎架构

JavaScript 引擎通常由三个主要组件组成:

词法分析器

词法分析器(Lexer)负责将 JavaScript 代码分成一个个 token,它会跳过代码中的空格和注释,并将标识符保存到 AST 中。例如,下面的代码:

function foo(x) {
  return x + 1;
}

会被转换成下面的 token:

[
  { type: "keyword", value: "function" },
  { type: "identifier", value: "foo" },
  { type: "punctuation", value: "(" },
  { type: "identifier", value: "x" },
  { type: "punctuation", value: ")" },
  { type: "punctuation", value: "{" },
  { type: "keyword", value: "return" },
  { type: "identifier", value: "x" },
  { type: "operator", value: "+" },
  { type: "numeric", value: "1" },
  { type: "punctuation", value: ";" },
  { type: "punctuation", value: "}" },
]

解析器

解析器(Parser)负责将 token 转换成 AST。当遇到一个函数或语句时,解析器会创建一个 AST 节点,并将其添加到 AST 中。解析器还负责检查语法错误,并发出警告或错误信息。

执行器

执行器(Executor)负责执行 AST,它通过按照顺序遍历 AST 节点来执行 JavaScript 代码。当执行器遇到一个变量或函数时,它会先查找变量对象,然后按照作用域链查找变量。

JavaScript 代码执行过程

当 JavaScript 引擎执行 JavaScript 代码时,会按照以下步骤执行:

  1. 词法分析器将 JavaScript 代码转换成一系列 token。
  2. 解析器将 token 转换成 AST。
  3. 执行器按照顺序遍历 AST 节点,并执行 JavaScript 代码。当执行器遇到一个变量或函数时,它会先查找变量对象,然后按照作用域链查找变量。如果变量或函数没有找到,则会发生引用错误。
  4. 执行器将结果存储在变量对象中,并将其传递给上下文。当函数返回时,执行器会更新变量对象和上下文。
JavaScript 引擎优化

JavaScript 引擎为了提高代码的执行效率,会进行一些优化。下面是一些常见的优化技术:

JIT 编译

即时编译(Just-In-Time Compilation,JIT)是一种在代码运行时进行编译的技术。JIT 编译器会将 JavaScript 代码编译成机器码,并缓存编译结果以加快代码的执行速度。

内联缓存

内联缓存(Inline Cache,IC)是一种缓存变量或函数的引用,以加快查找速度。当 JavaScript 引擎执行代码时,它会根据变量或函数的类型创建一个内联缓存,并使用它来快速查找变量或函数。

垃圾回收

垃圾回收(Garbage Collection,GC)是一种自动管理内存的技术。当 JavaScript 引擎执行代码时,它会分配内存并在不再使用时回收内存。GC 算法可以快速识别不被引用的对象并将其删除,以释放内存。

总结

JavaScript 引擎是用来执行 JavaScript 代码的程序,它由词法分析器、解析器和执行器组成。当执行 JavaScript 代码时,引擎会按照顺序遍历 AST 节点,并执行 JavaScript 代码。引擎还通过 JIT 编译、内联缓存和垃圾回收等技术来提高代码的执行效率。如果你希望更深入地了解 JavaScript 引擎的工作原理,请参阅相关文档和书籍。