作者:Marco Fioretti
WebAssembly,或 Wasm[1],是一种标准化的二进制格式,它允许用任何语言编写的软件在任何平台上、在沙箱或运行时(即虚拟机)内以接近本机的速度运行,无需定制。由于这些运行时与它们的宿主环境是隔离的,WebAssembly 系统接口(WASI)为开发人员提供了一种单一的、标准的方法来调用任何平台上存在的低级函数。采用 Wasm 的开发人员可以自由地编写软件,不用理软件将在哪里运行。
本系列的前一篇文章[2]描述了 WASI 的目标、设计原则和架构。这一次,我们展示了基于 WASI 的真实世界的可用项目和服务,这也阐明了 WASI 在大局中的作用:促进几乎任何应用程序的容器化,这比 Docker 这样的笨重容器可能做的要高效得多。
程序员已经可以编写和编译代码(例如用 C 或 Rust)来创建可以在任何符合 wasi 的环境中使用的.wasm 模块。问题是,我们是否已经有了可以在“web 浏览器之外”执行这些模块的运行时?答案是肯定的,而且不止一个。一个通用解决方案是来自Bytecode Alliance[3]的Wasmtime[4]。这个项目为 Wasm 模块开发了一个兼容 WASI 的运行时,可以作为命令行工具单独使用,也可以作为库嵌入到其他应用程序中:目前,除了普通的 Bash,Wasmtime 可以从 Rust、C、Python、.NET 和 Go 中使用。
其他 WASI 运行时或多或少针对特定用例或编程社区进行了优化。下面的例子说明了什么是可能的。
Wasmer[5]是 Rust 的开源 Wasm 运行时,其 1.0 版本于 2021 年 1 月发布。Wasmer 专门设计为在通用服务器上运行.wasm 模块,这些模块使用 WASI 方法与主机操作系统的本机函数交互。
除了可以在任何平台和芯片集上运行 Wasm 二进制文件的独立运行时外,Wasmer 的设计和 Wasmtime 一样,允许使用来自许多其他语言的 Wasm 模块,从 C/C++、Rust、Python、Go、PHP 和 Ruby 开始。
为了证明其功能,Wasmer 的开发人员已经将nGinx web 服务器的未修改版本编译为.wasm 模块[6],然后实际运行,显然使用 WASI 调用与主机系统交互。
Wasmer 也是第一个完全支持 WASI 和高性能编程的 Wasm 运行时,使用单指令多数据技术(SIMD):2019 年,这两种技术一起使用,产生了非常有趣的结果,以模拟粒子物理。Wasmer 开发人员还参与了在 Linux 内核上运行 Wasm 模块的工作,以便通过 WASI 安全地执行那些需要更多检查和更多上下文切换的任务;这就是性能影响。
Second State 开发了另一个虚拟机WasmEdge(原名 SSVM)[7],它运行服务器端应用程序“比 Docker 更安全,速度也快 10 倍”。WasmEdge 运行时中特别有趣的是,它为什么以及如何添加和优化了对 WebAssembly 和 WASI 的支持:直接访问硬件,以提供人工智能和机器学习“作为 Node.js 的服务,用 Rust 编写,在 Web 上”。典型的应用程序运行速度比等价的 Python 代码快 25 倍,包括图像和其他模式的识别。
WasmEdge 工具链还可以用于为 Deno 创建 Wasm 模块。这是一个 Rust 的 JavaScript 和 TypeScript 运行时,创建它是为了解决“Node.js 的创建者对它后悔的 10 件事”,并支持 WASI 为需要访问系统资源的 Wasm 模块。
Fastly 是一家边缘云平台提供商,它开发并发布了自己的 WebAssembly 编译器和运行时,称为Lucet[8]。Fastly 专门为 Fastly 平台的几个用例创建了这个工具,以支持客户用任何语言编写的代码的更快和更安全的执行。为了展示 Wasm 和 WASI 在边缘计算方面的能力,Fastly 的一位工程师最近宣布[9],他已将《毁灭战士》(Doom)第一人称射击游戏移植到 Fastly 的边缘云上运行。
使用 WASI 和前面提到的 Wasmtime,既可以从.NET Core 应用程序运行 Wasm 模块,也可以从.NET 的 Roslyn 编译器生成相同格式的模块。更有趣的是微软的Krustlets[10],也就是“Kubernetes Rust kubelets”。这是一种利用 Kubernetes 编排和运行标准容器的 WebAssembly“工作负载”的方法。换句话说,Wasm 和 WASI 已经可以通过 Kubernetes 这样的标准系统实现数千个通用应用程序的编配,每个应用程序至少与传统容器类似,并且在需要时与它们并排使用,但是开销要小得多。
在运行在许多不同平台上的非常高效的虚拟机上执行相同的二进制格式的可能性甚至比乍看起来要多,因为:
“启用 WASI 的 JavaScript 运行时和简单的固件可能会使设备的软件与云托管或本地托管的存储库保持同步”。
也许你还没有注意到,这样的过程可能会让物联网或任何远程设备的新固件或软件的自动测试和部署比现在更容易、更可靠。如果一个远程设备可以运行 WebAssembly 字节码,任何开发人员都可以为它可靠地编写和测试新软件,只需使用该设备的“带有数字孪生的基本模拟器”,如这里[11]所述。
WASI…有趣吗?
文章[12]最初在Linux Foundation – Training[13]上发布。
[1]
WebAssembly,或 Wasm: https://training.linuxfoundation.org/announcements/an-introduction-to-webassembly/
[2]
前一篇文章: https://training.linuxfoundation.org/announcements/wasi-bringing-webassembly-way-beyond-browsers/
[3]
Bytecode Alliance: https://bytecodealliance.org/
[4]
Wasmtime: https://wasmtime.dev/
[5]
Wasmer: https://wasmer.io/
[6]
nGinx web 服务器的未修改版本编译为.wasm 模块: https://medium.com/@syrusakbary/running-nginx-with-webassembly-6353c02c08ac
[7]
WasmEdge(原名 SSVM): https://wasmedge.org/
[8]
Lucet: https://github.com/fastly/lucet
[9]
最近宣布: https://www.fastly.com/blog/compute-edge-porting-the-iconic-video-game-doom
[10]
Krustlets: https://www.infoworld.com/article/3537535/kubernetes-meets-webassembly-in-microsofts-krustlet.html
[11]
这里: https://www.infoworld.com/article/3613873/microsoft-gets-serious-about-webassembly.html
[12]
文章: https://training.linuxfoundation.org/announcements/how-wasi-makes-containerization-more-efficient/
[13]
Linux Foundation – Training: https://training.linuxfoundation.org/