多个 Wasm 模块是否可以相互交互并直接通过函数共享内存?

syn*_*zer 6 memory dynamic-linking shared-memory webassembly

有没有一种方法来实例2个WASM模块,a并且b这样a甚至可以从功能b,也从访问不同的记忆b?例如,让我们说,a通过调用的实现变得内存mallocb暴露于a。这样,所有有用的内存都来自b. 如果是这样,怎么做?更具体地说,这是否可以在没有额外开销的情况下完成,并且不需要在这些操作之间与 JavaScript 交互(实例化模块和设置导入/导出时的初始化步骤除外)?这种间接和内存访问的性能特征是什么,或者根本没有问题?在这种情况下,我进行微优化。

(我已经阅读了几篇文档,但我找不到明确的答案。我认为在 Wasm 的未来版本中,有标准化动态链接的计划会有所帮助,但我们还没有。)

Col*_*inE 7

有没有办法实例化两个 WASM 模块 a 和 b,以便 a 可以从 b 调用函数

是的,您可以实例化模块b导出其功能之一,然后实例化a导入相同的功能,以便两者可以交互。然而,这不会像一个 WebAssembly 函数调用另一个函数那样快,因为调用是通过主机环境进行的。

并从 b 访问不同的内存

是的,再一次,这是可能的。线性内存可以在 WebAssemnbly 模块与其宿主之间共享,也可以在两个模块之间共享。

这是否可以在没有额外开销的情况下完成,并且在这些操作之间不需要与 JavaScript 交互

如上所述,不,目前无法在没有额外开销的情况下完成。

随着 WebAssembly 规范的增强和成熟,这将在未来发生变化。在两个 WebAssembly 模块之间直接进行有效通信所涉及的一项挑战是理解每个模块公开的 API。WebAssembly 是一个编译目标,不同的源语言(C++、Rust)以不同的方式对类型进行编码——这极大地限制了模块间的通信。

实现这一目标的一个重要垫脚石是Interface Types,它对模块/函数的 API 规范进行编码。一旦实现了这一点,WebAssembly 模块之间的直接通信应该是完全可能的。