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