WebAssembly核心编程[2]:类型系统
对于绝大多数编程语言来说,类型都是编程的基础,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]:类型系统的更多相关文章
- Qt on Android 核心编程
Qt on Android 核心编程(最好看的Qt编程书!CSDN博主foruok倾力奉献!) 安晓辉 著 ISBN 978-7-121-24457-5 2015年1月出版 定价:65.00元 4 ...
- windows核心编程 - 线程同步机制
线程同步机制 常用的线程同步机制有很多种,主要分为用户模式和内核对象两类:其中 用户模式包括:原子操作.关键代码段 内核对象包括:时间内核对象(Event).等待定时器内核对象(WaitableTim ...
- windows核心编程---第九章 同步设备IO与异步设备IO之同步IO
同步设备IO 所谓同步IO是指线程在发起IO请求后会被挂起,IO完成后继续执行. 异步IO是指:线程发起IO请求后并不会挂起而是继续执行.IO完毕后会得到设备的通知.而IO完成端口就是实现这种通知的很 ...
- windows核心编程---第八章 使用内核对象进行线程同步
使用内核对象进行线程同步. 前面我们介绍了用户模式下线程同步的几种方式.在用户模式下进行线程同步的最大好处就是速度非常快.因此当需要使用线程同步时用户模式下的线程同步是首选. 但是用户模式下的线程同步 ...
- python核心编程(第二版)习题
重新再看一遍python核心编程,把后面的习题都做一下.
- Python核心编程这本书的一些错误
<Python核心编程第二版>这本书比<Python基础教程第二版修订版>详细很多,丰富了很多细节,虽然它是一本经典的入门书,但我发现还是存在一些明显的错误.在面向对象编程这一 ...
- windows核心编程---第二章 字符和字符串处理
使用vc编程时项目-->属性-->常规栏下我们可以设置项目字符集合,它可以是ANSI(多字节)字符集,也可以是unicode字符集.一般情况下说Unicode都是指UTF-16.也 ...
- 回忆读windows 核心编程
看<windows 核心编程> 第五版到纤程了,下一章节即将介绍内存体系编程.如果做window平台下的开发,我感觉此书一定要读.记得开始讲解了window的基础,然后讲解内核对象.内核对 ...
- 正则表达式:re--python核心编程(3),chapter 1
最近听吴老的电台,收获颇多,给人映像最深的就是:学会编程 和 坚持学习:作为一名测试员,要从一名手工测试转化成 测试开发 或者资深的测试工程师,编码水平是必须具备的基本素质:吴老所说,撸1W到2W行代 ...
- Python核心编程-描述符
python中,什么描述符.描述符就是实现了"__get__"."__set__"或"__delete__" 方法中至少一个的对象.什么是非 ...
随机推荐
- 7 Englishi 词根
1.跟直播,跟复习课,完成作业 2. 基础差加餐,听录播 3.如何听课 4.单词学习反复多次 如何记笔记 语块的汉语意思 单词的记忆方式和固定表达 俩种方式记忆单词 语块关联记忆 基础词根词缀(6节课 ...
- Visual Studio Code如何校验yaml格式文件
1.yaml格式校验快捷键:Shift+Alt+F默认没有安装,这时候点击安装: 2.选择YAML Language Support by Red Hat 3.安装完成后,自动开启校验,当格式错误 ...
- @EnableFeignClients注解源码解析
转载请注明出处: @EnableFeignClients 注解定义的源码 @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.TYPE}) ...
- std::istringstream的用法
1.概要 std::istringstream 是 C++ 标准库中的一个类,它用于从字符串中提取数据,并将数据转换为不同的数据类型.它通常用于从字符串中解析数据,例如整数.浮点数等.以下是关于 st ...
- [转帖]goproxy 使用说明
Go 版本要求 建议您使用 Go 1.13 及以上版本, 可以在这里下载最新的 Go 稳定版本. 配置 Goproxy 环境变量 Bash (Linux or macOS) export GOPROX ...
- [转帖]一、Kafka Tool使用
一.Kafka Tool使用 1.添加cluster 2.开启SASL_PLAINTEXT 如果kafka 开启SASL_PLAINTEXT认证(用户名和密码认证) 3.高级设置 如果设置的是SASL ...
- [转帖]redis 持久化方式 - aof 和 rdb 区别
https://wenfh2020.com/2020/04/01/redis-persistence-diff/ aof 和 rdb 是 redis 持久化的两种方式.我们看看它们的特点和具体应用 ...
- [转帖]《AWK程序设计语言》笔记(1)—— AWK入门与简单案例
原文为 <The AWK Programming Language>,GitHub上有中译版,不过有些内容翻译的比较奇怪,建议跟原版对照着看 https://github.com/wuzh ...
- 【转帖】nginx变量使用方法详解-4
https://www.diewufeiyang.com/post/578.html 在设置了"取处理程序"的情况下,Nginx 变量也可以选择将其值容器用作缓存,这样在多次读取变 ...
- [转帖]ansible小结(七)常用模块
ansible小结(七)常用模块 http://www.361way.com/ansible-modules/4415.html 在上一篇中介绍了commands部分模块,本篇承接上篇介绍下常用的 ...