11个不稳定版本 (3个破坏性更新)

0.4.2 2024年8月22日
0.4.0 2024年5月11日
0.3.0 2024年3月10日
0.2.0 2023年12月11日
0.1.4 2023年9月30日

#99WebAssembly

Download history 14/week @ 2024-05-02 271/week @ 2024-05-09 39/week @ 2024-05-16 68/week @ 2024-05-23 52/week @ 2024-05-30 67/week @ 2024-06-06 54/week @ 2024-06-13 98/week @ 2024-06-20 47/week @ 2024-06-27 78/week @ 2024-07-04 34/week @ 2024-07-11 90/week @ 2024-07-18 81/week @ 2024-07-25 44/week @ 2024-08-01 37/week @ 2024-08-08 170/week @ 2024-08-15

每月340次下载
9 个Crate中使用 (7 个直接使用)

MIT/Apache

70KB
1K SLoC

wasm_runtime_layer

Crates.io Docs.rs

wasm_runtime_layer 通过对WebAssembly运行时的薄抽象,允许实现后端无关的主机代码。该接口基于 wasmtime::Enginewasmi::Engine 的封装,但也可以为任何运行时实现。

用法

要使用此Crate,首先实例化一个后端运行时。运行时可以是任何实现 backend::WasmEngine 的值。一些运行时已作为附加Crate实现。然后,可以从后端运行时创建一个 Engine,并使用它来初始化模块和实例。

// 1. Instantiate a runtime
let engine = Engine::new(wasmi_runtime_layer::Engine::default());
let mut store = Store::new(&engine, ());

// 2. Create modules and instances, similar to other runtimes
let module_bin = wat::parse_str(
    r#"
(module
(type $t0 (func (param i32) (result i32)))
(func $add_one (export "add_one") (type $t0) (param $p0 i32) (result i32)
    local.get $p0
    i32.const 1
    i32.add))
"#,
)
.unwrap();

let module = Module::new(&engine, std::io::Cursor::new(&module_bin)).unwrap();
let instance = Instance::new(&mut store, &module, &Imports::default()).unwrap();

let add_one = instance
    .get_export(&store, "add_one")
    .unwrap()
    .into_func()
    .unwrap();
        
let mut result = [Value::I32(0)];
add_one
    .call(&mut store, &[Value::I32(42)], &mut result)
    .unwrap();

assert_eq!(result[0], Value::I32(43));

后端

  • wasmi_runtime_layer - 为 wasmtime::Engine 实例的封装实现 WasmEngine 特性。
  • wasmtime_runtime_layer - 为 wasmtime::Engine 实例的封装实现 WasmEngine 特性。
  • js_wasm_runtime_layer - 针对 wasm32-unknown-unknown 目标实现针对浏览器WebAssembly API的wasm引擎。
  • pyodide-webassembly-runtime-layer - 当作为Python扩展模块在Pyodide中运行时,实现针对浏览器WebAssembly API的wasm引擎。

欢迎为其他后端实现做出贡献!

测试

要运行wasmi和wasmtime的测试,运行

cargo test

对于 wasm32 目标,您可以使用较慢的解释器 wasmi,或者使用本机JIT加速的浏览器后端。

要测试后端,您需要安装 wasm-pack

然后您可以运行

wasm-pack test --node

依赖项

~0.6–1MB
~24K SLoC