作者:Marco Fioretti
WebAssembly[1],也称为Wasm,是一种web优化的代码格式和API(应用程序编程接口),可以极大地提高网站的性能和功能。WebAssembly的1.0版本于2017年发布,并于2019年成为W3C官方标准。
所有主要浏览器供应商都积极支持该标准,原因很明显:官方列出的“浏览器内”用例[2]中提到了视频编辑、3D游戏、虚拟和增强实景、p2p服务和科学模拟等。除了比JavaScript更能让浏览器更强大之外,这个标准甚至可能延长网站的寿命:例如,WebAssembly支持Internet Archive的Flash动画和游戏[3]。
WebAssembly并不只是针对浏览器;目前,它被用于移动和基于边缘的环境中,与Cloudflare Workers等产品一起使用。
.wasm格式的文件包含低级二进制指令(字节码,bytecode),可由使用通用堆栈的虚拟机以“接近CPU原生速度”执行。代码打包在模块中——即浏览器可直接执行的对象——每个模块都可以被网页实例化多次。模块内定义的函数列在一个专用数组或表中,相应的数据包含在另一个称为arraybuffer的结构中。开发人员可以通过Javascript WebAssembly.memory()调用显式地为.wasm代码分配内存。
wasm格式的纯文本版本——可以极大地简化学习和调试——也可用。然而,WebAssembly并不是为了直接供人使用。从技术上讲,.wasm只是一个浏览器兼容的编译目标:软件编译器可以自动翻译用高级编程语言编写的代码的一种格式。
正是这种选择让开发人员能够直接为数十亿人首选的用户界面编程,使用他们已经知道的语言(C/ c++、Python、Go、Rust等),但之前的浏览器无法有效使用。更好的是,程序员可以做到这一点——至少在理论上——而不必直接查看WebAssembly代码或担心(因为目标是虚拟机)哪个物理CPU会实际运行他们的代码。
是的,有几个原因。首先,作为二进制指令,.wasm文件可以比具有同等功能的JavaScript文件小得多——下载起来快得多。最重要的是,在浏览器将Javascript文件转换为其内部虚拟机可用的字节码之前,必须完全解析和验证Javascript文件。
相反,.wasm文件可以一次验证和编译,从而使“流编译(Streaming Compilation)”成为可能:浏览器可以在开始下载它们的时候开始编译和执行它们,就像流媒体电影一样。
并不是所有可以想象的WebAssembly应用程序都一定会比由专业程序员手动优化的JavaScript应用程序更快或更小。例如,如果某些.wasm需要包含JavaScript不需要的库,就可能发生这种情况。
一句话:不。当然暂时不会,至少在浏览器内部不会。WebAssembly模块仍然需要JavaScript,因为从设计上讲,它们不能访问文档对象模型(Document Object Model,DOM),而DOM是用来修改web页面的主要API。此外,.wasm代码不能进行系统调用或读取浏览器内存。WebAssembly只运行在沙箱中,一般来说,它与外部世界的交互比JavaScript更少,而且只能通过JavaScript接口。
因此——至少在不久的将来——.wasm模块将通过JavaScript提供那些如果用该语言编写的话会消耗更多带宽、内存或CPU时间的部分。
一般来说,浏览器至少需要两个部分来处理动态应用程序:一个运行应用程序代码和标准API的虚拟机(VM),这些代码可以用来修改浏览器的行为和它所显示的网页内容。
现代浏览器中的虚拟机同时支持JavaScript和WebAssembly,方式如下:
越来越多的编程语言社区支持直接编译到Wasm,我们建议从webassembly.org的入门指南[4]开始,这取决于你使用的是什么语言。注意,并不是所有的编程语言都有相同级别的Wasm支持,因此你的情况可能有所不同。
我们计划在未来几个月发布一系列文章,提供更多关于WebAssembly的信息。要开始自己使用它,你可以报名参加Linux基金会免费的Introduction to WebAssembly[5]在线培训课程。
这篇文章首先在Linux基金会培训[6]发布。
[1]
WebAssembly: https://webassembly.org/
[2]
“浏览器内”用例: https://webassembly.org/docs/use-cases/
[3]
Internet Archive的Flash动画和游戏: https://blog.archive.org/2020/11/19/flash-animations-live-forever-at-the-internet-archive/
[4]
入门指南: https://webassembly.org/getting-started/developers-guide/
[5]
Introduction to WebAssembly: https://training.linuxfoundation.org/training/introduction-to-webassembly-lfd133/
[6]
Linux基金会培训: https://training.linuxfoundation.org/