🚀 从代码到执行:JavaScript代码如何在浏览器中运行

Image description

程序离开开发人员的编辑器后,会经过几次转换,然后才由 JavaScript (JS) 引擎执行:

流程摘要

  • 通过 Babel 进行转译:将现代 JavaScript 转换为旧版本以实现兼容性。
  • 通过 Webpack 打包:将转译的代码和项目资产捆绑成可部署的文件。
  • JS 引擎解析:将代码分解为标记并生成抽象语法树 (AST)。
  • Ignition 的字节码生成:将 AST 转换为字节码,以便进行有效解释。
  • Ignition 解释:执行字节码,实现快速程序启动。
  • TurboFan 的即时编译:将热代码优化为机器代码,以实现最佳性能。
  • 执行:优化后的机器代码由CPU直接执行。
  • 1. 通过 Babel 进行转译

  • 描述:Babel 是一种流行的工具,用于将现代 JavaScript 代码(使用最新的语言功能编写)转换为可在旧版浏览器或环境中运行的向后兼容版本。此过程称为转译。
  • 输出:转换后的 JavaScript 代码。
  • 2. 使用 Webpack 打包(以及其他构建过程)

  • 描述:Webpack 是现代 JavaScript 开发中常用的模块打包程序。它从 Babel 获取转译后的代码以及其他项目文件(样式表、图像等),并将它们打包成单个输出文件或多个文件,以备部署。
  • 输出:捆绑的 JavaScript 文件以及其他资产。
  • JS 引擎处理

    一旦捆绑的 JavaScript 代码被传送到 JS 引擎,就会发生以下步骤:

    3. 解析(标记化和 AST 生成)

  • 标记化(词汇分析):代码被分解成更小的单位,称为标记。每个标记代表一个特定的语法元素(例如变量、运算符或关键字)。
  • 语法分析(AST 生成):使用标记创建抽象语法树 (AST),该树表示代码的语法结构。此步骤还会检查程序中的语法错误。
  • 输出:代码的 AST 表示。
  • 4. Ignition 生成字节码(中间表示)

  • 描述:AST 由 Ignition 解释器处理,并转换成字节码(代码的紧凑中间表示)。此字节码旨在由引擎高效执行。
  • 输出:字节码已准备好由 Ignition 执行。
  • 5. 点火解释

  • 描述:上一步生成的字节码由 Ignition 解释器执行。通过直接解释字节码指令,可以快速启动程序。
  • 输出:执行字节码的结果。
  • 6. TurboFan 的即时编译

  • 描述:在执行过程中,会识别出经常使用的代码路径(热代码)。这些热路径由 TurboFan JIT 编译器进行优化,该编译器将字节码编译为目标平台的机器码。此步骤可显著提高热代码的性能。
  • 输出:优化的机器代码。
  • 7. 机器代码的执行

  • 描述:优化的机器代码由CPU直接执行,为程序提供最佳的性能。
  • 输出:最终的程序结果。
  • 执行管道中的关键概念

  • 标记化:在解析阶段将代码分解为可识别的单元(标记)。
  • AST 生成:创建代码的结构化表示以供进一步处理。
  • 字节码:用于 Ignition 快速解释的中间表示。
  • JIT 编译:TurboFan 将热代码编译为优化的机器代码,以便更快地执行。
  • 执行:JavaScript 代码产生其期望结果的最后阶段。
  • V8 引擎将解释和编译相结合,以平衡启动速度和执行性能。管道从 Ignition 的解析和字节码生成开始,然后进行解释,并通过 TurboFan 过渡到针对热门代码路径的优化机器码执行。这种动态方法可确保在现代应用程序中高效执行 JavaScript。