谷歌发布了新的 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
评论