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