揭开使用 V8 作为目标引擎🔬的 JavaScript 代码处理的神秘面纱

81 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 18 天,点击查看活动详情

第 1 阶段:编写 Js 代码

你写你的 Js 代码,例如:

 function checkIsAValidObject(obj){
    return typeof obj == "object" && !Array.isArray(obj)
  }

第 2 阶段:主机环境设置

您将代码带到JavaScript host-env,例如浏览器/节点。主机将执行我们所说的“初始时间分支”,在初始时间分支期间,它获得运行JavaScript代码所需的组件,例如核心V8引擎,API(例如DOM API,libuv API)。

第 3 阶段:编译

  • 您的JavaScript代码被编译为AST(抽象语法树)。 它是我们的ISA(指令集架构)机器/引擎可以处理的格式,这个想法类似于你想使用Theo-design-token-engine从一个样式模型编译到另一个样式模型,例如从CSSXML样式,这意味着你必须在一个theo理解的模型中编写。如果您希望查看 AST 的实际应用,这里有一个链接:单击我

到 AST 的 Js 代码示例

图像描述

  • 将代码转换为 AST 后,接下来就是提升表达式和语句。

阶段 4:从 AST 代码生成可执行字节码

在这个阶段,JavaScript引擎采用AST代码并按照指令集架构生成一个字节码。对于 v8 引擎,我们使用 ARMV8,它是一个框架(我称之为框架,因为它专注于特定的机器和特定的指令架构类型),它实现了精简的指令集。这些可执行字节是 CPU 理解和解码的指令(将其视为一种语言)。注意,CPU不能执行这条指令(它们通常是十六进制格式0-f),CPU所做的是从内存中拉出我们的指令并将其解码为0-1(这是CPU理解的语言)。因此,在您的脑海中,在 CPU 将其解码/转换为 0-1 的机器代码之前,CPU 无法理解简化或复杂的指令。

为 Js 代码生成可执行字节码

我将使用 macOS 进行采样:

brew install v8
run: d8 --print-bytecode your-js-file-absolute-path.js

如何为 Js 代码生成可执行字节码的示例

Js 代码

图像描述

安装 v8

图像描述

生成字节码

图像描述

第 5 阶段:解释和执行

这是我们一直在等待的阶段。这就是编译语言和可解释语言的区别。当你听到一种可解释的语言时,这并不意味着你的程序没有被编译为指令,而是意味着你编写了你的程序,把它发送到你的语言运行时,语言引擎在执行时为你做编译。另一方面,编译后的语言需要编译为指令,然后发送到需要它的机器上(例如发送Java Jar可执行文件以在android OS上运行)。

在这个阶段,JavaScript引擎通过逐行运行每个指令来执行可执行文件,例如它发送一条指令,说**创建一个名为name的原始变量并为其分配值“Emmanuel”。 **计算机将执行指令,简单来说,这意味着告诉计算机做你想做的事(我可以写一篇关于现代计算机如何构建来处理指令的详细文章。如果文章对您有用,请随时在下面的部分中发表评论)。

第 6 阶段:热优化阶段

这个阶段更多的是优化,缓存常用的字节码。Js 引擎将存储经常解释的结果,因此计算机不需要重新处理它。bytecode

总结

  • 你写 Js 代码
  • JavaScript 引擎将你的 Js 代码转换为字节码指令(0-f)
  • 计算机CPU(通常是控制单元)将字节码指令转换为机器码(0-1)
  • 然后计算机执行机器代码
  • 然后你得到执行的结果