2 个版本
使用旧的 Rust 2015
0.0.2 | 2018年3月6日 |
---|---|
0.0.1 | 2018年1月16日 |
#152 在 模拟器 中
10MB
174K SLoC
nanowasm
一个用 Rust 编写的轻量级独立 WebAssembly 解释器。目前尚不可用。
目标
这是一个兴趣爱好项目,并不打算成为一个专业级的工具。但如果能到达那个阶段,那也很好!我认为一个小型轻量级的解释器对于嵌入式、在生成的 wasm 代码上运行单元测试、作为扩展系统等事情非常有用。
路线图大致如下
- 正确实现 wasm32 1.0 核心功能,通过标准测试和模糊测试
- 使其作为独立解释器运行或嵌入到其他程序中变得简单
- 使其通过用 Rust 编写的自定义模块轻松扩展
- 使其能够运行为 wasm32-unknown-unknown 目标构建的 Rust 代码,并提供基本的控制台 API
- 使其能够设置内存和 CPU 消耗的硬执行限制(某种方式),并轻松沙盒化以禁止访问随机资源(如文件)
- 使其速度合理
- 拥有优秀的调试工具?
- JIT?使用 LLVM、cretonne 或自己编写;我想自己编写以获得经验。
- 从用 Rust 或 C 编写的 DLL 中加载自定义模块???
非目标
- 不打算在大端平台上正确运行,因为对于 wasm(在内存中)来说字节布局很重要,而 wasm 指定的是小端。由于我想将其做成 JIT,因此它将依赖于特定的平台。
- 不打算完全不使用
unsafe
;如果我们能够通过 unsafe 代码获得显著的性能提升,我们应该这么做。经过适当验证的 WebAssembly 代码本身应该是安全的。当然,不使用 unsafe 会更好。
构建程序
有用的是获取和构建 wabt,它包含汇编器等有用的底层工具。
sudo apt install clang cmake
git clone --recursive https://github.com/icefoxen/nanowasm
# Or if you've already checked out nanowasm, cd into it and run:
# git submodule update --init --recursive
cd nanowasm/spec/wabt
make -j$(nproc)
汇编器是 wat2wasm
,所以使用它。
cd test_programs
wat2wasm inc.wast
这将创建一个 inc.wasm
程序,这是您可以实际加载和运行的程序
cargo run -- test_programs/inc.wasm
安全性
目标应该是,如果wasm模块无效,则在尝试加载或验证它或从它构建程序时返回一个Result::Err
。然后实际执行代码时不需要返回一个Result
,因为代码已经经过验证是正确的;不正确的地方是解释器或验证器的bug,应该导致panic(我们应该在这里使用assert!
还是debug_assert!
?这取决于具体情况;assert!
有时会导致编译器生成更聪明的代码,例如在执行一次后省略边界检查)。
这种验证在设置资源限制并且程序超过这些限制的情况下是不可能的。需要考虑这个问题。可能还有其他地方;希望wasm测试套件可以(希望如此)覆盖这些。
类似项目
- parity-wasm:一个用于序列化和反序列化wasm代码的crate。
- wasmi:一个WebAssembly解释器;曾经是parity-wasm的一部分,但现在分离出来成为一个独立的项目。相当不错,但我想自己写一个。
- https://github.com/sunfishcode/wasmstandalone:一个使用cretonne的wasm独立JIT。
- WebAssembly参考解释器
- WebAssembly二进制工具集
许可证
Apache/MIT
依赖项
约20MB
约350K SLoC