名称: webassembly-运行时
描述: ‘实现WebAssembly运行时和执行引擎。使用场景:(1) 构建WASM运行时,(2) 实现语言编译器到WASM,(3) 创建WASM工具。’
版本: 1.0.0
标签:
- 运行时
- webassembly
- wasm
- 执行
难度: 中级
语言:
- rust
- c++
依赖:
- webassembly-验证器
WebAssembly 运行时
实现WebAssembly (WASM) 执行引擎和运行时系统。
使用场景
- 为新语言构建WASM运行时
- 实现以WASM为目标的编译器
- 创建WASM工具(调试器、性能分析器)
- 构建服务器less/边缘计算平台
- 实现WASM沙箱环境
此技能的功能
- 解析WASM二进制格式 - 解码模块结构
- 实现指令集 - 执行WASM操作
- 管理内存 - 线性内存和表
- 处理调用 - 函数调用、间接调用、主机调用
关键概念
| 概念 |
描述 |
| 线性内存 |
连续字节数组,按页粒度管理 |
| 函数索引 |
直接和间接调用 |
| 表 |
用于间接调用的函数指针 |
| 模块实例 |
运行时表示 |
| 栈机器 |
WASM使用操作数栈 |
WASM 规范要点
| 特性 |
细节 |
| 类型 |
i32, i64, f32, f64, v128 |
| 内存 |
最多2^16页(最大4GB) |
| 函数 |
类型化,可能陷入陷阱 |
| 控制 |
结构化(块、循环、条件) |
| 调用 |
直接、间接、主机 |
| 陷阱 |
不可恢复的错误 |
提示
- 对模块使用惰性实例化
- 高效实现边界检查
- 考虑JIT编译以提升性能
- 处理WebAssembly系统接口(WASI)进行系统调用
- 支持二进制和文本格式
相关技能
jit-编译器构建者 - JIT编译技术
解析器生成器 - 解析WASM二进制/文本
垃圾收集器实现者 - 内存管理
webassembly-运行时 - 安全执行环境
规范参考
| 参考 |
重要性 |
| WebAssembly 规范(2024) |
WASM核心官方规范 |
| Haas等人,“将Web提升到WebAssembly的速度”(PLDI 2017) |
WASM设计原理 |
| WASI 规范 |
WASM系统接口 |
| Wasmtime 实现 |
生产级WASM运行时 |
权衡与限制
实现方法
| 方法 |
优点 |
缺点 |
| 解释器 |
简单、可移植 |
慢 |
| JIT |
快速 |
复杂 |
| AOT |
最快 |
可移植性有限 |
限制
- 核心规范中无垃圾回收(GC提案中即将引入)
- 核心规范中无线程(线程提案可用)
- 系统调用访问有限(WASI辅助)
- 沙箱化需要精心设计
研究工具与产物
WASM运行时:
| 工具 |
学习要点 |
| Wasmtime |
快速运行时 |
| WAVM |
基于LLVM |
| Wasmer |
多后端 |
研究前沿
1. GC提案
实现陷阱
| 陷阱 |
实际后果 |
解决方案 |
| 边界检查 |
安全 |
高效检查 |