类型

WebAssembly 中的各种实体按类型分类。类型在 验证实例化 和可能 执行 期间进行检查。

数值类型

数值类型 对数值进行分类。

\[\begin{split}\begin{array}{llll} \def\mathdef2599#1{{}}\mathdef2599{数值类型} & \href{../syntax/types.html#syntax-numtype}{\mathit{numtype}} &::=& \href{../syntax/types.html#syntax-valtype}{\mathsf{i32}} ~|~ \href{../syntax/types.html#syntax-valtype}{\mathsf{i64}} ~|~ \href{../syntax/types.html#syntax-valtype}{\mathsf{f32}} ~|~ \href{../syntax/types.html#syntax-valtype}{\mathsf{f64}} \\ \end{array}\end{split}\]

类型 \(\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 指令,单指令多数据)处理。

\[\begin{split}\begin{array}{llll} \def\mathdef2599#1{{}}\mathdef2599{向量类型} & \href{../syntax/types.html#syntax-vectype}{\mathit{vectype}} &::=& \href{../syntax/types.html#syntax-valtype}{\mathsf{v128}} \\ \end{array}\end{split}\]

类型 \(\href{../syntax/types.html#syntax-valtype}{\mathsf{v128}}\) 对应于一个 128 位向量,其中包含打包的整数或浮点数数据。打包数据可以解释为有符号或无符号整数、单精度或双精度浮点数,或单个 128 位类型。解释由各个操作决定。

向量类型,类似于 数值类型透明的,这意味着它们的位模式可以被观察到。向量类型的数值可以存储在 内存 中。

约定

  • 符号 \(|t|\) 用于表示 位宽,也扩展到向量类型,也就是说,\(|\href{../syntax/types.html#syntax-valtype}{\mathsf{v128}}| = 128\).

引用类型

引用类型 对运行时 存储 中对象的**一等公民**引用进行分类。

\[\begin{split}\begin{array}{llll} \def\mathdef2599#1{{}}\mathdef2599{引用类型} & \href{../syntax/types.html#syntax-reftype}{\mathit{reftype}} &::=& \href{../syntax/types.html#syntax-reftype}{\mathsf{funcref}} ~|~ \href{../syntax/types.html#syntax-reftype}{\mathsf{externref}} \\ \end{array}\end{split}\]

类型 \(\href{../syntax/types.html#syntax-reftype}{\mathsf{funcref}}\) 表示对所有 函数 的引用的无限并集,无论它们的 函数类型 是什么。

类型 \(\href{../syntax/types.html#syntax-reftype}{\mathsf{externref}}\) 表示对 嵌入器 拥有的所有对象的引用的无限并集,这些对象可以以这种类型传递到 WebAssembly 中。

引用类型是不透明的,这意味着既不能观察到它们的大小,也不能观察到它们的位模式。引用类型的数值可以存储在 表格 中。

值类型

值类型 对 WebAssembly 代码可以计算的各个值以及变量接受的值进行分类。它们可以是 数值类型向量类型引用类型

\[\begin{split}\begin{array}{llll} \def\mathdef2599#1{{}}\mathdef2599{值类型} & \href{../syntax/types.html#syntax-valtype}{\mathit{valtype}} &::=& \href{../syntax/types.html#syntax-numtype}{\mathit{numtype}} ~|~ \href{../syntax/types.html#syntax-vectype}{\mathit{vectype}} ~|~ \href{../syntax/types.html#syntax-reftype}{\mathit{reftype}} \\ \end{array}\end{split}\]

约定

  • 元变量 \(t\) 表示值类型或其子类,在上下文中明确的情况下。

结果类型

结果类型执行 指令函数 的结果进行分类,该结果是值的序列,用方括号表示。

\[\begin{split}\begin{array}{llll} \def\mathdef2599#1{{}}\mathdef2599{结果类型} & \href{../syntax/types.html#syntax-resulttype}{\mathit{resulttype}} &::=& [\href{../syntax/conventions.html#syntax-vec}{\mathit{vec}}(\href{../syntax/types.html#syntax-valtype}{\mathit{valtype}})] \\ \end{array}\end{split}\]

函数类型

函数类型函数 的签名进行分类,将参数向量映射到结果向量。它们也用于对 指令 的输入和输出进行分类。

\[\begin{split}\begin{array}{llll} \def\mathdef2599#1{{}}\mathdef2599{函数类型} & \href{../syntax/types.html#syntax-functype}{\mathit{functype}} &::=& \href{../syntax/types.html#syntax-resulttype}{\mathit{resulttype}} \href{../syntax/types.html#syntax-functype}{\rightarrow} \href{../syntax/types.html#syntax-resulttype}{\mathit{resulttype}} \\ \end{array}\end{split}\]

限制

限制 对与 内存类型表格类型 相关的可调整大小存储的范围进行分类。

\[\begin{split}\begin{array}{llll} \def\mathdef2599#1{{}}\mathdef2599{限制} & \href{../syntax/types.html#syntax-limits}{\mathit{limits}} &::=& \{ \href{../syntax/types.html#syntax-limits}{\mathsf{min}}~\href{../syntax/values.html#syntax-int}{\mathit{u32}}, \href{../syntax/types.html#syntax-limits}{\mathsf{max}}~\href{../syntax/values.html#syntax-int}{\mathit{u32}}^? \} \\ \end{array}\end{split}\]

如果没有给出最大值,相应的存储可以增长到任何大小。

内存类型

内存类型 对线性 内存 及其范围进行分类。

\[\begin{split}\begin{array}{llll} \def\mathdef2599#1{{}}\mathdef2599{内存类型} & \href{../syntax/types.html#syntax-memtype}{\mathit{memtype}} &::=& \href{../syntax/types.html#syntax-limits}{\mathit{limits}} \\ \end{array}\end{split}\]

限制约束了内存的最小值和可选的最大值。限制以 页面大小 为单位。

表格类型

表格类型表格 进行分类,这些表格在一定范围内包含 引用类型 的元素。

\[\begin{split}\begin{array}{llll} \def\mathdef2599#1{{}}\mathdef2599{表格类型} & \href{../syntax/types.html#syntax-tabletype}{\mathit{tabletype}} &::=& \href{../syntax/types.html#syntax-limits}{\mathit{limits}}~\href{../syntax/types.html#syntax-reftype}{\mathit{reftype}} \\ \end{array}\end{split}\]

与内存类似,表格也受到限制,用于限制其最小值和可选的最大值。限制以条目数为单位。

注意

在 WebAssembly 的未来版本中,可能会引入其他元素类型。

全局类型

全局类型全局 变量进行分类,这些变量保存一个值,并且可以是可变的或不可变的。

\[\begin{split}\begin{array}{llll} \def\mathdef2599#1{{}}\mathdef2599{全局类型} & \href{../syntax/types.html#syntax-globaltype}{\mathit{globaltype}} &::=& \href{../syntax/types.html#syntax-mut}{\mathit{mut}}~\href{../syntax/types.html#syntax-valtype}{\mathit{valtype}} \\ \def\mathdef2599#1{{}}\mathdef2599{可变性} & \href{../syntax/types.html#syntax-mut}{\mathit{mut}} &::=& \href{../syntax/types.html#syntax-mut}{\mathsf{const}} ~|~ \href{../syntax/types.html#syntax-mut}{\mathsf{var}} \\ \end{array}\end{split}\]

外部类型

外部类型导入外部值 及其各自的类型进行分类。

\[\begin{split}\begin{array}{llll} \def\mathdef2599#1{{}}\mathdef2599{外部类型} & \href{../syntax/types.html#syntax-externtype}{\mathit{externtype}} &::=& \href{../syntax/types.html#syntax-externtype}{\mathsf{func}}~\href{../syntax/types.html#syntax-functype}{\mathit{functype}} ~|~ \href{../syntax/types.html#syntax-externtype}{\mathsf{table}}~\href{../syntax/types.html#syntax-tabletype}{\mathit{tabletype}} ~|~ \href{../syntax/types.html#syntax-externtype}{\mathsf{mem}}~\href{../syntax/types.html#syntax-memtype}{\mathit{memtype}} ~|~ \href{../syntax/types.html#syntax-externtype}{\mathsf{global}}~\href{../syntax/types.html#syntax-globaltype}{\mathit{globaltype}} \\ \end{array}\end{split}\]

约定

以下辅助符号定义了外部类型序列。它以保持顺序的方式过滤掉特定类型的条目

  • \(\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]\)