JavaScript 代码是否转换为汇编代码?

问题描述

我阅读了 article 关于 JavaScript 引擎如何工作的内容,但有一点让我感到困惑,它说明了以下内容

  1. 首先解析 JavaScript 代码
  2. 转换为字节码的源代码
  3. 字节码得到优化
  4. 代码生成获取字节码并转换为低级汇编代码

最后一步是真的吗? 以上 JavaScript 引擎的工作方式是否像“V8”一样?

解决方法

(此处为 V8 开发人员。)

是的,“现代”(自 2008 年以来)浏览器中使用的 JavaScript 引擎具有将 JavaScript 编译为机器代码的即时编译器。这大概就是那篇文章想说的。如果要区分“汇编语言”和“机器代码”这两个术语,则前者是人类可读的形式(例如mov eax,ebx,由人类编写并由反汇编程序生成),后者将是CPU 理解的二进制编码形式(例如 0x89 0xD8,由编译器/汇编器生成)。我想说的是“汇编代码”这个词已经足够模糊了,它既可以指代,也可以暗示您不想区分。

我发现您描述中的第三步更具误导性:字节码通常未优化。字节码解释器(如果存在)通常是引擎的第一个执行层,其目的是尽快开始执行,而不需要先花任何时间进行优化。如果一个函数运行得足够热,引擎最终会决定花时间将它优化为机器代码(取决于引擎,可能是连续几个越来越强大但成本高昂的编译器)。稍后,优化层可能会也可能不会将字节码作为输入;或者他们可以再次解析源代码来构建一个AST(以V8为例,它曾经是做后者,现在在做前者)。


旁注:那篇文章确实很愚蠢。示例:

内联(去除空格)等技术

这太错误了,简直太有趣了:-D