WebAssembly (WASM)

在本书的第一版将近完成的时候,Brendan Eich 突然宣布了一个有可能对JavaScript未来的道路产生重大冲击的公告:WebAssembly(WASM)。我们不能在这里详细地探讨WASM,因为在本书写作时这个话题为时过早了。但如果不简要地提上一句,这本书就不够完整。

JS语言在近期(和近未来的)设计的改变上所承受的最大压力之一,就是渴望它能够成为从其他语言(比如 C/C++,ClojureScript,等等)转译/交叉编译来的、合适的目标语言。显然,作为JavaScript运行的代码性能是一个主要问题。

正如在本系列的 异步与性能 中讨论过的,几年前一组在Mozilla的开发者给JavaScript引入了一个称为ASM.js的想法。AMS.js是一个合法JS的子集,它大幅地制约了使代码难于被JS引擎优化的特定行为。其结果就是兼容AMS.js的代码在一个支持ASM的引擎上可以显著地快速运行,几乎可以与优化过的原生C语言的等价物相媲美。许多观点认为,对于那些将要由JavaScript编写的渴求性能的应用程序来说,ASM.js很可能将是它们的基干。

换言之,在浏览器中条条大路通过JavaScript通向运行的代码。

直到WASM公告之前,是这样的。WASM提供了另一条路线,让其他语言不必非得首先通过JavaScript就能将浏览器的运行时环境作为运行的目标。实质上,如果WASM启用,JS引擎将会生长出额外的能力 —— 执行可以被视为有些与字节码相似的二进制代码(就像在JVM上运行的那些东西)。

WASM提出了一种高度压缩的代码AST(语法树)的二进制表示格式,它可以继而像JS引擎以及它的基础结构直接发出指令,无需被JS解析,甚至无需按照JS的规则动作。像C或C++这样的语言可以直接被编译为WASM格式而非ASM.js,并且由于跳过JS解析而得到额外的速度优势。

短期内,WASM与AMS.js、JS不相上下。但是最终,人们预期WASM将会生长出新的能力,那将超过JS能做的任何事情。例如,让JS演化出像线程这样的根本特性 —— 一个肯定会对JS生态系统造成重大冲击的改变 —— 作为一个WASM未来的扩展更有希望,也会缓解改变JS的压力。

事实上,这张新的路线图为许多语言服务于web运行时开启了新的道路。对于web平台来说,这真是一个激动人心的新路线!

它对JS意味着什么?JS将会变得无关紧要或者“死去”吗?绝对不是。ASM.js在接下来的几年中很可能看不到太多未来,但JS在数量上的绝对优势将它安全地锚定在web平台中。

WASM的拥护者们说,它的成功意味着JS的设计将会被保护起来,远离那些最终会迫使它超过自己合理性的临界点的压力。人们估计WASM将会成为应用程序中高性能部分的首选目标语言,这些部分曾用各种各样不同的语言编写过。

有趣的是,JavaScript是未来不太可能以WASM为目标的语言之一。可能有一些未来的改变会切出JS的一部分,而使这一部分更适于以WASM作为目标,但是这件事情看起来优先级不高。

虽然JS很可能与WASM没什么关联,但JS代码和WASM代码将能够以最重要的方式进行交互,就像当下的模块互动一样自然。你可以想象,调用一个foo()之类的JS函数而使它实际上调用一个同名WASM函数,它具备远离你其余JS的制约而运行的能力。

至少是在可预见的未来,当下以JS编写的东西可能将继续总是由JS编写。转译为JS的东西将可能最终至少考虑以WASM为目标。对于那些需要极致性能,而且在抽象的层面上没有余地的东西,最有可能的选择是找一种合适的非JS语言编写,然后以WASM为目标语言。

这个转变很有可能将会很慢,会花上许多年成形。WASM在所有的主流浏览器上固定下来可能最快也要花几年。同时,WASM项目(https://github.com/WebAssembly)有一个早期填补,来为它的基本原则展示概念证明。

但随着时间的推移,也随着WASM学到新的非JS技巧,不难想象一些当前是JS的东西被重构为以WASM作为目标的语言。例如,框架中性能敏感的部分,游戏引擎,和其他被深度使用的工具都很可能从这样的转变中获益。在web应用程序中使用这些工具的开发者们并不会在使用或整合上注意到太多不同,但确实会自动地利用这些性能和能力。

可以确定的是,随着WASM变得越来越真实,它对JavaScript设计路线的影响就越来越多。这可能是开发者们应当关注的最重要的“ES6以后”的话题。