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
相关推荐
Hello.Reader1 分钟前
Rust + WebAssembly 上线实战指南
开发语言·rust·wasm
受之以蒙4 天前
Rust & WebAssembly:探索js-sys的奇妙世界
笔记·rust·webassembly
Hello.Reader4 天前
Rust → WebAssembly 的性能剖析全指南
前端·rust·wasm
27669582926 天前
东方航空 m端 wasm req res分析
java·python·node·wasm·东方航空·东航·东方航空m端
Jacob02347 天前
为什么现在越来越多项目选择混合开发?从 WebAssembly 在无服务器中的表现说起
架构·rust·webassembly
明天好,会的9 天前
从Spark/Flink到WASM:流式处理框架的演进与未来展望
flink·spark·wasm
狗都不学爬虫_9 天前
JS逆向 - (国外)SHEIN站 - 请求头(armorToken、Anti-in)
javascript·python·ajax·网络爬虫·wasm
奇舞精选10 天前
从零开始实现Vue3+WebAssembly万级数据表格开发流程
vue.js·webassembly
PegasusYu15 天前
Electron使用WebAssembly实现CRC-16 原理校验
javascript·electron·nodejs·wasm·webassembly·crc·crc16
狗都不学爬虫_15 天前
JS逆向 - 滴滴(dd03、dd05)WSGSIG
javascript·爬虫·python·网络爬虫·wasm