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

一、Value Type

二、Function

三、Memory

四、Table

五、Global

六、External

一、Value Type

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

1. Number

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

2. Vector

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

3. Reference

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

二、Function

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

三、Memory

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

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

四、Table

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

五、Global

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

六、External

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

WebAssembly核心编程[2]:类型系统的更多相关文章

  1. Qt on Android 核心编程

    Qt on Android 核心编程(最好看的Qt编程书!CSDN博主foruok倾力奉献!) 安晓辉 著   ISBN 978-7-121-24457-5 2015年1月出版 定价:65.00元 4 ...

  2. windows核心编程 - 线程同步机制

    线程同步机制 常用的线程同步机制有很多种,主要分为用户模式和内核对象两类:其中 用户模式包括:原子操作.关键代码段 内核对象包括:时间内核对象(Event).等待定时器内核对象(WaitableTim ...

  3. windows核心编程---第九章 同步设备IO与异步设备IO之同步IO

    同步设备IO 所谓同步IO是指线程在发起IO请求后会被挂起,IO完成后继续执行. 异步IO是指:线程发起IO请求后并不会挂起而是继续执行.IO完毕后会得到设备的通知.而IO完成端口就是实现这种通知的很 ...

  4. windows核心编程---第八章 使用内核对象进行线程同步

    使用内核对象进行线程同步. 前面我们介绍了用户模式下线程同步的几种方式.在用户模式下进行线程同步的最大好处就是速度非常快.因此当需要使用线程同步时用户模式下的线程同步是首选. 但是用户模式下的线程同步 ...

  5. python核心编程(第二版)习题

    重新再看一遍python核心编程,把后面的习题都做一下.

  6. Python核心编程这本书的一些错误

    <Python核心编程第二版>这本书比<Python基础教程第二版修订版>详细很多,丰富了很多细节,虽然它是一本经典的入门书,但我发现还是存在一些明显的错误.在面向对象编程这一 ...

  7. windows核心编程---第二章 字符和字符串处理

        使用vc编程时项目-->属性-->常规栏下我们可以设置项目字符集合,它可以是ANSI(多字节)字符集,也可以是unicode字符集.一般情况下说Unicode都是指UTF-16.也 ...

  8. 回忆读windows 核心编程

    看<windows 核心编程> 第五版到纤程了,下一章节即将介绍内存体系编程.如果做window平台下的开发,我感觉此书一定要读.记得开始讲解了window的基础,然后讲解内核对象.内核对 ...

  9. 正则表达式:re--python核心编程(3),chapter 1

    最近听吴老的电台,收获颇多,给人映像最深的就是:学会编程 和 坚持学习:作为一名测试员,要从一名手工测试转化成 测试开发 或者资深的测试工程师,编码水平是必须具备的基本素质:吴老所说,撸1W到2W行代 ...

  10. Python核心编程-描述符

    python中,什么描述符.描述符就是实现了"__get__"."__set__"或"__delete__" 方法中至少一个的对象.什么是非 ...

随机推荐

  1. P3574 [POI2014]FAR-FarmCraft (树形DP)

    这题直接贪心显然不可行. 考虑树形dp,用 \(f_i\) 表示到 \(i\) 人后,以 \(i\) 为根的所有人安装完的最短时间. 对于一个节点 \(u\), 假设拜访子节点的顺序为 \(v_1,v ...

  2. AtCoder Beginner Contest 177 (个人题解,C后缀和,D并查集,E质因数分解)

    补题链接:Here A - Don't be late 题意:高桥(Takahashi )现在要去距离家 \(D\) 米的地方面基,请问如果以最高速度 \(S\) 能否再 \(T\) 时刻准时到达? ...

  3. [Violation] Added non-passive event listener to a scroll-blocking 'mousewheel' event.

    在基于 Element-ui 写项目的时候,Chrome 提醒: [Violation] Added non-passive event listener to a scroll-blocking ' ...

  4. CommonJS 和 ES6 Module 究竟有什么区别?

    https://juejin.im/post/5e5f10176fb9a07cd443c1e2

  5. c#.net 6 实现简单爬虫几行代码实现百度搜索

    使用selenium封装的简单使用工具包 Gitee:SeleniumUtil: Selenium简化工具包,包含三个主流浏览器的一些基本操作 (gitee.com) 第一步安装爬虫工具: 在程序包管 ...

  6. Nacos源码 (4) 配置中心

    本文阅读nacos-2.0.2的config源码,编写示例,分析推送配置.监听配置的原理. 客户端 创建NacosConfigService对象 Properties properties = new ...

  7. C语言中的操作符:了解与实践

    ​ 欢迎大家来到贝蒂大讲堂 ​ 养成好习惯,先赞后看哦~ ​ 所属专栏:C语言学习 ​ 贝蒂的主页:Betty's blog 1. 操作符的分类 操作符又叫运算符,它在C语言中起着非常大的作用,以下是 ...

  8. Laravel组件化开发学习笔记

    组件化开发就是基于组件来进行迭代开发,而不是从零开始开发 1.语法基础 组件开发的基础语法是命名空间. 可以使用魔法常量__NAMESPACE__可以直接获取当前命名空间的名称的字符串. 例如: &l ...

  9. PageHelper 分页不起作用

    将 reasonable 设置为 false   .

  10. Laravel - 改为国内镜像

    composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/    (阿里云) 或 composer ...