多个Wasm模块可以相互交互并通过功能直接共享内存吗?

时间:2020-01-14 03:26:19

标签: memory shared-memory dynamic-linking webassembly

是否可以实例化两个Wasm模块ab,以便a可以从b调用函数,还可以从{{1 }}?例如,假设b通过在a中公开的malloc中调用b的实现来获取内存。这样,所有有用的内存都来自a。如果是这样,怎么办? 更具体地说,是否可以在没有额外开销的情况下且无需在这些操作之间与JavaScript进行交互(在初始化模块和设置导入/导出时的初始化步骤除外)来完成此操作?这种间接访问和内存访问的性能特征是什么,或者根本没有问题吗?在这种情况下,我想要进行微优化。

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

1 个答案:

答案 0 :(得分:5)

是否可以实例化两个WASM模块a和b,以便a可以从b调用函数

是的,您可以实例化模块// view engine setup app.set('views', path.join(__dirname, 'views')); app.set('view engine', 'ejs'); 导出其功能之一,然后实例化b导入相同的功能,以便两者可以交互。但是,这不会像通过主机环境进行调用那样快地调用一个WebAssembly函数。

,还可以访问b的不同内存

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

可以做到这一点而无需额外的开销,也可以在这些操作之间不与JavaScript进行交互

如上所述,不行,目前如果没有其他开销,就无法完成。

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

Interface Types是实现此目标的重要垫脚石,它为模块/功能的API规范编码。一旦实现了这一点,WebAssembly模块之间的直接通信就应该成为可能。