WebAssembly核心编程[2]:类型系统

对于绝大多数编程语言来说,类型都是编程的基础,WebAssembly自然也不例外。总的来说,WebAssembly涉及的类型不多,很好掌握,接下来我们就来介绍一下WebAssembly编程涉及到的几种类型。本篇内容参考WebAssembly Spec

一、Value Type

二、Function

三、Memory

四、Table

五、Global

六、External

一、Value Type

值类型(Value Type)在WebAssembly中主要分为三种,它们分别是数字(Number )、向量(Vector)和引用(Reference)。

image

1. Number

WebAssembly涉及数字只包含整数和浮点数,具体又有32位(4字节)和64位(8字节),所以WebAssembly支持的数字类型只包括i32、i64、f32、f64四种。

image

2. Vector

WebAssembly对单指令多数据(SIMD)提供了原生的支持,这进一步提升了它的性能。SIMD指令将一个128位的向量作为操作数,我们可以将多个整数或者浮点数组合成一个向量。比如某个支持i32的指令,采用SIMD方式进行执行理论上可以获得4倍的性能。

image

3. Reference

顾名思义,一个引用类型的变量代表一个指向某个目标对象的指针。目前WebAssembly设计的引用类型只有两种,一种是引用来源于宿主应用的JavaScript对象。由于对于wasm模块来说,这是一种外部引用,所以被定义成externref。另一种被命名位funcref的则是对自身Native函数的引用。

image

二、Function

函数本质上一组输入参数与一组输出结果的映射。虽然WebAssembly的函数目前还不支持返回多个结果,但是后续版本肯定会支持。输入参数列表和输出结果列表可以统一表示为"结果类型(resulttype)",具体来说就是一组值类型(数字、向量和引用)的有序组合,所以函数类型自然就表示成一个resulttype对象到另一个resulttype的映射。

image
image

三、Memory

Memory和Table都是一组连续的、限定长度的"区间",所以WebAssembly专门定义了limits这样一个类型来表示"长度限制"。一个limits必需使指定最小边界(min),可缺省的最长边界如果没有指定,意味着可以无限"扩容"。

image

Memory以单纯的二进制字节的形式来存储一组数据。由于数据类型确定,我们只需要指定"长度限制",所以Memory可以通过limits来表示。

image

四、Table

Memory和Table的不同指出在于它们存储的元素类型,前者为单纯的二进制字节,后者则是指定类型的对象。具体来说,Table的元素为"引用",要么是指向宿主应用提供的JavaScript对象(externref),要么是自身定义的函数(funcref)。

image

五、Global

用来表示"全局变量"的Global存储值类型(数字、向量和引用),mut(Mutable)用来表示对应的全局变量是否允许修改。

image

六、External

这里External表示可以导出的,作为宿主程序的"外部"对象。宿主应用可以从加载的wasm模块导出的对象类型包括:函数、Table、Memory和Global。

image
相关推荐
techdashen4 天前
Wasm 程序崩溃了,除了加 printf 还能怎么办
wasm
kyriewen4 天前
你的前端滤镜慢得像PPT?用Rust+WebAssembly,一秒处理4K图
前端·rust·webassembly
27669582926 天前
599比分wasm逆向
websocket·wasm·599比分·599比分逆向·599比分wasm·ads-tracker·tracker-baidu
kyriewen7 天前
WebAssembly:前端界的“外挂”,让C++代码在浏览器里跑起来
前端·c++·webassembly
高台树色11 天前
WASM 开发指南:Rust 与 JavaScript
webassembly
techdashen12 天前
用 Rust 写 Serverless:Cloudflare Workers + WebAssembly 实践
rust·serverless·wasm
comerzhang65523 天前
Web 性能的架构边界:跨线程信令通道的确定性分析
javascript·webassembly
NotFound48624 天前
Go语言中的图形界面开发实战解析:从GUI到WebAssembly
开发语言·golang·wasm
2401_8326355824 天前
小白分享如何Go 语言中的图形界面开发:从 GUI 到 WebAssembly
microsoft·golang·wasm
爱分享的阿Q1 个月前
RustWebAssembly商用元年从实验到生产完整迁移指南
rust·web·wasm