WASM正确入门

253 阅读2分钟

总览全网 [WebAssembly] 的网站,目前没有一个正确的入门姿势,例如官网 WebAssembly.org 初学者进入后基本上一脸懵逼。

image.png

请看这个页面,新手进入后学到了什么,这些文档通常是给已经入门的人作为参考资料的。而且因为 WebAssembly 作为一个开源技术,任何一个创业公司都可以基于这个技术标准做一些工作,以至于网上的资料支离破碎,没有任何一个组织为这个状况兜底。

Mozilla 作为发起者,也并没有绝对的话语权,另外提一句,Mozilla 不是太关心新用户如何学习 WebAssembly,只关心自己怎么用 WebAssembly。

所以作为 WebAssembly 社区,我们有责任引导新人入手,传播学习 WebAssembly 的正确姿势和建立正确的概念。从今天开始,WebAssembly 入门找我。

那么我们就从建立第一个正确概念开始:什么是WebAssembly?

不用谈asm.js的历史,wasm 本质上是 binary 保存的 s-expression,通过 wasm runtime 执行的代码。不太正确但简单的理解,wasm是和java bytecode类似的文件格式,在vm中执行,实现了类似java 的一次编写到处运行的效果。(此时大家最大的疑问是既然和 java 差不多为什么又重新发明了一种新的技术,这个问题后面再讲)

所以只要实现了 wasm 的 runtime 就可以运行 wasm,最早集成 runtime 的是各大浏览器,比如 firefox,chrome,safari都已经完全可以支持。后来大家认识到这个 runtime 其实可以独立于浏览器运行,于是许多创业公司开发了在服务端运行的 wasm runtime。注意,这些服务端运行的 wasm runtime 往往会造成新手的迷惑,因为它们拓展了 wasm 的边界,并且增加了许多服务端特有的概念,以至于会让许多人迷惑。大家只要记住:

  1. 浏览器可以加载 wasm 模块。
  2. 服务端运行的 wasm 模块多数不能在浏览器上运行。

目前来说,虽然绝大多数语言都可以编译成 wasm 模块,但是实质上比较好用的就是 wasm-pack 和 emscripten。一个是 rust 工具链,另一个是 c/c++ 打包工具。下一章我将演示如何打包一个可以在浏览器上运行的 wasm 模块。