类型¶
WebAssembly 中的各种实体按类型分类。类型在 验证、实例化 和可能 执行 期间进行检查。
数值类型¶
数值类型 对数值进行分类。
类型 \(\href{../syntax/types.html#syntax-valtype}{\mathsf{i32}}\) 和 \(\href{../syntax/types.html#syntax-valtype}{\mathsf{i64}}\) 分别对 32 位和 64 位整数进行分类。整数本身不是有符号或无符号的,它们的解释由各个操作决定。
类型 \(\href{../syntax/types.html#syntax-valtype}{\mathsf{f32}}\) 和 \(\href{../syntax/types.html#syntax-valtype}{\mathsf{f64}}\) 分别对 32 位和 64 位浮点数进行分类。它们对应于各自的二进制浮点数表示,也称为单精度和双精度,如 IEEE 754 标准(第 3.3 节)中定义。
数值类型是透明的,这意味着它们的位模式可以被观察到。数值类型的数值可以存储在 内存 中。
约定¶
符号 \(|t|\) 表示数值类型 \(t\) 的位宽。也就是说,\(|\href{../syntax/types.html#syntax-valtype}{\mathsf{i32}}| = |\href{../syntax/types.html#syntax-valtype}{\mathsf{f32}}| = 32\) 和 \(|\href{../syntax/types.html#syntax-valtype}{\mathsf{i64}}| = |\href{../syntax/types.html#syntax-valtype}{\mathsf{f64}}| = 64\).
向量类型¶
向量类型 对向量类型的 数值 进行分类,这些数值由向量指令(也称为SIMD 指令,单指令多数据)处理。
类型 \(\href{../syntax/types.html#syntax-valtype}{\mathsf{v128}}\) 对应于一个 128 位向量,其中包含打包的整数或浮点数数据。打包数据可以解释为有符号或无符号整数、单精度或双精度浮点数,或单个 128 位类型。解释由各个操作决定。
向量类型,类似于 数值类型 是透明的,这意味着它们的位模式可以被观察到。向量类型的数值可以存储在 内存 中。
约定¶
符号 \(|t|\) 用于表示 位宽,也扩展到向量类型,也就是说,\(|\href{../syntax/types.html#syntax-valtype}{\mathsf{v128}}| = 128\).
引用类型¶
引用类型 对运行时 存储 中对象的**一等公民**引用进行分类。
类型 \(\href{../syntax/types.html#syntax-reftype}{\mathsf{funcref}}\) 表示对所有 函数 的引用的无限并集,无论它们的 函数类型 是什么。
类型 \(\href{../syntax/types.html#syntax-reftype}{\mathsf{externref}}\) 表示对 嵌入器 拥有的所有对象的引用的无限并集,这些对象可以以这种类型传递到 WebAssembly 中。
引用类型是不透明的,这意味着既不能观察到它们的大小,也不能观察到它们的位模式。引用类型的数值可以存储在 表格 中。
值类型¶
值类型 对 WebAssembly 代码可以计算的各个值以及变量接受的值进行分类。它们可以是 数值类型、向量类型 或 引用类型。
约定¶
元变量 \(t\) 表示值类型或其子类,在上下文中明确的情况下。
结果类型¶
结果类型 对 执行 指令 或 函数 的结果进行分类,该结果是值的序列,用方括号表示。
函数类型¶
函数类型 对 函数 的签名进行分类,将参数向量映射到结果向量。它们也用于对 指令 的输入和输出进行分类。
限制¶
限制 对与 内存类型 和 表格类型 相关的可调整大小存储的范围进行分类。
如果没有给出最大值,相应的存储可以增长到任何大小。
内存类型¶
内存类型 对线性 内存 及其范围进行分类。
限制约束了内存的最小值和可选的最大值。限制以 页面大小 为单位。
表格类型¶
表格类型 对 表格 进行分类,这些表格在一定范围内包含 引用类型 的元素。
与内存类似,表格也受到限制,用于限制其最小值和可选的最大值。限制以条目数为单位。
注意
在 WebAssembly 的未来版本中,可能会引入其他元素类型。
全局类型¶
全局类型 对 全局 变量进行分类,这些变量保存一个值,并且可以是可变的或不可变的。
外部类型¶
约定¶
以下辅助符号定义了外部类型序列。它以保持顺序的方式过滤掉特定类型的条目
\(\href{../syntax/types.html#syntax-externtype}{\mathrm{funcs}}(\href{../syntax/types.html#syntax-externtype}{\mathit{externtype}}^\ast) = [\href{../syntax/types.html#syntax-functype}{\mathit{functype}} ~|~ (\href{../syntax/types.html#syntax-externtype}{\mathsf{func}}~\href{../syntax/types.html#syntax-functype}{\mathit{functype}}) \in \href{../syntax/types.html#syntax-externtype}{\mathit{externtype}}^\ast]\)
\(\href{../syntax/types.html#syntax-externtype}{\mathrm{tables}}(\href{../syntax/types.html#syntax-externtype}{\mathit{externtype}}^\ast) = [\href{../syntax/types.html#syntax-tabletype}{\mathit{tabletype}} ~|~ (\href{../syntax/types.html#syntax-externtype}{\mathsf{table}}~\href{../syntax/types.html#syntax-tabletype}{\mathit{tabletype}}) \in \href{../syntax/types.html#syntax-externtype}{\mathit{externtype}}^\ast]\)
\(\href{../syntax/types.html#syntax-externtype}{\mathrm{mems}}(\href{../syntax/types.html#syntax-externtype}{\mathit{externtype}}^\ast) = [\href{../syntax/types.html#syntax-memtype}{\mathit{memtype}} ~|~ (\href{../syntax/types.html#syntax-externtype}{\mathsf{mem}}~\href{../syntax/types.html#syntax-memtype}{\mathit{memtype}}) \in \href{../syntax/types.html#syntax-externtype}{\mathit{externtype}}^\ast]\)
\(\href{../syntax/types.html#syntax-externtype}{\mathrm{globals}}(\href{../syntax/types.html#syntax-externtype}{\mathit{externtype}}^\ast) = [\href{../syntax/types.html#syntax-globaltype}{\mathit{globaltype}} ~|~ (\href{../syntax/types.html#syntax-externtype}{\mathsf{global}}~\href{../syntax/types.html#syntax-globaltype}{\mathit{globaltype}}) \in \href{../syntax/types.html#syntax-externtype}{\mathit{externtype}}^\ast]\)