#wasm-interpreter #interpreter #wasm #wasm-module #web-assembly #api-bindings

bin+lib nanowasm

一个小型独立的 WebAssembly 解释器

2 个版本

使用旧的 Rust 2015

0.0.2 2018年3月6日
0.0.1 2018年1月16日

#152模拟器

Apache-2.0/MIT

10MB
174K SLoC

WebAssembly 71K SLoC // 0.0% comments C++ 68K SLoC // 0.2% comments Python 20K SLoC // 0.3% comments JavaScript 9K SLoC // 0.1% comments Rust 2.5K SLoC // 0.1% comments Visual Studio Project 2K SLoC C 420 SLoC // 0.0% comments Automake 385 SLoC // 0.2% comments M4 255 SLoC // 0.4% comments Shell 248 SLoC // 0.4% comments Visual Studio Solution 154 SLoC VB6 150 SLoC Xcode Config 33 SLoC // 0.7% comments Forge Config 2 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测试套件可以(希望如此)覆盖这些。

类似项目

许可证

Apache/MIT

依赖项

约20MB
约350K SLoC