模块¶
WebAssembly 程序被组织成模块,它是部署、加载和编译的单位。模块收集了对 类型、函数、表格、内存 和 全局变量 的定义。此外,它可以声明 导入 和 导出,并提供初始化形式的 数据 和 元素 段,或一个 开始函数。
每个向量(以及整个模块)都可能是空的。
索引¶
定义用以零为基准的索引来引用。每个定义类别都有自己的索引空间,由以下类别区分。
对于 函数、表格、内存 和 全局变量 的索引空间,包括在同一模块中声明的相应 导入。这些导入的索引在同一索引空间中其他定义的索引之前。
对于 局部变量 的索引空间,只能在 函数 内部访问,并包含该函数的参数,它们在局部变量之前。
标签索引引用指令序列中的 结构化控制指令。
约定¶
元变量
涵盖标签索引。元变量
涵盖任何其他索引空间中的索引。符号
表示在 中自由出现的来自索引空间 的索引集。有时这个集合被重新解释为其元素的 向量。
注意
例如,如果
类型¶
模块的
模块中使用的所有函数类型都必须在此组件中定义。它们通过 类型索引 来引用。
注意
WebAssembly 的未来版本可能会添加其他形式的类型定义。
函数¶
模块的
函数的
The
表格¶
模块的
表格是特定 引用类型 的不透明值的向量。表格类型 限制 中的
表格可以通过 元素段 来初始化。
内存¶
模块的
内存是原始未解释字节的向量。内存类型 限制 中的
内存可以通过 数据段 来初始化。
内存通过 内存索引 来引用,从最小的不引用内存 导入 的索引开始。大多数构造隐式引用内存索引
注意
在当前版本的 WebAssembly 中,单个模块最多只能定义或导入一个内存,并且 *所有* 结构都隐式引用此内存
全局变量¶
模块的
每个全局变量存储给定 全局类型 的单个值。它的
元素段¶
表的初始内容未初始化。*元素段* 可用于从静态 向量 中的元素初始化表的子范围。
模块的
元素段具有识别它们是 *被动*、*主动* 还是 *声明式* 的模式。被动元素段的元素可以使用
元素段通过 元素索引 引用。
数据段¶
内存 的初始内容为零字节。*数据段* 可用于从静态 向量 中的 字节 初始化内存范围。
模块的
与元素段类似,数据段具有识别它们是 *被动* 还是 *主动* 的模式。被动数据段的内容可以使用
数据段通过 数据索引 引用。
注意
在当前版本的 WebAssembly 中,模块中最多只能允许一个内存。因此,唯一有效的
开始函数¶
模块的
注意
开始函数旨在初始化模块的状态。在初始化完成之前,模块及其导出不能在外部访问。
导出¶
模块的
每个导出都用一个唯一的 名称 进行标记。可导出定义是 函数、表、内存 和 全局变量,它们通过相应的描述符引用。
约定¶
为导出序列定义以下辅助符号,以保持顺序,过滤掉特定类型的索引。
导入¶
模块的
每个导入都由一个两级的 名称 空间标记,包含一个
每个导入在相应的 索引空间 中定义一个索引。在每个索引空间中,导入的索引位于模块本身中包含的任何定义的第一个索引之前。
注意
与导出名称不同,导入名称不一定唯一。可以多次导入同一个