Wasm定义了8种实体类型,下面依次介绍。

    1、值类型
    Wasm 1.1定义了4种值类型:
    32位整数(i32)
    64位整数(i64)
    32位浮点数(f32)
    64位浮点数(f64)
    高级语言所支持的一切类型(例如布尔值、数值、指针、数组、结构体等),都必须由编译器翻译成这4种基本类型或者组合。go语言可将这4个ID定义为常量。代码如下:
    //type 类似于C/++的typedef关键字实际是有所区别的,这儿定义了一种新的byte类型叫ValType
    type ValType = byte
    const (
    ValTypeI32 ValType = 0x7F //i32
    ValTypeI64 ValType = 0x7E //i64
    ValTypeF32 ValType = 0x7D //f32
    ValTypeF64 ValType = 0x7C //f64
    )
    与高级语言的整数类型有所不同,Wasm底层的整数类型是不区分符号的,当需要强调整数的符号时,我们将使用u32、u64表示32位和64位无符号整数,使用s32、s64表示有符号整数。

    2、函数类型
    函数类型也就是函数的签名或原型,描述函数的参数数量和类型,以及返回值数量和类型、Wasm函数可以有多个返回值这一点和go语言一样,下面是函数类型的结构体定义
    type FuncType struct {
    ParamTypes []ValType
    ResultTypes []ValType
    }
    最初Wasm规范只能有一个返回值,现在多返回值提案放开了。

    3、限制类型
    限制类型用于描述表的元素数量或内存页数的上下限,下面是限制类型的结构体定义。
    type Limits struct {
    Tag byte
    Min uint32
    Max uint32
    }

    4、内存类型
    内存类型只须描述内存的页数限制,所以定义成限制的别名即可。
    type MemType = Limits

    5、表类型
    表类型需要描述表的元素类型以及元素数量的限制,Wasm只定义了一种元素类型,即函数引用,不过未来可能有其他元素类型。下面是表类型的定义
    const FunRef = 0x70
    type TableType struct {
    ElemType byte //目前只能是0x70
    Limits Limits
    }

    6、全局变量类型
    全局变量类型需要描述全局变量的类型以及可变性,下面是全局变量类型的定义。
    const (
    MutConst byte = 0
    MutVar byte = 1
    )
    type GlobalType struct {
    ValType ValType
    Mut byte
    }

    Wasm实体类型除了以上6种,还有结果类型和外部类型,结果类型表示函数或表达式的执行结果外部类型是函数类型、表类型、内存类型和全局变量类型的集合。