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
相关推荐
技术猿188702783514 天前
PHP 与 WebAssembly 的 “天然隔阂”
开发语言·php·wasm
小猪猪屁12 天前
WebAssembly 从零到实战:前端性能革命完全指南
前端·vue.js·webassembly
早起的年轻人14 天前
Flutter WebAssembly (Wasm) 支持 - 实用指南Flutter WebAssembly (Wasm) 支持 - 实用指南
flutter·wasm
pepedd86414 天前
WebAssembly简单入门
前端·webassembly·trae
受之以蒙17 天前
Rust & WebAssembly 实践:构建一个简单实时的 Markdown 编辑器
笔记·rust·webassembly
wayhome在哪19 天前
3 分钟上手!用 WebAssembly 优化前端图片处理性能(附完整代码)
javascript·性能优化·webassembly
yangholmes888822 天前
EMSCRIPTEN File System 入门
前端·webassembly
yangholmes88881 个月前
如何在 web 应用中使用 GDAL (三)
前端·webassembly
yangholmes88881 个月前
如何在 web 应用中使用 GDAL (二)
前端·webassembly
yangholmes88881 个月前
如何在 web 应用中使用 GDAL (一)
webassembly