问题描述
我阅读了 article 关于 JavaScript 引擎如何工作的内容,但有一点让我感到困惑,它说明了以下内容:
最后一步是真的吗? 以上 JavaScript 引擎的工作方式是否像“V8”一样?
解决方法
(此处为 V8 开发人员。)
是的,“现代”(自 2008 年以来)浏览器中使用的 JavaScript 引擎具有将 JavaScript 编译为机器代码的即时编译器。这大概就是那篇文章想说的。如果要区分“汇编语言”和“机器代码”这两个术语,则前者是人类可读的形式(例如mov eax,ebx
,由人类编写并由反汇编程序生成),后者将是CPU 理解的二进制编码形式(例如 0x89 0xD8
,由编译器/汇编器生成)。我想说的是“汇编代码”这个词已经足够模糊了,它既可以指代,也可以暗示您不想区分。
我发现您描述中的第三步更具误导性:字节码通常未优化。字节码解释器(如果存在)通常是引擎的第一个执行层,其目的是尽快开始执行,而不需要先花任何时间进行优化。如果一个函数运行得足够热,引擎最终会决定花时间将它优化为机器代码(取决于引擎,可能是连续几个越来越强大但成本高昂的编译器)。稍后,优化层可能会也可能不会将字节码作为输入;或者他们可以再次解析源代码来构建一个AST(以V8为例,它曾经是做后者,现在在做前者)。
旁注:那篇文章确实很愚蠢。示例:
内联(去除空格)等技术
这太错误了,简直太有趣了:-D