使用 WebAssembly

目录

WebAssembly 是一种高性能的类汇编语言,可以从包括 C/C++、Rust 和 AssemblyScript 在内的无数语言进行编译。 目前,Chrome、Firefox、Safari、Edge 和 Node.js 都支持它!

WebAssembly 规范详细说明了两种文件格式,一种是二进制格式,被称为 WebAssembly 模块,扩展名为 .wasm;另一种是相应的文本表示格式,被称为 WebAssembly 文本,扩展名为 .wat

关键概念

  • 模块 - 编译后的 WebAssembly 二进制文件,即 .wasm 文件。
  • 内存 - 可调整大小的 ArrayBuffer。
  • 表格 - 未存储在内存中的引用的可调整大小的类型化数组。
  • 实例 - 模块及其内存、表格、以及变量的实例化。

为了使用 WebAssembly,你需要 .wasm 二进制文件和一组 API 来与 WebAssembly 通信。 Node.js 通过全局的 WebAssembly 对象提供必要的 API。

JS
console.log(WebAssembly);
/*
Object [WebAssembly] {
compile: [Function: compile],
validate: [Function: validate],
instantiate: [Function: instantiate]
}
*/

生成 WebAssembly 模块

有多种方法可用于生成 WebAssembly 二进制文件,包括:

  • 手工编写 WebAssembly(.wat)并使用 wabt 等工具转换为二进制格式
  • 在 C/C++ 应用程序中使用 emscripten
  • 在 Rust 应用程序中使用 wasm-pack
  • 如果你喜欢类似 TypeScript 的体验,则使用 AssemblyScript

其中一些工具不仅会生成二进制文件,还会生成 JavaScript 代码和相应的 HTML 文件以在浏览器中运行。

如何使用

一旦你有了 WebAssembly 模块,则你就可以使用 Node.js WebAssembly 对象来实例化它。

JS
// 假设 add.wasm 文件存在,其中包含添加了 2 个提供的参数的函数
const fs = require('fs');
const wasmBuffer = fs.readFileSync('/path/to/add.wasm');
WebAssembly.instantiate(wasmBuffer).then(wasmModule => {
// 导出的函数位于 instance.exports 下
const add = wasmModule.instance.exports.add;
const sum = add(5, 6);
console.log(sum); // 输出:11
});

与操作系统交互

WebAssembly 模块本身不能直接访问操作系统功能。 可以使用第三方工具 Wasmtime 来访问此功能。 Wasmtime 利用 WASI API 来访问操作系统功能。

资源