资源与支持

https://www.epubit.com

WASM诞生背景

是一种新兴的网页虚拟机标准,设计目标:

  • 高可移植性
  • 高安全性
  • 高效率(包括载入效率和运行效率)
  • 尽可能小的程序体积

asm.js

asm.js 与 WebAssembly 功能基本一致,就是转出来的代码不一样:
asm.js 是文本;
WebAssembly 是二进制字节码,因此运行速度更快、体积更小。

JS 语言基础

方法名 概念描述
console.log([data][, …args])
console.log([info][, …args])
console.warn([data][, …args])
console.error([data][, …args])
console.assert(value[,message][,…args]) 断言,如果参数 expr 为假,则抛出AssertionError
console.dir(obj [, …options]) 检查对象,输出对象所有属性
console.time(label) 开始测量时间
console.timeEnd(label) 结束测量时间,根据相同label的计时器统计所经过的时间,用log输出结果
%s 输出字符串
%d 输出数值类型,整数或浮点数
%i 输出整数
%f 输出浮点数
%j 输出 JSON 格式
%% 输出百分号(‘%’)

二进制数组

二进制数组是 JS 操作二进制数据的接口。基于二进制数组,JS可以直接操作计算机内存,因为该抽象模型和实际的计算机硬件结构非常地相似,理论上可以优化到近似本地程序的性能。

  • ArrayBuffer: 代表内存中一段空间,要操作该内存空间必须通过基于其创建的 TypedArray 或 DataView 进行
  • TypedArray: 9种二进制类型数组的统称,底层是 ArrayBuffer
  • DataView: 用于处理类似C语言中结构类型的数据,其中每个元素的类型可能并不相同
  • 二进制数组用于处理图像或矩阵数据时有着较高的性能
  • 二进制数组是JS 在处理运算密集型应用时经常用到的特性
  • 二进制数组是网络数据交换和跨语言数据交换最有效的手段
  • wasm 模块中的内存也是一种二进制数组

WASM 快速入门

  • 文本格式:.wat
  • 汇编格式:.wasm

wabt 工具集

该工具集提供了 .wat 与 .wasm 相互转换的编译器等功能

关键概念

模块

内存

表格

实例

WASM 程序生命周期

  • 使用 WASM 文本格式或其他语言编写程序,通过各自的工具链编译为 wasm 汇编格式 .wasm 文件
  • 在网页中使用 fetch、XMLHttpRequest 等获取 .wasm 文件
  • 将 .wasm 编译为模块,编译过程中进行合法性检查
  • 实例化。初始化导入对象,创建模块的实例
  • 执行实例的导出函数,完成所需操作

WASM 虚拟机体系结构

  • 一个全局类型数组
  • 一个全局函数数组
  • 一个全局变量数组
  • 一个全局表格对象
  • 一个全局内存对象
  • 一个运行时栈
  • 函数执行时可以访问一个局部变量数组

VSCode 插件

vscode-wasm