WASI + wasmtime 运行时——为什么 AstroBox 选择 WebAssembly
什么是 WASI
WASI(WebAssembly System Interface)是一套为 WebAssembly 设计的标准化系统接口。你可以把它理解成 WebAssembly 的「POSIX」——它定义了 WebAssembly 模块如何和操作系统交互。
WASI 的版本演进:
| 版本 | 特点 |
|---|---|
| WASI Preview 1 | 早期稳定版,支持基本的文件、网络、时钟 |
| WASI Preview 2 | 组件化架构,更细粒度的接口 |
| WASI Preview 3 | 当前最新,支持 HTTP、异步、组件模型 |
AstroBox Level 4 用的是 WASI Preview 3。
什么是 wasmtime
wasmtime 是 Bytecode Alliance 开发的 WebAssembly 运行时——它负责真正执行 .wasm 模块。
相比浏览器里的 WebAssembly,wasmtime:
- 更快的启动速度(不需要浏览器环境)
- 可以独立运行
- 有完善的沙箱机制
- 暴露 WASI 接口
AstroBox 里的两层运行时
AstroBox 插件系统有两层运行时共存:
旧版运行时(Level 1/2/3)
- 旧版 wasmtime
- 旧版 WASI 接口
- 继续运行不被移除
- 为旧插件提供向后兼容
新版运行时(Level 4)
- 新版 wasmtime
- WASI Preview 3
- 新增 HTTP 服务器 + 应用内浏览器能力
- 宿主接口全部改成
async func
两套运行时独立,互不干扰。旧插件不受影响,新插件可以享受新特性。
为什么选 WebAssembly
AstroBox 团队没有选择传统的原生插件(动态库 DLL / .so)或脚本语言(Lua / Python 嵌入式),而是选择了 WebAssembly。原因:
跨平台
一份 .wasm 插件可以同时在 Windows、macOS(ARM 和 x86)、Linux、Android、iOS 上运行——不需要为每个平台分别编译。这对 AstroBox 的多平台产品定位至关重要。
安全沙箱
WebAssembly 默认无法访问文件系统、网络、系统 API——必须由宿主(AstroBox)通过 WASI 显式授权。恶意插件在沙箱里最多搞坏自己,无法逃逸到操作系统层面。
多语言支持
任何能编译成 WebAssembly 的语言都能写 AstroBox 插件:
- Rust → wasm(一级公民,性能最好)
- Python → wasm(Level 4 官方支持)
- JavaScript → wasm(Level 4 官方支持)
- C / C++ / Go / Swift / Kotlin 等 → wasm(间接支持)
性能
WebAssembly 性能接近原生,远好于嵌入脚本语言的解释执行。wasmtime 作为 AOT 编译运行时,启动速度快、执行效率高。
对用户意味着什么
你可能不会直接和 WASI / wasmtime 打交道,但这个技术选型影响到你:
- 插件数量——多语言支持意味着更多开发者可以写插件
- 插件安全性——沙箱隔离降低了装恶意插件的风险
- 跨平台插件——同一个插件在 Windows 和 Android 上都能跑
- 性能——插件运行流畅,不会卡主 AstroBox 主界面
对开发者意味着什么
如果你想写 AstroBox 插件:
- 选一门能编译成 WebAssembly 的语言(推荐 Rust,Level 4 可以选 Python / JS)
- 学习 AstroBox 的 Host API(abox.run 上有完整文档)
- 用 wasmtime 测试
- 打包成 .abp 文件发布
入门路径在插件开发文档站和本 Wiki 的 开发者入门 页面。