WebAssembly是一种二进制语言,旨在除其他目标外,突破编程语言之间的障碍。
目前,compile C++ code to WebAsm很容易将其包含在JavaScript代码中。甚至还有a proposal和Webpack polyfill使其变得像import { foo } from 'bar.wasm'
一样容易。
此外,WebAssembly支持wasm文件,这些文件以导入声明的形式列出了它们自己的依赖项。
是否存在一些polyfill构建工具,允许用户在将其编译为wasm的过程中将webasm模块包含到C ++编译单元中?例如,假设我有一个想要在C ++模块中使用的Rust模块,这两个模块我都将编译为wasm。有没有办法编写与此等效的代码:
#include "node_modules/some_rust_utility/index.wasm"
int someCppFunction(const std::string& data) {
return some_rust_utility::foobar(data.c_str());
}
是否根据foobar
中是否用匹配类型定义了some_rust_utility
来编译它?
注意:我希望随着WebAssembly支持的发展,这个问题的答案可能会随着时间而改变。如果几年后您看到此问题并且答案已更改,请随时添加更新。
答案 0 :(得分:0)
情况可能会有所改变(这就是为什么我没有将此问题标记为已解决),但是到目前为止,该标准还不支持wasm-to-wasm互操作性:
由于WebAssembly规范未定义导入名称的解释方式,因此主机环境可以将模块名称解释为文件路径,URL,固定的内置模块集中的密钥或主机环境,调用用户定义的挂钩将模块名称解析为其中之一;
(例如,它是实现定义的)
据我所知,当前一个wasm模块不能直接从另一个wasm模块导入,而必须使用JavaScript作为中介。
是的,该模块将其推迟到嵌入器(通常是JS)。就模块而言,它仅知道某事物正在提供导入,但不知道它来自何处。
对于Wasm而言,保证多种语言甚至同一语言的多个编译器(无论是内存还是GC)之间的无缝互操作不是设计目标。这与它的低级方法和一个非常有意识的决定是一致的:这样的通用互操作常常被承诺,但是在实践中却没有很好地解决。语言太不同了。
如果多种编译器或语言希望能够进行互操作,那么它们当然可以自由地在Wasm之上定义通用ABI。那太好了!但是Wasm本身不需要规定它,仅比CPU体系结构需要。
鉴于以上评论,在不久的将来,语言互操作性可能仍是wasm贡献者的低优先事项。