3个版本 (稳定版)

2.0.0 2021年10月29日
1.0.2 2021年2月6日
0.0.0 2021年2月6日

#437WebAssembly 中排名

每月26次 下载
11 个crate中使用了11(9个直接)

MIT 许可证

1.5MB
34K SLoC

wasmer 构建状态 加入Wasmer Slack MIT License crates.io

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