Rust & WASM


WASM 只支持数字类型,rust 和 js 其他互操作:
  • Copying in or out binary data to the wasm memory. For example, this is one way to provide an owned String to the Rust side.
  • Setting up an explicit "heap" of JS objects which are then given "addresses". This allows wasm code to refer to JS objects indirectly (using integers), and operate on those objects by invoking imported JS functions. 例子


wasm-bindgen 的 js 实例有个 memory 属性,用来实现 js-rust 共享内存
// import 函数名上的 hash 值是怎么生成的?
// js 通过 WebAssembly.Memory 提供内存,有 shared 选项使用共享内存
// emscripten 提供了 malloc 和 free 的 wasm 编译目标,将堆内存映射到共享线性内存上
// 通过 as_ptr() 获取指针位置传递给 js,让 js 读取到想要的数据


具体到 Rust 而言:

WASI 动态加载模块?

WASM 保证安全,模块称为 nanoprocesses // https://bytecodealliance.org/articles/announcing-the-bytecode-alliance
  • 每个 wasm 模块是 sandbox,没有权限,需要传递系统调用函数
  • 有 memory model,只能访问分配给这个 wasm 模块的内存,共享数据需要复制进行传递 // 有大内存共享方案