将 WebAssembly 文本格式转换为二进制

WebAssembly 具有基于 S-表达式的文本表示形式,这是一种为在文本编辑器、浏览器开发者工具等中显示而设计的中间格式。本文档将简要介绍其工作原理,以及如何使用可用工具将文本格式文件转换为 Wasm 格式。

注意:文本格式文件通常保存为 .wat 扩展名。过去也曾使用过 .wast 扩展名,但现在它用于 WebAssembly 测试套件使用的脚本语言。

初探文本格式

让我们看一个例子——以下程序从名为 my_namespace 的模块导入一个名为 imported_func 的函数,并导出一个名为 exported_func 的函数。

wat
(module
  (func $i (import "my_namespace" "imported_func") (param i32))
  (func (export "exported_func")
    i32.const 42
    call $i
  )
)

WebAssembly 函数 exported_func 被导出,以便在我们的环境中(例如,我们正在使用 WebAssembly 模块的 Web 应用程序)使用。当它被调用时,它会调用一个名为 imported_func 的已导入 JavaScript 函数,该函数使用作为参数提供的 42 这个值来运行。

将 .wat 文本转换为 .wasm 二进制文件

让我们来尝试将上面的 .wat 文本表示示例转换为 .wasm 汇编格式。

  1. 首先,将上面的列表复制到一个文本文件中;将其命名为 simple.wat

  2. 在我们能够使用它之前,需要将其文本表示形式组装成浏览器实际读取的汇编语言。为此,我们可以使用 wabt 工具,该工具包含用于在 WebAssembly 的文本表示和 Wasm 之间相互转换的编译器,以及更多功能。请访问 https://github.com/webassembly/wabt — 按照此页面上的说明设置该工具。

  3. 获得工具构建后,将 /wabt/out/clang/Debug 目录添加到您的系统 PATH

  4. 接下来,执行 wat2wasm 程序,将其输入文件路径作为参数传递,然后是 -o 参数,然后是输出文件路径。

    bash
    wat2wasm simple.wat -o simple.wasm
    

这将把 Wasm 转换为一个名为 simple.wasm 的文件,其中包含 .wasm 汇编代码。

注意:您也可以使用 wasm2wat 工具将汇编转换回文本表示形式;例如 wasm2wat simple.wasm -o text.wat

查看汇编输出

由于输出文件是基于汇编的,因此无法在普通文本编辑器中查看。但是,您可以使用 wat2wasm 工具的 -v 选项来查看它。试试这个:

bash
wat2wasm simple.wat -v

这将以如下方式在您的终端中生成输出:

several strings of binary with textual descriptions beside them. For example: 0000008: 01 ; section code

另见

  • 理解 WebAssembly 文本格式 — 对文本格式语法的详细解释。
  • 从 C/C++ 编译到 WebAssembly — Binaryen/Emscripten 等工具都可以将您的源代码编译为 Wasm,并创建在 JavaScript 上下文中运行模块所需的 API 代码。了解更多关于如何使用它们。
  • 使用 WebAssembly JavaScript API — 如果您想了解更多关于 WebAssembly API 代码的工作原理,请阅读此文档。
  • 文本格式 — 在 WebAssembly GitHub 仓库中更详细地解释了文本格式。
  • wast-loader — 一个用于 webpack 的加载器,它可以为您处理所有这些。