15 个稳定版本
2.4.1 | 2023年6月14日 |
---|---|
2.4.0 | 2022年5月30日 |
2.3.0 | 2022年4月21日 |
2.2.0 | 2022年1月25日 |
1.0.1 | 2021年2月5日 |
1070 在 魔法豆
26 每月下载次数
在 7 个crate中使用(6 个直接)
745KB
14K 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 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(&module, &import_object)?;
let add_one = instance.exports.get_function("add_one")?;
let result = add_one.call(&[Value::I32(42)])?;
assert_eq!(result[0], Value::I32(43));
Ok(())
}
功能
Wasmer 不仅速度快,而且设计得可以高度自定义
-
可插拔引擎 — 引擎负责驱动编译过程并将生成的可执行代码存储在某个地方,无论是
- 内存中(使用
wasmer-engine-universal
), - 在本地共享对象文件中(使用
wasmer-engine-dylib
、.dylib
、.so
、.dll
),然后使用dlopen
加载。 - 在本地静态对象文件中(包含
wasmer-engine-staticlib
),除了生成一个C头文件外,还可以与沙箱化的WebAssembly运行时环境链接,用于编译模块,无需运行时编译。
- 内存中(使用
-
可插拔编译器 —— 编译器用于将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团队用❤️为社区制作
依赖项
~1–12MB
~135K SLoC