是否可以实例化两个Wasm模块a
和b
,以便a
可以从b
调用函数,还可以从{{1 }}?例如,假设b
通过在a
中公开的malloc
中调用b
的实现来获取内存。这样,所有有用的内存都来自a
。如果是这样,怎么办?
更具体地说,是否可以在没有额外开销的情况下且无需在这些操作之间与JavaScript进行交互(在初始化模块和设置导入/导出时的初始化步骤除外)来完成此操作?这种间接访问和内存访问的性能特征是什么,或者根本没有问题吗?在这种情况下,我想要进行微优化。
(我已经阅读了几篇文档,但是找不到清晰的答案。我认为在Wasm的未来版本中,有计划进行标准化的动态链接会有所帮助,但我们还没有找到)
答案 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模块之间的直接通信就应该成为可能。