WebAssembly 将定义一种标准化文本格式,该格式以等效于的二进制格式方式对 WebAssembly 模块及其包含的所有定义进行编码。此格式将使用S-expressions(避免语法 bikeshed 讨论)来表示模块和定义,同时允许线性表示函数体中的代码使用。当模块时,工具可以理解这种格式,并在浏览器debugging中使用。
格式将接近于this grammar,它提供了与二进制格式直接对应的原始语法,以及上面的一些语法糖。示例可以在 WebAssemblytest suite中找到。
以下工具目前可以理解此格式:
- specification interpreter使用 S 表达式语法。
- wabt使用兼容的 S 表达式。
- binaryen可以使用兼容的 S 表达式。
- LLVM backend(
CHECK:
这些测试的部分)发出兼容的 S 表达式。 - WAVM backend使用兼容的 S 表达式。
文本格式的 WebAssembly 代码的建议文件扩展名为 .wat
。
一些列出的工具所理解的注意: .wast
格式是用于编写测试脚本的 .wat
格式的超集。除了模块的定义之外,这样的脚本还可以包含断言和其他由 [语法扩展] 定义的命令。这些扩展是不官方文本格式的一部分,可能只包含一个模块。
WebAssembly 函数体对具有指定规范操作码名称的字节码指令进行编码。这些指令序列的线性表示允许二进制格式的直接人类可读的保序表示。此格式适用于 WebAssembly 程序的按操作码检查,并且可以很容易地与该格式的semantics相关。
下面是用 C++、二进制和文本(线性程序集字节码)说明的示例函数:
C++ | Binary | Text |
---|---|---|
int factorial(int n) { if (n == 0) return 1; else return n * factorial(n-1); } |
20 00 42 00 51 04 7e 42 01 05 20 00 20 00 42 01 7d 10 00 7e 0b |
get_local 0 i64.const 0 i64.eq if i64 i64.const 1 else get_local 0 get_local 0 i64.const 1 i64.sub call 0 i64.mul end |
二进制格式本质上将名称从函数、局部变量、全局变量等中剥离出来,将其中的每一个都简化为密集索引。因此,在没有帮助的情况下,文本格式必须合成新名称。然而,作为故事的tooling一部分,可以定义轻量级的、可选的“调试符号”全局部分,其将名称与每个索引实体相关联,并且当存在时,这些名称将在从二进制 WebAssembly 模块投影的文本格式中使用。
WebAssembly 的文本格式需要能够明确地表示任何结构良好的模块。除了函数体及其指令序列之外,它还需要一种对声明、函数签名、数据段、表和其他sections二进制格式进行编码的方法。
此外,对标准化文本格式的扩展或扩展可以提供额外的语法糖、宏扩展或其他便利,以使编写和读取 WebAssembly 更容易。然而,由于二进制模块中的字节码的线性序列可能具有多于一个的高级表示,因此这种糖或便利可能不能单独从二进制格式规范地解析。
WebAssembly 文本格式的设计目标源自以下用例:
- 在 WebAssembly 模块上查看源代码,从而以自然的方式融入 Web(可以查看每个源代码)。
- 当源映射不存在时,浏览器开发工具中的表示(这是必然的情况最小可行产品(MVP))。
- 直接编写 WebAssembly 代码的原因包括教学、实验、调试、优化和规范本身的测试。
没有使用 JavaScript 语法的要求;此格式不能直接评估或转换为 JavaScript.使用不同于 JavaScript 的表示法也可能有实质性的原因(例如,WebAssembly 具有 64 位整数类型,并且它应该以文本格式表示,因为这是 WebAssembly 的自然做法,而不管 JavaScript 是否具有这样的类型)。另一方面,如果没有实质性的原因,并且选项基本上是 bikeshedding,那么文本格式与 Web 上的现有约定(例如,JavaScript 和 CSS 中的大括号)相匹配是有意义的。
文本格式可能无法唯一表示。多个文本文件可能会组合成同一个二进制文件。例如,空白不应该是重要的,并且内存初始化可以在文本格式中被分解成更小的部分。
文本格式应该是精确的,因为不能以二进制格式准确表示的值将被视为无效文本。因此,浮点数应按照 C99、C++17 和 IEEE-754-2008 第 5.1 2.3 节的规定表示为十六进制浮点数。可以改进文本格式以支持更多人类可读的表示,但绝不以精确表示为代价。