0%

Webassembly 学习(2)Structure

Conventions

WebAssembly 是一种具有多种具体表示形式(二进制格式和文本格式)的编程语言。两者都映射到一个共同的结构。为了简洁起见,该结构以抽象语法的形式描述。本规范的所有部分都是根据此抽象语法定义的。

语法符号

在定义抽象语法的语法规则时采用以下约定。

  • Terminal symbols(原子)以无衬线字体或符号形式书写:i32、end。
  • Nonterminal symbols 用斜体书写: valtype, instr
  • 𝐴𝑛 是 𝑛 ≥ 0 次 𝐴 迭代的序列。
  • 𝐴* 是 𝐴 的可能为空的迭代序列。(这是 𝐴𝑛 的简写,在 𝑛 不相关的情况下使用。)
  • 𝐴+ 是 𝐴 的非空迭代序列。 (这是 𝐴𝑛 的简写,其中 𝑛 ≥ 1。)
  • 𝐴? 是 𝐴 的可选出现。 (这是 𝐴𝑛 的简写,其中 𝑛 ≤ 1。)
  • Productions are written sym ::= 𝐴1 | . . . | 𝐴𝑛.
  • 大型作品可以分为多个定义,通过用明确的省略号结束第一个定义来表示, sym ::= 𝐴1 | …,并以省略号开始延续 sym ::= … | 𝐴2
  • 一些产生式通过括号中的附加条件“(如果条件)”进行了增强,这为将产生式组合扩展为许多单独的情况提供了简写。

辅助符号

在处理句法结构时,还使用以下符号:

  • 𝜖 表示空序列
  • |𝑠| 表示序列 𝑠 的长度。
  • 𝑠[𝑖] 表示序列 𝑠 的第 𝑖 个元素,从 0 开始。
  • 𝑠[𝑖:𝑛] 表示子序列 𝑠[𝑖] … 𝑠[𝑖 + 𝑛 − 1]。
  • 𝑠 with [𝑖] = 𝐴 表示与 𝑠 相同的序列,只是将第 𝑖 个元素替换为 𝐴
  • 𝑠 with [𝑖 : 𝑛] = 𝐴𝑛 表示与 𝑠 相同的序列,只不过子序列 𝑠[𝑖 : 𝑛] 被替换为 𝐴𝑛
  • concat(𝑠*) 表示将 𝑠* 中的所有序列 𝑠𝑖 连接起来形成的平坦序列

此外,还采用以下约定:

  • 符号 𝑥𝑛(其中 𝑥 是非终结符)被视为范围在各个𝑥 序列上的元变量(𝑥*、𝑥+、𝑥 类似)。
  • 当给定序列 𝑥𝑛 时,则假定在 (𝐴1 𝑥 𝐴2)𝑛 序列中出现的 𝑥 与 𝑥𝑛 逐点对应(对于𝑥*、𝑥+、𝑥类似)。 这隐式地表达了一种在序列上映射句法结构的形式.

以下形式的产生式被解释为将一组固定字段 field𝑖 分别映射到值 𝐴𝑖 的记录:
r ::= {field1 𝐴1, field2 𝐴2, . . . }

采用以下符号来处理此类记录

  • 𝑟.field 表示 𝑟 的 field 组件的内容。
  • 𝑟 with field = 𝐴 表示与 𝑟 相同的记录,只是用 𝐴 替换了 field 组件的内容。
  • 𝑟1 ⊕ 𝑟2 表示通过逐点附加每个序列来组合具有相同序列字段的两个记录:
    {field1 𝐴*1, field2 𝐴*2, …} ⊕ {field1 𝐵*1, field2 𝐵*2,…} = {field1 𝐴*1𝐵*1 , field2 𝐴*2 𝐵*2,…}
  • ⨁︀𝑟*分别表示记录序列的组成;如果序列为空,则结果记录的所有字段均为空。

序列和记录的更新表示法递归地概括为通过“路径” pth ::= ([…] | .field)+ 访问的嵌套组件:

  • 𝑠 with [𝑖] pth = 𝐴 是 𝑠 with [𝑖] = (𝑠[𝑖] with pth = 𝐴) 的缩写
  • 𝑟 with field pth = 𝐴 是 𝑟 with field = (𝑟.field with pth = 𝐴) 的缩写
  • 𝑟 with .field = 𝐴 被缩短为 𝑟 with field = 𝐴

Vectors

向量是 𝐴𝑛 (或 𝐴*)形式的有界序列,其中 𝐴 可以是值或复杂的结构。 向量最多可以有 232 − 1 个元素。
vec(𝐴) ::= 𝐴𝑛(如果 𝑛 < 232

Values

WebAssembly 程序对原始数值进行操作。此外,在程序的定义中,不可变的值序列出现来表示更复杂的数据,例如文本字符串或其他向量。

字节

最简单的值形式是原始的未解释字节。 在抽象语法中,它们表示为十六进制文字。

byte ::= 0x00 | . . . | 0xFF

元变量𝑏的范围超过字节。
字节有时被解释为自然数 𝑛 < 256。

整数

具有不同值范围的不同类别的整数通过其位宽 𝑁 以及它们是无符号还是有符号来区分。

u𝑁 ::= 0 | 1 | … | 2𝑁 −1

s𝑁 ::= −2𝑁−1 | … | −1 | 0 | 1 | … | 2𝑁−1 −1

i𝑁 ::= u𝑁

类 i𝑁 定义了未解释的整数,其符号解释可能会根据上下文而变化。 在抽象语法中,它们表示为无符号值。但是,某些操作会根据二进制补码解释将它们转换为有符号。

注意:本规范中出现的主要整数类型是 u32、u64、 s32、 s64、 i8、i16 、i32 、i64。然而,其他大小作为辅助结构出现,例如,在浮点数的定义中。

元变量 𝑚、𝑛、𝑖 的范围为整数.
数字可以用简单的算术表示,如上面的语法所示。为了区分像 2𝑁 这样的算术和像 (1)𝑁 这样的序列,后者用括号来区分。

浮点

浮点数据表示 32 或 64 位值,对应于 IEEE 754 标准的相应二进制格式。
每个值都有一个符号和一个量纲。