多个Wasm模块能够通过函数直接相互交互并共享内存吗?

15
是否有一种方法可以实例化两个Wasm模块ab,以使a能够调用b中的函数并访问b的独立内存?例如,假设a通过调用在b中公开给amalloc实现来获取内存。这样,所有有用的内存都来自于b。如果可以,请问如何实现?
更具体地说,是否可以在这些操作之间没有额外的开销,并且不与JavaScript进行交互(除了在实例化模块和设置导入/导出时的初始化步骤)?这种间接和内存访问的性能特征如何?还是根本没有问题?在这种情况下,我想进行微观优化。
(我已经阅读了几篇文档,但找不到明确的答案。我认为在未来的Wasm版本中,有计划对动态链接进行标准化处理,但我们还没有达到那个阶段。)
1个回答

13
有没有一种方法可以实例化两个WASM模块a和b,使得a可以调用b的函数?
是的,您可以实例化导出其函数之一的模块b,然后实例化导入该函数的a,以便两者可以交互。但是,这不会像一个WebAssembly函数调用另一个函数那样快,因为调用是通过主机环境进行的。
并且还可以从b访问不同的内存吗?
是的,同样,这是可能的。线性内存可以在WebAssembly模块及其主机之间共享,也可以在两个模块之间共享。
这是否可以在这些操作之间无需额外的开销,并且无需与JavaScript进行交互?
如上所述,目前不能做到无额外开销。
随着WebAssembly规范的完善和发展,这将会改变。直接在两个WebAssembly模块之间有用地通信的一个挑战是理解每个模块公开的API。WebAssembly是一个编译目标,不同的源语言(C ++,Rust)以不同的方式编码类型-这显着限制了模块间通信。重要的一步是使用“接口类型(Interface Types)”,它可以编码模块/函数的API规范。一旦实现了这个功能,WebAssembly 模块之间直接通信就成为可能。 参考链接

1
告诉我如果我错了,但是根据MVP,每个模块只有一个线性内存。那么如何在没有危险地在同一内存中运行两个运行时的情况下,让两个模块共享同一内存呢? - Bumsik Kim
1
是的,你说得对 - 这显著限制了可以共享内存的应用程序类型。如果您将线性内存用于运行时状态,那么这将是有问题的。下面是一个非常简单的示例,展示了这种方法的工作原理 https://blog.scottlogic.com/2019/07/15/multithreaded-webassembly.html - ColinE
1
目前,WASM模块只能使用一个内存对象,但这将在未来发生改变。 - Lee
太糟糕了。看起来我需要等上不知道多久,直到动态链接被实现:https://github.com/WebAssembly/tool-conventions/blob/master/DynamicLinking.md - synchronizer
1
等等,为什么要跳到JavaScript?模块不能在初始化时相互导入/导出吗?或者这些导入/导出仍然会进行隐式跳转吗? - synchronizer
1
也许有一种方法可以在加载到运行时/浏览器之前将两个wasm模块绑定成一个复合的wasm模块? - Erik Kaplun

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接