如何包含C ++文件中的WebAssembly模块?

时间:2018-11-14 11:58:52

标签: c++ webassembly

WebAssembly是一种二进制语言,旨在除其他目标外,突破编程语言之间的障碍。

目前,compile C++ code to WebAsm很容易将其包含在JavaScript代码中。甚至还有a proposalWebpack 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支持的发展,这个问题的答案可能会随着时间而改变。如果几年后您看到此问题并且答案已更改,请随时添加更新。

1 个答案:

答案 0 :(得分:0)

目前不可能。

情况可能会有所改变(这就是为什么我没有将此问题标记为已解决),但是到目前为止,该标准还不支持wasm-to-wasm互操作性:

  

由于WebAssembly规范未定义导入名称的解释方式,因此主机环境可以将模块名称解释为文件路径,URL,固定的内置模块集中的密钥或主机环境,调用用户定义的挂钩将模块名称解析为其中之一;

(例如,它是实现定义的)

  
    

据我所知,当前一个wasm模块不能直接从另一个wasm模块导入,而必须使用JavaScript作为中介。

  
     

是的,该模块将其推迟到嵌入器(通常是JS)。就模块而言,它仅知道某事物正在提供导入,但不知道它来自何处。

  

对于Wasm而言,保证多种语言甚至同一语言的多个编译器(无论是内存还是GC)之间的无缝互操作不是设计目标。这与它的低级方法和一个非常有意识的决定是一致的:这样的通用互操作常常被承诺,但是在实践中却没有很好地解决。语言太不同了。

     

如果多种编译器或语言希望能够进行互操作,那么它们当然可以自由地在Wasm之上定义通用ABI。那太好了!但是Wasm本身不需要规定它,仅比CPU体系结构需要。

鉴于以上评论,在不久的将来,语言互操作性可能仍是wasm贡献者的低优先事项。