3个版本 (稳定版)
2.0.0 | 2021年10月29日 |
---|---|
1.0.2 | 2021年2月6日 |
0.0.0 | 2021年2月6日 |
#437 在 WebAssembly 中排名
每月26次 下载
在 11 个crate中使用了11(9个直接)
1.5MB
34K SLoC
wasmer

Wasmer
是最受欢迎的 Rust (<...>也是最快的) WebAssembly 运行时。它支持JIT(即时)和AOT(提前)编译,以及适用于您需求的插件式编译器。
它旨在安全、安全,并可在任何环境中运行。
使用
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不仅速度快,而且设计得可以高度自定义
- 可插拔引擎:您是否有复杂的
dlopen
实现?这是为您准备的! - 可插拔编译器:您想用DynASM或其他编译器生成代码?我们帮您做到了!
- 无头模式:这意味着不需要编译器即可运行一个
serialized
模块(通过Module::deserialize()
)。 - 交叉编译:您可以将模块预先编译并序列化,然后在其他平台上运行(通过
Module::serialize()
)。
配置标志
Wasmer有以下配置标志
wat
(默认启用):允许以文本格式读取WebAssembly文件。此功能通常仅在开发环境中使用- 编译器(互斥)
singlepass
:它将使用wasmer-compiler-singlepass
作为默认编译器(理想用于区块链)。cranelift
:它将使用wasmer-compiler-cranelift
作为默认编译器(理想用于开发)。llvm
:它将使用wasmer-compiler-llvm
作为默认编译器(理想用于生产)。
Wasmer默认附带cranelift
编译器,因为它非常适合开发目的。然而,我们强烈建议在生产环境中使用llvm
后端,因为它性能大约快50%,达到接近原生速度。
注意:如果您想同时使用多个编译器,这也是可能的!您需要直接通过每个编译器crates导入它们。
由Wasmer团队用❤️制作,为社区服务
依赖关系
~8-20MB
~298K SLoC