WebAssembly - 程序结构
-
简述
WebAssembly,也称为 WASM,是一种二进制格式的低级代码,旨在以最有效的方式在浏览器中执行。WebAssembly 代码由以下概念构成 -- 值
- 类型
- 指令
现在让我们详细了解它们。 -
值
WebAssembly 中的值用于存储复杂数据,例如文本、字符串和向量。WebAssembly 支持以下内容 -- 字节
- 整数
- 浮点
- 名称
字节
字节是 WebAssembly 支持的最简单的值形式。该值采用十六进制格式。例如表示为b的字节也可以采用自然数 n,其中 n <256。byte ::= 0x00| .... |0xFF
整数
在 WebAssembly 中,支持的整数如下所示 -- i32:32 位整数
- i64:64 位整数
浮点
在 WebAssembly 中支持的浮点数如下 -- f32:32 位浮点数
- f64:64 位浮点数
名称
名称是字符序列,标量值由 Unicode 定义,可在链接http://www.unicode.org/versions/Unicode12.1.0/中获得。 -
类型
WebAssembly 中的实体被分类为类型。支持的类型如下所述 -- Value 类型
- Result 类型
- Function 类型
- Limits
- Memory 类型
- Table 类型
- Global 类型
- External 类型
让我们一一研究。Value 类型
WebAssembly 支持的值类型如下所述 -- i32:32 位整数
- i64:64 位整数
- f32:32 位浮点数
- f64:64 位浮点数
valtype ::= i32|i64|f32|f64
Result 类型
写在括号内的值被执行并存储在结果类型中。结果类型是执行由值组成的代码块的输出。resulttype::=[valtype?]
Function 类型
函数类型将接受参数向量返回结果向量。functype::=[vec(valtype)]--> [vec(valtype)]
Limits
Limits 是与内存和表类型相关的存储范围。limits ::= {min u32, max u32}
Memory 类型
Memory 类型处理线性内存和大小范围。memtype ::= limits
Table 类型
Table 类型按分配给它的元素类型分类。tabletype ::= limits elemtype elemtype ::= funcref
表类型取决于分配给它的最小和最大大小的限制。Global 类型
全局类型保存具有值的全局变量,可以更改或保持不变。globaltype ::= mut valtype mut ::= const|var
External 类型
外部类型处理导入和外部值。externtype ::= func functype | table tabletype | mem memtype | global globaltype
-
指令
WebAssembly 代码是遵循堆栈机器模型的指令序列。由于 WebAssembly 遵循堆栈机器模型,因此指令被推送到堆栈上。例如,函数的参数值从堆栈中弹出,结果被推回堆栈。最后,堆栈中将只有一个值,这就是结果。一些常用的指令如下 -- 数字指令
- 变量指令
数字指令
数值指令是对数值执行的操作。例如nn, mm ::= 32|64 ibinop ::= add|sub|mul|div_sx|rem_sx|and|or|xor irelop ::= eq | ne | lt_sx | gt_sx | le_sx | ge_sx frelop ::= eq | ne | lt | gt | le | ge
变量指令
变量指令是关于访问局部和全局变量的。例如访问局部变量 -get_local $a get_local $b
设置局部变量 -set_local $a set_local $b
访问全局变量 -get_global $a get_global $b
设置全局变量 -set_global $a set_global $b