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种,还有结果类型和外部类型,结果类型表示函数或表达式的执行结果,外部类型是函数类型、表类型、内存类型和全局变量类型的集合。