WebAssembly:不只是浏览器里的虚拟机
WebAssembly最初是为浏览器设计的,但它正在突破浏览器的边界,成为服务端、边缘计算、插件系统的重要运行时。本文分析WebAssembly的技术优势和它在浏览器之外的应用场景。

WebAssembly:不只是浏览器里的虚拟机
WebAssembly(简称 Wasm)最初的设计目标很简单:让 C/C++ 代码在浏览器里高效运行。这样游戏引擎、图像处理、科学计算等性能敏感的应用就可以在 Web 平台上运行。
但 Wasm 的故事远没有停留在浏览器里。
近年来,Wasm 正在突破浏览器的边界,成为一个通用的、安全的、高性能的运行时。从服务端到边缘计算,从插件系统到区块链,Wasm 的应用场景在快速扩展。
Wasm 的核心优势

Wasm 之所以能走出浏览器,是因为它有几个独特的优势。
第一是接近原生的性能。Wasm 是一种低级的字节码格式,执行时可以被编译成机器码。在计算密集型任务上,Wasm 的性能可以达到原生代码的 80% 到 95%。这远超 JavaScript,也优于大部分解释型语言。
第二是沙箱安全。Wasm 在一个沙箱中运行,不能直接访问文件系统、网络、操作系统。它只能通过宿主环境显式提供的接口来与外界交互。这种安全模型让 Wasm 非常适合运行不受信任的代码。
第三是语言无关。Wasm 不绑定任何特定的编程语言。C、C++、Rust、Go、Python、Java,几乎所有主流语言都可以编译成 Wasm。开发者可以用自己最熟悉的语言编写代码,然后在任何支持 Wasm 的环境中运行。
第四是体积小。Wasm 的二进制格式经过精心设计,体积远小于等价的 JavaScript。更小的体积意味着更快的下载和启动速度。
浏览器中的 Wasm
在浏览器中,Wasm 的应用已经比较成熟。
游戏是最典型的应用。Unity 和 Unreal Engine 都支持把游戏编译成 Wasm,在浏览器中运行 3D 游戏。虽然性能不如原生应用,但已经能提供可接受的游戏体验。
图像和视频处理也是常见应用。Figma 用 Wasm 来实现高性能的图形渲染。Photoshop 的 Web 版用 Wasm 来运行图像处理算法。FFmpeg 编译成 Wasm 后可以在浏览器中进行视频转码。
加密和安全领域也在使用 Wasm。浏览器中的端到端加密、密码管理、安全通信,很多底层的加密算法是用 Wasm 实现的,因为 Wasm 比 JavaScript 更难被逆向工程。
服务端的 Wasm
Wasm 在服务端的应用正在快速增长。
WASI(WebAssembly System Interface)是 Wasm 进入服务端的关键。它定义了一套标准的系统接口,让 Wasm 模块可以访问文件系统、网络、环境变量等系统资源。有了 WASI,Wasm 就不再局限于浏览器沙箱,可以在服务端环境中运行。
Wasmtime、Wasmer、WasmEdge 是主要的服务端 Wasm 运行时。它们提供了不同的优化方向:Wasmtime 注重安全性和标准合规性,Wasmer 注重易用性和包管理,WasmEdge 注重边缘计算和 AI 推理。
Wasm 在服务端的优势在于启动速度。一个 Wasm 模块的冷启动时间在微秒级,远快于容器的秒级启动。这让 Wasm 非常适合 Serverless 场景,可以真正实现"按需启动"。
插件系统中的 Wasm

Wasm 的沙箱安全特性让它成为插件系统的理想选择。
很多应用需要支持第三方插件来扩展功能。如果插件用原生代码运行,一旦插件有 Bug 或者恶意行为,可能导致整个应用崩溃或者被攻击。如果插件在 Wasm 沙箱中运行,它无法访问应用的内存和系统资源,即使出问题也不会影响宿主应用。
Envoy 代理用 Wasm 来支持自定义的过滤器插件。开发者可以用任何语言编写过滤器逻辑,编译成 Wasm 后动态加载到 Envoy 中。这比用 C++ 编写原生插件安全得多,也方便得多。
数据库也在用 Wasm 来支持用户自定义函数。比如你可以在数据库中定义一个 Wasm 函数,用于数据的转换和计算。这个函数在数据库进程中运行,但被 Wasm 沙箱隔离,不会影响数据库的稳定性。
边缘计算中的 Wasm
Wasm 在边缘计算领域展现了独特的价值。
边缘设备通常资源有限,不能运行完整的容器环境。Wasm 模块体积小、启动快、资源占用低,非常适合在边缘设备上运行。
Cloudflare Workers 是 Wasm 在边缘计算中最成功的应用。它在全球几百个边缘节点上运行用户的 Wasm 代码,实现了毫秒级的冷启动和极低的延迟。
边缘 AI 推理也是一个有前景的方向。把 AI 模型编译成 Wasm,在边缘设备上运行推理。虽然性能不如专用的推理芯片,但 Wasm 的可移植性让它可以在任何设备上运行。
Wasm 的局限
Wasm 不是万能的,它有自己的局限。
多线程支持还不完善。Wasm 的线程模型还在演进中,目前的多线程能力有限。对于需要大量并行计算的场景,Wasm 可能不是最佳选择。
调试体验有待改善。Wasm 的调试工具不如原生代码成熟。在浏览器中调试 Wasm 可以使用 Chrome DevTools,但体验不如调试 JavaScript。
生态成熟度也是问题。虽然 Wasm 的标准在快速演进,但很多特性还在提案阶段。WASI 的标准也还在完善中,不同运行时的兼容性可能有差异。

我的判断
Wasm 是一个具有深远潜力的技术。它不只是浏览器中的一个补充,而是可能成为和容器并列的通用运行时。
短期内,Wasm 在浏览器中的应用会继续增长,特别是随着 WebGPU 等新 API 的普及。服务端 Wasm 会在 Serverless 和边缘计算场景中获得更广泛的应用。
长期来看,Wasm 有潜力成为"一次编写,到处运行"的终极实现。不管是在浏览器、服务器、边缘设备还是嵌入式系统,同一个 Wasm 模块都可以运行。这个愿景如果实现,会深刻改变软件的分发和运行方式。
对于开发者来说,现在是了解 Wasm 的好时机。不需要立即投入大量时间学习,但可以关注它的发展,在合适的场景中尝试使用。
