111 个版本 (65 个稳定)

新版本 24.0.0 2024 年 8 月 20 日
23.0.2 2024 年 8 月 12 日
23.0.1 2024 年 7 月 22 日
22.0.0 2024 年 6 月 20 日
0.0.0 2018 年 10 月 30 日

38WebAssembly

Download history 87749/week @ 2024-05-04 95290/week @ 2024-05-11 85053/week @ 2024-05-18 94244/week @ 2024-05-25 90110/week @ 2024-06-01 78581/week @ 2024-06-08 86588/week @ 2024-06-15 89424/week @ 2024-06-22 80917/week @ 2024-06-29 81351/week @ 2024-07-06 96624/week @ 2024-07-13 96736/week @ 2024-07-20 88924/week @ 2024-07-27 90172/week @ 2024-08-03 105296/week @ 2024-08-10 88204/week @ 2024-08-17

388,302 每月下载量
577 个 Crates 中使用 (178 直接使用)

Apache-2.0 WITH LLVM-exception

3.5MB
55K SLoC

wasmtime

一个独立的 WebAssembly 运行时

Bytecode Alliance 项目

关于

此 crate 是 Wasmtime 项目的 Rust 嵌入式 API:一个用于运行 WebAssembly 程序的跨平台引擎。Wasmtime 的显著特性包括

  • 快速。Wasmtime 基于优化的 Cranelift 代码生成器,可以快速生成高质量的机器代码,无论是在运行时还是在编译时。Wasmtime 的运行时也针对高效实例化、嵌入式程序与 wasm 之间的低开销转换和并发实例的可扩展性进行了优化。

  • 安全. Wasmtime的开发非常注重其实施的正确性,通过Google的OSS Fuzz提供的全天候模糊测试进行验证,利用Rust的API和运行时安全保证,通过RFC流程仔细设计特性和API,当出现问题时实施安全策略,并制定发布策略以修复旧版本。我们遵循深度防御的最佳实践,并为Spectre等问题提供已知保护和缓解措施。最后,我们通过与学术研究人员合作,通过形式验证Wasmtime和Cranelift的关键部分,努力推动技术前沿。

  • 可配置. Wastime支持丰富的API和构建时配置,提供许多选项,例如进一步限制WebAssembly的额外手段,例如CPU和内存消耗等基本保证。Wasmtime还可以在从微型环境到大型服务器上运行,拥有许多并发实例。

  • WASI. Wasmtime支持通过WASI标准与宿主环境交互的丰富API。

  • 标准兼容. Wasmtime通过了官方WebAssembly测试套件,实现了官方wasm C API,并实现了WebAssembly的未来提案。Wasmtime的开发人员在整个过程中也密切参与WebAssembly标准流程。

示例

使用Wasmtime嵌入API运行小型WebAssembly模块的示例可能如下所示

use anyhow::Result;
use wasmtime::*;

fn main() -> Result<()> {
    // Modules can be compiled through either the text or binary format
    let engine = Engine::default();
    let wat = r#"
        (module
            (import "host" "host_func" (func $host_hello (param i32)))

            (func (export "hello")
                i32.const 3
                call $host_hello)
        )
    "#;
    let module = Module::new(&engine, wat)?;

    // Create a `Linker` which will be later used to instantiate this module.
    // Host functionality is defined by name within the `Linker`.
    let mut linker = Linker::new(&engine);
    linker.func_wrap("host", "host_func", |caller: Caller<'_, u32>, param: i32| {
        println!("Got {} from WebAssembly", param);
        println!("my host state is: {}", caller.data());
    })?;

    // All wasm objects operate within the context of a "store". Each
    // `Store` has a type parameter to store host-specific data, which in
    // this case we're using `4` for.
    let mut store = Store::new(&engine, 4);
    let instance = linker.instantiate(&mut store, &module)?;
    let hello = instance.get_typed_func::<(), ()>(&mut store, "hello")?;

    // And finally we can call the wasm!
    hello.call(&mut store, ())?;

    Ok(())
}

更多示例和信息可以在wasmtime crate的在线文档中找到。

文档

📚 在这里阅读Wasmtime指南!📚

wasmtime指南是了解Wasmtime能为您做什么或回答您关于Wasmtime的疑问的最佳起点。如果您想为Wasmtime做出贡献,它也可以帮助您做到这一点

依赖项

~8–23MB
~376K SLoC