Types 在Rust程序和嵌入式WebAssembly运行时之间通信的最佳实践是什么?

Types 在Rust程序和嵌入式WebAssembly运行时之间通信的最佳实践是什么?,types,rust,scripting,communication,webassembly,Types,Rust,Scripting,Communication,Webassembly,我正在开发一个Rust程序,我想在运行时使用WebAssembly作为脚本语言来驱动其行为。我们假设脚本也是用Rust编写的。我已经阅读了Wasmer、Wasmtime和Lucet的教程,虽然导出/导入的函数可以作为参数并返回WASM基元类型,但在Rust二进制文件和其中运行的WASM脚本之间传递任意数据似乎没有简单/轻松的解决方案。尤其是字符串,必须由运行时的线性内存和长度来处理 wasm bindgen似乎可以解决我的问题,但它只针对浏览器中的wasm-JS通信。Wasmer和Wasmtim

我正在开发一个Rust程序,我想在运行时使用WebAssembly作为脚本语言来驱动其行为。我们假设脚本也是用Rust编写的。我已经阅读了Wasmer、Wasmtime和Lucet的教程,虽然导出/导入的函数可以作为参数并返回WASM基元类型,但在Rust二进制文件和其中运行的WASM脚本之间传递任意数据似乎没有简单/轻松的解决方案。尤其是字符串,必须由运行时的线性内存和长度来处理

wasm bindgen
似乎可以解决我的问题,但它只针对浏览器中的wasm-JS通信。Wasmer和Wasmtime有
*-接口类型
板条箱,但它们没有教程,是实验性的,可能会更改。我不需要通过
struct
s,但我希望实现以下目标:

//在主机程序中
let参数:&[u8]=&[0,1…n];//哑字节片
let guest_result:Vec=wasm_runtime.call(“guest_函数,&[argument]);
//在来宾WASM库/脚本中
让数据_来自_主机:Vec=导入的_函数(一些_其他_字节);
只要以两种方式传递和返回
Vec
s或
&[u8]
s就足够了,我可以使用
bincode
或其他方式对它们进行反序列化。有人做到了吗?我可以像字符串一样共享线性内存,但这似乎不安全,特别是在多线程上使用多个脚本时


tl;dr我想使用WASM作为脚本语言,并与之交谈
&[u8]
Vec
,但还没有找到任何简单的方法来实现它。

这个可用性问题是众所周知的,似乎正在积极研究:

以下是该帖子中一些结束语的后续内容:

我几乎没有编写C或处理系统调用接口的经验,因此传递值对我来说也很麻烦。在大多数情况下,我只是花时间构建更高级别的抽象(就像wasm bindgen所做的那样),以便更轻松地传递数据

例如,wasi似乎提供了一个可以实现的接口,它们将所有微妙的部分抽象出来:您可以在这里看到lucet实现它:

我不认为这对你有多大帮助,除非你试图实现wasi,但这是一个很好的例子,可以实现你想要的那种抽象