13 个版本 (7 个重大更新)

0.7.0 2024 年 5 月 15 日
0.6.0 2024 年 3 月 27 日
0.1.0 2023 年 12 月 27 日

WebAssembly 中排名 #109


用于 2 crates

MIT/Apache 许可证

210KB
4K SLoC

TinyWasm

用安全的 Rust 编写的微小的 WebAssembly 运行时

docs.rs Crates.io Crates.io

为什么选择 TinyWasm?

  • 微小:TinyWasm 设计得尽可能小,同时不显著牺牲性能或功能(< 4000 LLOC)。
  • 可移植性:TinyWasm 可在任何 Rust 可针对的平台运行,包括 no_std,且外部依赖最小。
  • 安全性:运行时中没有使用不安全代码(使用 rkyv 进行序列化时使用不安全代码,但这不是必需的)。

状态

截至版本 0.3.0,TinyWasm 成功通过了 WebAssembly 测试套件 中所有 WebAssembly 1.0 测试。2.0 测试工作正在进行中。这使得 TinyWasm 能够运行大多数 WebAssembly 程序,包括执行编译为 WebAssembly 的 TinyWasm 自身(请参阅 examples/wasm-rust.rs)。测试套件的结果可在 此处 查找。

API 仍然不稳定,可能会随时更改,因此您可能还不希望在生产环境中使用它。TinyWasm 主要不是为了高性能而设计的;它更注重简单性、大小和可移植性。有关其性能的更多详细信息,请参阅 BENCHMARKS.md

未来开发:第一个主要版本将专注于改进 API 并添加对 WASI 的支持。在此过程中,我还希望进一步简化代码库的大小并提高解析器的性能。

支持的提案

提案 实现状态 版本
可变全局变量 完全实现 0.2.0
多值 完全实现 0.2.0
符号扩展运算符 完全实现 0.2.0
批量内存操作 完全实现 0.4.0
引用类型 部分实现 不适用
多内存 部分实现 不适用
Memory64 部分实现 不适用

用法

TinyWasm 可以通过 tinywasm-cli 命令行工具或作为 Rust 项目的库来使用。文档可以在这里找到。

$ cargo add tinywasm

CLI

CLI 主要用于测试目的,但也可用于运行 WebAssembly 程序。

$ cargo install tinywasm-cli
$ tinywasm-cli --help

功能标志

  • std
    启用使用 stdstd::io 从文件和流中解析。这是默认启用的。
  • logging
    启用使用 log crate 进行日志记录。这是默认启用的。
  • parser
    启用 tinywasm-parser crate。这是默认启用的。
  • archive
    启用对存档的预解析。这是默认启用的。

在禁用所有这些功能的情况下,TinyWasm 只依赖于 corealloclibm,并可以在 no_std 环境中使用。由于 libm 的性能不如编译器的数学内建函数,如果可能的话,建议使用 std 功能(至少目前),尤其是在 wasm32 目标上。

灵感

非常感谢以下项目的作者,他们的作品启发了 TinyWasm

  • wasmi - 一个高效且轻量级的 WebAssembly 解释器,也可以在 no_std 环境中运行
  • wasm3 - 一个用 C 编写的性能高效的 WebAssembly 解释器
  • wazero - 一个无依赖的用 go 编写的 WebAssembly 解释器
  • wain - 一个无依赖的用 Rust 编写的 WebAssembly 解释器

如果您正在寻找一个更成熟和功能更完整的 WebAssembly 解释器,我鼓励您查看这些项目。

许可证

根据您的选择,许可在 Apache 许可证,版本 2.0MIT 许可证 下。

除非您明确说明,否则您提交给 TinyWasm 的任何有意包含的贡献,根据 Apache-2.0 许可证的定义,应按上述方式双重许可,不附加任何额外的条款或条件。

注意:GitHub 仓库包含一个子模块(crates/tinywasm-parser/data),该子模块仅在 Apache 许可证,版本 2.0 下进行许可。这些数据是从 WebAssembly 规范 生成的,仅供测试目的使用,不包括在最终的二进制文件中。

依赖关系

~0.4–1.3MB
~27K SLoC