WebAssembly - 程序结构
WebAssembly,也称为 WASM,是一种二进制格式的低级代码,旨在以最有效的方式在浏览器内执行。 WebAssembly 代码由以下概念构成 −
- 值
- 类型
- 说明
现在让我们详细了解它们。
值
WebAssembly 中的值旨在存储复杂的数据,例如文本、字符串和向量。 WebAssembly 支持以下内容 −
- 字节
- 整数
- 浮点数
- Names
字节
字节是 WebAssembly 支持的最简单的值形式。 该值是十六进制格式.
例如字节表示为b,也可以取自然数n,其中 n <256
byte ::= 0x00| .... |0xFF
整数
在 WebAssembly 中,支持的整数如下所示 −
- i32:32 位整数
- i64:64 位整数
浮点
WebAssembly 中支持的浮点数如下 −
- f32:32位浮点数
- f64:64位浮点数
Names
名称是字符序列,具有由 Unicode 定义的标量值,可在此处给出的链接 http://www.unicode.org/versions/Unicode12.1.0/ 处获得。
类型
WebAssembly 中的实体被分类为类型。 支持的类型如下所示 −
- 值类型
- 结果类型
- 函数类型
- Limits 限制
- 内存类型
- 表类型
- 全局类型
- 外部类型
让我们一一研究一下。
值类型
WebAssembly 支持的值类型如下 −
- i32:32 位整数
- i64:64 位整数
- f32:32位浮点
- f64:64位浮点
valtype ::= i32|i64|f32|f64
结果类型
括号内写入的值将被执行并存储在结果类型内。 结果类型是执行由值组成的代码块的输出。
resulttype::=[valtype?]
函数类型
函数类型将接受参数向量返回结果向量。
functype::=[vec(valtype)]--> [vec(valtype)]
Limits
Limits 限制是与内存和表类型相关的存储范围。
limits ::= {min u32, max u32}
内存类型
内存类型涉及线性内存和大小范围。
memtype ::= limits
表类型
表类型按分配给它的元素类型进行分类。
tabletype ::= limits elemtype elemtype ::= funcref
表类型取决于分配给它的最小和最大大小的限制。
全局类型
全局类型保存具有值的全局变量,可以更改或保持不变。
globaltype ::= mut valtype mut ::= const|var
外部类型
外部类型处理导入和外部值。
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