NGINX Full Version

深入了解 WebAssembly —— 一种新的 Web 可执行文件格式

计算技术的发展日新月异。从大型机到云 IaaS,从虚拟机到 Linux,我们不断地扩展和重塑技术。通常,这些技术变革是由于“惯常做法”不再适用于新的模式,或者实际上从一开始就不太理想。

我们从一些新兴技术中不难看出这一点。不断变化的需求会催生新的解决方案,例如虚拟机 (VM)、容器KubernetesOpenTelemetry。只要该解决方案行之有效,人们便会纷纷采用,就像 Kubernetes 和 OpenTelemetry 一样。

最近,我采访了一些行业专家,他们预测了的三项未来可能有重大影响的技术。其中一项技术尤为值得我们深入了解:WebAssembly(通常缩写为 Wasm)。Wasm 引起了广泛关注,因为它将浏览器语言的支持范围扩展到了 JavaScript 之外。它不是 JavaScript 的替代方案,而是万维网联盟 (W3C) 认可的第四种也是最新的官方 Web 标准开发语言(其他三种是 HTML、CSS 和 JavaScript)。

 

什么是 WebAssembly?

早在 2015 年,Mozilla 就开始着手制定一套新标准,将“一种可移植的、紧凑的、加载时间高效的格式和执行模型”作为 web 浏览器的编译目标。WebAssembly 的设计初衷是允许 JavaScript 以外的其他语言在浏览器中运行。Wasm 很快就得到了浏览器厂商的青睐,所有主流浏览器都可以支持它

大家可能还记得使用交叉编译器的时代,当时代码是针对外部环境的,通常是在控制硬件中。这些目标千差万别,这意味着交叉编译必须在生成系统和目标系统之间严格保持一致。Wasm 的工作原理大同小异,可在广泛的平台上为定义的运行时提供二进制可执行文件。由于运行时是一种低级虚拟机(类似于 JVM),因此可嵌入到许多主机应用中。

Wasm 既是一种用于执行程序的可移植二进制代码,也是一组用于程序与其环境之间交互的接口。它没有做出任何 Web 特定假设,因此可以被广泛使用。事实上,人们对 Wasm 的兴趣在很大程度上源于其在服务器端用例中的潜力。CosmonicFermyonSuborbital 等公司表明,Wasm 将影响我们从浏览器到后端应用的未来发展。

Wasm 支持多种语言,这是它备受青睐的原因之一。Wasm 几乎涵盖了所有热门语言,包括 C、C++、Go、Ruby 和 Rust 等。对其他语言的部分实现也已经支持或正在开发中。但需要注意的是,Wasm 对特定语言的支持可能仅限于某些特定的上下文:浏览器、浏览器之外,或者甚至直接在一个系统上。因此,您必须在您想要使用 Wasm 的上下文中验证它是否支持某种语言。

 

为何要关注 WebAssembly?

WebAssembly 专注于所有浏览器都需要的几个关键特性。我们之前提及了 Wasm 的多语言特性,该特性允许浏览器扩展到多种语言。接下来我们来看看它的其他特性。

这些特性不仅让 Wasm 具有很高的性能和效率,而且还非常好用。如欲了解更多相关信息,请参见 Franziska Hinkelmann 在 CovalenceConf 2019 大会上的演讲录音:JavaScript、C++ 与 WebAssembly 的速度对比。请记住,现在 Wasm 可能并不比 JavaScript 快多少,也没有 JavaScript 多年积累的优化成果。但是,速度并不是 Wasm 获得青睐的唯一因素——大小和能够支持您所使用的语言也很重要。

 

如何快速上手?

对于 WebAssembly,我们有很多很棒的资源和案例。显然,从初创公司到大公司,很多公司都在使用它:

但您不必一下子就切换到 Wasm。下面都是些很好的学习资源:

 

总结

WebAssembly 仍在开发中,与其他新技术一样,有些方面仍需完善。即便如此,它背后的理念仍引人注目。

我预计它将成为一项颠覆性技术,成为支持未来感知可控、随需而变的应用发展的主要力量,无论是在浏览器中还是云端。毫无疑问,WebAssembly 是您现在需要深入了解的技术之一。