【问题标题】:What can WebAssembly return?WebAssembly 可以返回什么?
【发布时间】:2020-12-23 18:16:43
【问题描述】:
据我了解,WebAssembly 实例可以通过三种方式将值返回给外部调用者:
-
作为方法调用的结果直接返回一个值(这只是基本数据类型 {i32, i64, f32, f64} 的单个值吗?)
-
调用带参数的导入函数,该函数可以在调用时存储参数或访问内存并将内容保存在其他地方
-
写入内存并在执行后让外部环境访问它
还有更多吗?详情是什么?
【问题讨论】:
标签:
io
return
return-value
webassembly
return-type
【解决方案1】:
您的评估大致正确。函数可以直接返回 WebAssembly 值(i32、i64、f32、f64),也可以通过修改全局环境中的元素(如 Memory、Table 和 Globals)间接返回数据。如果您正在谈论将数据返回给 WebAssembly 模块之外的调用者,那么任何此类元素本身都需要从他的模块中导出。即你不能使用 WebAssembly 内存来间接返回数据,除非他的内存本身也是导出的。
使用多值提案,您还可以直接返回多个值:https://github.com/WebAssembly/multi-value。同样,GC 提案将允许您直接返回复杂结构。但是今天这两个都不可用。
【解决方案2】:
您的列表几乎完成了——我能想到的唯一其他机制是全局变量。这些也可以导出以允许宿主环境访问,因此可以想象用作返回结果的机制。
是的,您的说法是正确的,您只能从导出的函数中返回单个数值