2 个版本
4.3.1-linera.2 | 2024年6月7日 |
---|
在 WebAssembly 中排名第 52
每月下载量 344 次
1MB
25K 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 程序编译成 WebAssembly。在这种情况下,生成的 WebAssembly 模块将期望在 JavaScript 环境中运行,例如浏览器、Node.js、Deno 等。在这个特定场景中,没有可用的引擎或编译器,将使用 JavaScript 环境中可用的引擎。
Wasmer 默认使用 Cranelift 编译器,非常适合开发目的。然而,我们强烈建议在生产中使用 LLVM 编译器,因为它大约快 50%,达到接近原生速度。
注意:如果需要同时使用多个编译器,这也是可能的!需要直接通过每个编译器包导入它们。
阅读 文档了解更多信息。
由 Wasmer 团队用爱❤️制作,为社区服务
依赖项
~2–14MB
~196K SLoC