69 个版本 (37 个稳定)
新 4.3.6 | 2024 年 8 月 22 日 |
---|---|
4.3.5 | 2024 年 7 月 16 日 |
4.3.2 | 2024 年 6 月 11 日 |
4.2.6 | 2024 年 3 月 4 日 |
0.1.0 | 2018 年 10 月 24 日 |
#14 in WebAssembly
每月 116,486 次下载
用于 266 个 crates (115 个直接)
1.5MB
29K SLoC
wasmer
Wasmer
是最受欢迎的 Rust WebAssembly 运行时。它支持 JIT (即时) 和 AOT (即时编译) 以及适合您需求的可插拔编译器。
它旨在安全、安全,并且在任何环境中均可运行。
用法
以下是一个使用 Wasmer 运行以 WAT 格式(文本格式)编写的 WebAssembly 模块的小例子
use wasmer::{Store, Module, Instance, Value, imports};
fn main() -> anyhow::Result<()> {
let module_wat = r#"
(module
(type $t0 (func (param i32) (result i32)))
(func $add_one (export "add_one") (type $t0) (param $p0 i32) (result i32)
get_local $p0
i32.const 1
i32.add))
"#;
let mut store = Store::default();
let module = Module::new(&store, &module_wat)?;
// The module doesn't import anything, so we create an empty import object.
let import_object = imports! {};
let instance = Instance::new(&mut store, &module, &import_object)?;
let add_one = instance.exports.get_function("add_one")?;
let result = add_one.call(&mut store, &[Value::I32(42)])?;
assert_eq!(result[0], Value::I32(43));
Ok(())
}
特性
Wasmer 不仅速度快,而且还被设计为 高度可定制
-
可插拔编译器 — 引擎使用编译器将 WebAssembly 转换为可执行代码
wasmer-compiler-singlepass
提供快速的编译时间但未优化的运行时速度,wasmer-compiler-cranelift
提供编译时间和运行时性能之间的平衡,适用于开发,wasmer-compiler-llvm
提供深度优化的可执行代码和最快的运行时速度,适合生产。
-
无头模式 —— 一旦WebAssembly模块被编译,就可以将其序列化到文件中,例如,然后开启无头模式使用Wasmer执行。无头Wasmer没有编译器,这使得它更易于移植且加载速度更快。它非常适合受限的环境。
-
交叉编译 —— 大多数编译器都支持交叉编译。这意味着可以预先编译一个目标不同架构或平台的WebAssembly模块,然后将其序列化,以便稍后在目标架构和平台上运行。
-
在JavaScript环境中运行Wasmer —— 使用
js
Cargo特性,可以将Rust程序使用Wasmer编译成WebAssembly。在这种情况下,生成的WebAssembly模块将期望在JavaScript环境中运行,如浏览器、Node.js、Deno等。在这种特定场景下,没有可用的引擎或编译器,将使用JavaScript环境中的可用引擎。
Wasmer默认附带Cranelift编译器,因为它非常适合开发目的。然而,我们强烈建议在生产环境中使用LLVM编译器,因为它大约快50%,达到接近原生速度。
注意:如果想要同时使用多个编译器,这也是可能的!需要直接通过每个编译器crates导入它们。
阅读文档以了解更多信息。
由Wasmer团队用❤️为社区制作
依赖项
~2–15MB
~211K SLoC