将 WebAssembly 文本格式转换为 Wasm

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

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

初步了解文本格式

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

wasm
(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

另请参阅