令人惊叹的快速解析,第1部分:优化扫描器
为了运行JavaScript程序,需要对源代码进行处理,使V8能够理解它。V8首先将源代码解析为抽象语法树(AST),即表示程序结构的一组对象。这些AST随后会由Ignition编译成字节码。这些解析+编译阶段的性能很重要:V8在完成编译之前无法运行代码。在这一系列的博客文章中,我们专注于解析以及V8为实现快速解析器所做的工作。
为了运行JavaScript程序,需要对源代码进行处理,使V8能够理解它。V8首先将源代码解析为抽象语法树(AST),即表示程序结构的一组对象。这些AST随后会由Ignition编译成字节码。这些解析+编译阶段的性能很重要:V8在完成编译之前无法运行代码。在这一系列的博客文章中,我们专注于解析以及V8为实现快速解析器所做的工作。
V8 v7.4 现在支持在运行时不分配可执行内存的情况下执行 JavaScript。
在默认配置中,V8 强烈依赖运行时分配和修改可执行内存的能力。例如,TurboFan 优化编译器会即时为热点 JavaScript (JS) 函数生成本机代码,而大多数 JS 正则表达式是通过 irregexp 引擎 编译成本机代码的。在运行时创建可执行内存是使 V8 快速的重要原因之一。
在过去的几年里,V8垃圾回收器(GC)发生了很大的变化。Orinoco项目将一个顺序的、全停式的垃圾回收器转变成了一个大部分并行和并发的回收器,具备增量回退功能。
在 V8 团队的三个月实习期间,Hai Dang 改进了 [...array]
, [...string]
, [...set]
, [...map.keys()]
和 [...map.values()]
的性能(当展开元素处于数组字面量开头时)。他还大幅加速了 Array.from(iterable)
。本文将解释他所做的一些详细修改,这些优化从 V8 v7.2 开始生效。
JavaScript中的异步处理传统上被认为速度不是特别快。更糟糕的是,调试实时JavaScript应用程序——特别是Node.js服务器——并不是一件容易的事,尤其是异步编程。幸运的是,时代正在改变。这篇文章探讨了我们如何优化V8中的异步函数和Promise(也在一定程度上优化了其他JavaScript引擎),并描述了我们如何改进异步代码的调试体验。