13 个版本 (7 个重大更新)
0.7.0 | 2024 年 5 月 15 日 |
---|---|
0.6.0 | 2024 年 3 月 27 日 |
0.1.0 | 2023 年 12 月 27 日 |
在 WebAssembly 中排名 #109
用于 2 crates
210KB
4K SLoC
为什么选择 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
启用使用std
和std::io
从文件和流中解析。这是默认启用的。logging
启用使用log
crate 进行日志记录。这是默认启用的。parser
启用tinywasm-parser
crate。这是默认启用的。archive
启用对存档的预解析。这是默认启用的。
在禁用所有这些功能的情况下,TinyWasm 只依赖于 core
、alloc
和 libm
,并可以在 no_std
环境中使用。由于 libm
的性能不如编译器的数学内建函数,如果可能的话,建议使用 std
功能(至少目前),尤其是在 wasm32 目标上。
灵感
非常感谢以下项目的作者,他们的作品启发了 TinyWasm
- wasmi - 一个高效且轻量级的 WebAssembly 解释器,也可以在
no_std
环境中运行 - wasm3 - 一个用 C 编写的性能高效的 WebAssembly 解释器
- wazero - 一个无依赖的用 go 编写的 WebAssembly 解释器
- wain - 一个无依赖的用 Rust 编写的 WebAssembly 解释器
如果您正在寻找一个更成熟和功能更完整的 WebAssembly 解释器,我鼓励您查看这些项目。
许可证
根据您的选择,许可在 Apache 许可证,版本 2.0 或 MIT 许可证 下。
除非您明确说明,否则您提交给 TinyWasm 的任何有意包含的贡献,根据 Apache-2.0 许可证的定义,应按上述方式双重许可,不附加任何额外的条款或条件。
注意:GitHub 仓库包含一个子模块(crates/tinywasm-parser/data
),该子模块仅在 Apache 许可证,版本 2.0 下进行许可。这些数据是从 WebAssembly 规范 生成的,仅供测试目的使用,不包括在最终的二进制文件中。
依赖关系
~0.4–1.3MB
~27K SLoC