1 个不稳定版本
0.18.0 | 2024 年 4 月 27 日 |
---|
#379 in WebAssembly
160 每月下载量
用于 unc-vm-runner
1MB
19K SLoC
Wasmer 运行时
Wasmer 是一个独立的 JIT WebAssembly 运行时,旨在与 Emscripten、Rust 和 Go 完全兼容。 了解更多。
此 crate 表示高级运行时 API,使将 WebAssembly 嵌入您的应用程序变得简单、高效和安全。
如何使用 Wasmer 运行时
最简单的方法是使用 instantiate
函数创建一个 Instance
。然后您可以使用 call
或 func
,然后 call
调用一个导出函数以安全地调用。
示例
给定此 WebAssembly
(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))
编译成 Wasm 字节码,我们可以调用导出的 add_one
函数
static WASM: &'static [u8] = &[
// The module above compiled to bytecode goes here.
0x00, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00, 0x01, 0x06, 0x01, 0x60,
0x01, 0x7f, 0x01, 0x7f, 0x03, 0x02, 0x01, 0x00, 0x07, 0x0b, 0x01, 0x07,
0x61, 0x64, 0x64, 0x5f, 0x6f, 0x6e, 0x65, 0x00, 0x00, 0x0a, 0x09, 0x01,
0x07, 0x00, 0x20, 0x00, 0x41, 0x01, 0x6a, 0x0b, 0x00, 0x1a, 0x04, 0x6e,
0x61, 0x6d, 0x65, 0x01, 0x0a, 0x01, 0x00, 0x07, 0x61, 0x64, 0x64, 0x5f,
0x6f, 0x6e, 0x65, 0x02, 0x07, 0x01, 0x00, 0x01, 0x00, 0x02, 0x70, 0x30,
];
use wasmer_runtime::{
instantiate,
DynFunc,
Value,
imports,
error,
};
fn main() -> error::Result<()> {
// We're not importing anything, so make an empty import object.
let import_object = imports! {};
let instance = instantiate(WASM, &import_object)?;
let values = instance
.exports
.get::<DynFunc>("add_one")?
.call(&[Value::I32(42)])?;
assert_eq!(values[0], Value::I32(43));
Ok(())
}
附加说明
wasmer-runtime
crate 是构建以支持多个编译器后端。我们在 Cranelift 后端中支持 wasmer-clif-backend
crate、在 wasmer-llvm-backend
crate 中的 LLVM 后端,以及在 wasmer-singlepass-backend
crate 中的 Singlepass 后端。目前,Cranelift 后端是默认的。
您可以使用 compile_with
函数指定要使用的编译器。
依赖项
~7–15MB
~217K SLoC