译者:陈峻
二十多年来,有一种编程语言一直在Web浏览器中以原生的方式被使用至今。这便是JavaScript。期间,我们见证了诸如Java和Flash的ActionScript等第三方二进制插件,从兴起到逐渐消亡。而作为另一类Web语言的CoffeeScript,最终仍然会被编译成JavaScript。可见,只有JavaScript才是Web开发界的王者,并骨灰级地被沿用着。
不过,我们现在有了一种新的可选项:WebAssembly(简称为Wasm)。作为一种小型且快速的二进制格式编程语言,它可以为Web应用提供接近原生的性能。此外,WebAssembly旨在成为任何语言的编译目标,而JavaScript只是目标中的一种。也就是说,鉴于每一种主流浏览器都能支持WebAssembly,我们有必要开始认真地考虑,如何编写出各种可以被编译为WebAssembly的客户端应用。
值得注意的是,WebAssembly应用程序并不打算(至少目前并没有)取代JavaScript应用程序。相反,鉴于JavaScript具有灵活、动态类型、以及源代码可读等交付特性,WebAssembly旨在提供高速、强类型,以及紧凑二进制式的交付特性。因此,WebAssembly可以被视为JavaScript的辅助“伙伴”。
在实际中,开发人员可以考虑将WebAssembly运用到诸如:游戏、音乐流、视频编辑、以及CAD应用等性能敏感型的用例中。目前,许多Web服务已经开始采用WebAssembly了。例如,为了缩短加载的时间与执行的速度,谷歌地球和协作式绘图与图表应用Figma,都采用了较新的WebAssembly。
1.WebAssemzbly的工作原理
由W3C开发的WebAssembly,用其创建者的话来说是一个“编译的目标”。开发人员不必直接编写WebAssembly。他们可以选用自己熟悉的语言编写代码,然后编译成WebAssembly类型的字节码。字节码通常运行在客户端的Web浏览器中,并被翻译成可被高速执行的原生机器代码。
WebAssembly代码旨在实现比JavaScript更快的加载、解析和执行。当使用WebAssembly时,Web浏览器仍然存在下载Wasm模块,以及予以设置的开销。虽然对于较大的Wasm项目而言,此类模块会因为在运行过程中产生了几兆字节,而出现延迟。但是在其他同等条件的中小型项目中,WebAssembly会运行得更快一些。
同时,WebAssembly也提供了一个沙盒执行模型,该模型与JavaScript的现有安全模型非常相似。也就是说,Wasm应用程序无法直接访问到沙箱之外的任何内容,甚至是它们正在运行的网页上的DOM。因此,如果应用程序需要与系统中的其他部分进行交互,就必须使用类似WebAssembly系统接口(WASI,