原文作者:Dylan Schiemann
译者:UC 国际研发 Jothy
写在最前:欢迎你来到“UC国际技术”公众号,我们将为大家提供与客户端、服务端、算法、测试、数据、前端等相关的高质量技术文章,不限于原创与翻译。
WebAssembly 正越来越受欢迎,它不仅能提高应用性能,而且支持将其他语言的源代码转换为可在 Web 浏览器中运行的内容。 每次 JavaScript 受到挑战时,社区都会努力创建机制来改善它的性能瓶颈,这些年来我们从 Mozilla,Google,Apple 和 Microsoft 的努力中也可见端倪。
大型 JavaScript 应用当前面临的性能瓶颈是解析抽象语法树(AST)所需的时间。 二进制 AST 旨在利用解析 WebAssembly AST 所用的一些策略来提高解析 JavaScript AST 的性能。 该提案由 Facebook,Mozilla 和 Bloomberg 的工程师提出,他们指出:
“即使在高性能笔记本上,Chrome 从 Facebook.com 上加载 7MB 未压缩的 JavaScript,可能得花上 15% 的 CPU 时间来解析它!”
“启动(加载)时间正在成为Web 应用的性能瓶颈。 Web 现有特性(缓存方面)已支持传输更大量级的 JS 代码。缓存虽然有帮助,但这些特性的取值会定期更新,所以冷启动时间依旧非常重要。 随着 JavaScript 负载的增加,应用启动性能会下降,其中解析时间是初始加载时间的重要组成部分。 举个例子🌰,即使在高性能笔记本上,Chrome 从 Facebook.com 上加载 7MB 未压缩的 JavaScript,可能得花上 15% 的 CPU 时间来解析它!!”
二进制 AST
二进制 AST 提议为 JavaScript 引入一种新的网络传输格式,该格式提供了抽象语法树(AST)的二进制编码,以此提高 JS 性能。 该提案的目标是提供快速解析。 作者指出,由于 Web 开发者已经习惯了像 webpack 这样的构建工具,因此可以轻松接受这种新格式。 像 TypeScript 和 Babel 这样的编译器也可以直接输出二进制 AST。
该提案开了一个好头,即提供 JavaScript 表层语法的简单替代编码,并使用尽可能小的增量来实现高性能解析。 它不会尝试任何语义级编码,例如字节码或编码变量,而会直接使用标识符。
当前解析瓶颈的可能解决方案包括:
在需要的地方无法获取的信息(通常由语言功能引起,例如变量提升或内置方法)
JavaScript 的早期错误语义(需要对每个 JavaScript 文件进行预解析)
使用字符导致的效率低下(JavaScript 语法将表达式编译为何种类型的字符级歧义)
二进制 AST 提议借鉴 WebAssembly 解析方法,二进制编码分为三层:
使用基本原语对 AST 节点进行简单的二进制编码
对上一层进行附加结构压缩
通用压缩算法
Prototype(原型)
提议二进制 AST 的团队使用基于内部 AST 格式的语法,基于 Mozilla 的 SpiderMonkey 引擎实现了早期原型。
解析过程的改进更为显著,创建完整 AST 所需的时间减少了 70-90%。
在早期的 facebook.com 静态新闻源基准测试中,二进制 AST 表示法略小于原始 JavaScript。 解析过程的改进更为显著,创建完整 AST 所需的时间减少了 70-90%。
该提案中的 FAQ ❓解释了为什么它不考虑传输原生字节码,为什么 WebAssembly 不是所有 Web 问题的答案,以及其他许多问题的答案。
社区反应
在今年夏天的 FullStack 上,我询问了 JavaScript 作者 Brendan Eich 对二进制 AST 的看法。 他仍持怀疑态度,但也表示如果真能实现性能优势,那么未来的 JavaScript 版本会重点考虑这个提案。
结论
二进制 AST 提议是过去几年中提高 Web 性能速度的最有希望的提议。 假设这个提议进一步发展,我们希望一旦它可用就立即使用它,并且在 Dojo 中加以支持。
需要帮助吗?请联系我们!
英文原文:
https://www.sitepen.com/blog/2018/10/28/tc39-binary-ast-proposal
好文推荐:
“UC国际技术”致力于与你共享高质量的技术文章
欢迎关注我们的公众号、将文章分享给你的好友