- WebAssembly 教程
- WebAssembly - 主页
- WebAssembly - 概述
- WebAssembly - 简介
- WebAssembly-WASM
- WebAssembly - 安装
- WebAssembly - 编译为 WASM 的工具
- WebAssembly - 程序结构
- WebAssembly - JavaScript
- WebAssembly - Javascript API
- WebAssembly - 在 Firefox 中调试 WASM
- WebAssembly - “你好世界”
- WebAssembly - 模块
- WebAssembly - 验证
- WebAssembly - 文本格式
- WebAssembly - 将 WAT 转换为 WASM
- WebAssembly - 动态链接
- WebAssembly - 安全
- WebAssembly - 使用 C
- WebAssembly - 使用 C++
- WebAssembly - 使用 Rust
- WebAssembly - 使用 Go
- WebAssembly - 使用 Nodejs
- WebAssembly - 示例
- WebAssembly 有用资源
- WebAssembly - 快速指南
- WebAssembly - 有用的资源
- WebAssembly - 讨论
WebAssembly - 程序结构
WebAssembly,也称为 WASM,是二进制格式的低级代码,旨在以最有效的方式在浏览器内执行。WebAssembly 代码的结构如下:
- 价值观
- 类型
- 指示
现在让我们详细了解它们。
价值观
WebAssembly 中的值旨在存储复杂的数据,例如文本、字符串和向量。WebAssembly 支持以下内容 -
- 字节
- 整数
- 浮点
- 名称
字节
字节是 WebAssembly 支持的最简单的值形式。该值采用十六进制格式。
例如表示为b 的字节也可以采用自然数 n,其中 n <256。
byte ::= 0x00| .... |0xFF
整数
在 WebAssembly 中,支持的整数如下所示 -
- i32:32 位整数
- i64:64 位整数
浮点
在 WebAssembly 中支持的浮点数如下 -
- f32:32位浮点
- f64:64 位浮点
名称
名称是字符序列,具有由 Unicode 定义的标量值,可以从此处给出的链接http://www.unicode.org/versions/Unicode12.1.0/获得。
类型
WebAssembly 中的实体被分类为类型。支持的类型如下所示 -
- 值类型
- 结果类型
- 功能类型
- 限制
- 内存类型
- 表格类型
- 全局类型
- 外部类型
让我们一一研究一下。
值类型
WebAssembly 支持的值类型如下:
- i32:32 位整数
- i64:64 位整数
- f32:32位浮点
- f64:64 位浮点
valtype ::= i32|i64|f32|f64
结果类型
括号内写入的值将被执行并存储在结果类型内。结果类型是执行由值组成的代码块的输出。
resulttype::=[valtype?]
功能类型
函数类型将接受参数向量返回结果向量。
functype::=[vec(valtype)]--> [vec(valtype)]
限制
限制是与内存和表类型相关的存储范围。
limits ::= {min u32, max u32}
内存类型
存储器类型涉及线性存储器和大小范围。
memtype ::= limits
表格类型
表类型按分配给它的元素类型进行分类。
tabletype ::= limits elemtype elemtype ::= funcref
表类型取决于分配给它的最小和最大大小的限制。
全局类型
全局类型保存具有值的全局变量,可以更改或保持不变。
globaltype ::= mut valtype mut ::= const|var
外部类型
外部类型处理导入和外部值。
externtype ::= func functype | table tabletype | mem memtype | global globaltype
指示
WebAssembly 代码是遵循堆栈机器模型的指令序列。由于 WebAssembly 遵循堆栈机器模型,因此指令被推送到堆栈上。
例如,函数的参数值从堆栈中弹出,并将结果推回到堆栈上。最终,栈中只有一个值,那就是结果。
一些常用的指令如下 -
- 数字指令
- 变量指令
数字指令
数字指令是对数值执行的运算。
例如nn, mm ::= 32|64 ibinop ::= add|sub|mul|div_sx|rem_sx|and|or|xor irelop ::= eq | ne | lt_sx | gt_sx | le_sx | ge_sx frelop ::= eq | ne | lt | gt | le | ge
变量指令
变量指令是关于访问局部变量和全局变量的。
例如
访问局部变量 -
get_local $a get_local $b
设置局部变量-
set_local $a set_local $b
访问全局变量-
get_global $a get_global $b
设置全局变量-
set_global $a set_global $b