- 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-WASM
WebAssembly 也称为 wasm,是对 Javascript 的改进。它被设计为在浏览器内运行,就像 JavaScript 一样,也可以与 NodeJS 一起运行。当编译任何高级语言(如 C、C++、Rust)时,您碰巧会得到 wasm 输出。
考虑以下 C 程序 -
int factorial(int n) { if (n == 0) return 1; else return n * factorial(n-1); }
利用 WasmExplorer(可在https://mbebenita.github.io/WasmExplorer/获取)来获取编译后的代码,如下所示 -
阶乘程序的 WebAssembly 文本格式如下所示 -
(module (table 0 anyfunc) (memory $0 1) (export "memory" (memory $0)) (export "factorial" (func $factorial)) (func $factorial (; 0 ;) (param $0 i32) (result i32) (local $1 i32) (local $2 i32) (block $label$0 (br_if $label$0 (i32.eqz (get_local $0) ) ) (set_local $2 (i32.const 1) ) (loop $label$1 (set_local $2 (i32.mul (get_local $0) (get_local $2) ) ) (set_local $0 (tee_local $1 (i32.add (get_local $0) (i32.const -1) ) ) ) (br_if $label$1 (get_local $1) ) ) (return (get_local $2) ) ) (i32.const 1) ) )
使用 Wat2Wasm 工具,您可以查看 WASM 代码,就像下面提到的那样 -
开发人员不应该在 wasm 中编写代码或学习在其中编写代码,因为它主要是在编译高级语言时生成的。
堆垛机型号
在 WASM 中,所有指令都被压入堆栈。参数被弹出,结果被推回堆栈。
考虑以下添加 2 个数字的 WebAssembly 文本格式 -
(module (func $add (param $a i32) (param $b i32) (result i32) get_local $a get_local $b i32.add ) (export "add" (func $add)) )
函数的名称是$add,它接受 2 个参数 $a 和 $b。结果是一个 32 位整数类型。使用 get_local 访问局部变量,使用 i32.add 执行添加操作。
执行时添加 2 个数字的堆栈表示如下 -
在步骤 1 - get_local $a 指令的执行中,第一个参数即 $a 被压入堆栈。
在步骤 2中- 在执行 get_local $b 指令期间,第二个参数(即 $b)被压入堆栈。
在步骤 3中- i32.add 的执行将从堆栈中弹出元素并将结果推回堆栈。栈中最后保留的值是函数$add 的结果。