JavaScript如何转换为字节码?

28

我在网上找不到有关W3C语言如何编译成机器代码的信息。我知道Web和处理器之间的差距一定与浏览器有关,但它是如何工作的,JavaScript被执行到处理器需要经过哪些步骤呢?

同时,科学文献链接也将不胜感激。


1
这是Google托管其v8 JavaScript引擎的地方。顺便问一下,你想知道这个的原因是什么? - TJHeuvel
7
JavaScript不是W3C语言。它(或者更确切地说,是ECMAScript)是一种ECMA-International标准。 - Quentin
1
每个引擎都有不同的实现方式,而且并非所有引擎都是浏览器的一部分。没有一个单一的规范来说明JavaScript应该如何转换成字节码,但是每个引擎都有自己的方法。 - kojiro
2
@TJHeuvel:哇,这是一个非常微小的区别,我肯定不会对此进行降低或关闭投票。对我来说,关于编程语言的问题本质上就是关于编程或足够接近的问题。(无论如何,这更多是关闭投票而不是降低投票的原因,但让我们不要纠缠。 :-) ) - T.J. Crowder
2
我只想补充一下,我最初在这里提出了问题http://cstheory.stackexchange.com/questions,他们把我送回到这里 :) - 最白目
显示剩余5条评论
5个回答

32

这取决于实现方式; 规范 是语言及其正常工作的完整描述,实现可以以任何希望的方式满足该实现。 有些实现(从外部看)似乎仅作为旧版意义上的解释器运行; 其他实现可能会编译成字节码或不编译; V8(Chrome、Chromium、Brave、Node.js 等中的 JavaScript 引擎)曾经将其编译成机器码(两次,对于应用程序中的热点),但现在开始解析成字节码并在解释器中运行它,并且只在需要时编译热点 (详情)。(还有一种 V8 模式,其中它解释,他们正在尝试在运行时不能编译的环境中使用,例如 iOS,因为非苹果应用程序无法分配可执行内存。)

V8团队定期发布有关如何实现V8惊人速度的描述。您可以在V8博客上找到其中的一些。
当然,您也可以研究任何开源实现的代码。 V8和SpiderMonkey(Mozilla引擎)是我所知道的两个主要的开源引擎。

5

顺便提一下,如果你不知道的话,JavaScript是ECMAScript的一个方言。 - tofarr
8
实际上,JavaScript 是 ECMAScript 标准的一种实现:JavaScript 包含了标准中未定义的扩展。 - Rob W

5

这两个链接到 Mozilla 文档的网址都已经失效了。 - Melab

3
Javascript(顾名思义)是一种动态的脚本语言。这意味着它的代码由Web浏览器的Javascript引擎在运行时分析和执行。如何处理Javascript取决于Web浏览器。有些可能会生成中间语言或字节码,而有些可能会直接分析和执行它。
以下是执行Javascript的最简单方法(解析并在运行时执行)的步骤:
  • 解析和预处理(递归下降或其他方式)
  • 分析
  • 执行

  • Chrome的JavaScript引擎将JavaScript编译为本地平台特定的机器码(以获得最佳性能)。它还具有垃圾回收机制。


    虽然这些是概念性步骤,但在现代引擎中,情况比那更加复杂。 :-) - T.J. Crowder
    @T.J.Crowder 我同意。但是我想先给OP一个大致的想法和概念。 - ApprenticeHacker

    3
    除了已经给出的有用的具体答案外,如果性能是您的主要关注点,则可能值得查找短语“自适应优化”。JavaScript及其解释器只是需要在运行时将其他内容转换为机器代码的系统的最新实例,因此有大量更广泛的阅读材料。Pascal、Smalltalk、Java等的字节码形式可以轻松地被视为在任意硬件上运行定义语言过程中的中间形式-例如,苹果的SquirrelFish 显式地创建字节码并对其使用JIT编译器。

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接