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 每月下载次数
7crate中使用(6 个直接)

MIT 许可证

745KB
14K SLoC

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

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转换为可执行代码

  • 无头模式 —— 一旦编译了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