谷歌 V8 JavaScript 引擎引入新解释器 Ignition,旨在减少内存消耗

  • David Iffland
  • 谢丽

2016 年 8 月 29 日

话题:JavaScriptAndroidChrome语言 & 开发

谷歌发布了新的 JavaScript 解释器 Ignition,Chrome 53 将在一些内存有限的 Android 设备上使用它。

谷歌资深软件工程师Ross McIlroy在一篇博文中探讨了构建 Ignition 的原因

V8 目前没有解释器。初始执行的 JavaScript 代码最先被解析,并编译成一个未优化的状态。解析器和编译器的协同工作机制会导致部分代码后续解析两次、甚至是三次。总之,按照谷歌的说法,V8 将 33% 的页面启动时间用在了解析和编译代码上。这也导致了大量的内存开销。

通过使用解释器,谷歌希望减少当前系统的内存使用。Ignition 还是依赖于一个解析器,但 JavaScript 被编译成字节码,而不是原生代码。McIlroy 表示,“我们 [使用 Ignition] 将代码编译成简洁的字节码,而不是编译成机器码,大大减少了结果代码。因此,我们可以减少系统的内存使用,对于不常运行的函数而言尤其如此。”

由于字节码较小,所以可以编译全部源代码,而不用避免编译未使用的代码。也就是说,脚本只需要解析一次,而不是像当前的编译过程那样解析多次。

McIlroy 还提供了一些技术细节:

Ignition 解释器使用低级的、体系结构无关的 TurboFan 宏汇编指令为每个操作码生成字节码处理程序。TurboFan 将这些指令编译成目标平台的代码,并在这个过程中执行低级的指令选择和机器寄存器分配。Ignition 是一个寄存器机,每个字节码都将其输入和输出指定为显式寄存器寻址;它不是一个栈式机,每个字节码消费输入,并把输出推送到一个隐式栈上。

其他浏览器供应商已经将使用解释器作为第一个步骤。Mozilla 的 SpiderMonkey 和微软的 Chakra JavaScript 引擎都是一开始就有解释器,而且它们都是连接到了一个两层的编译系统

从 Chrome 53(预计在9月初发布稳定版本)开始,内存为 512MB 或不足 512MB 的 Android 设备将开始使用 Ignition。要想深入了解 Ignition,请查看谷歌发布的设计文档

查看英文原文V8's New JavaScript Interpreter Improves Memory Consumption

JavaScriptAndroidChrome语言 & 开发