【问题标题】:Can C++ and Rust programs compiled to wasm interoperate somehow?编译为 wasm 的 C++ 和 Rust 程序能否以某种方式互操作?
【发布时间】:2020-04-12 05:39:23
【问题描述】:

假设我有一个用 Rust 编写的程序和另一个用 C++ 编写的程序。鉴于它们都编译为 Wasm,我可以以某种方式从另一个程序中调用一个程序中的函数吗?

【问题讨论】:

  • 我认为您不能直接从一个模块调用函数到另一个模块。为此,需要定义一个通用接口,例如在共享库中调用方法时。我不知道这样的接口,所以你可能需要用 javascript 代码桥接模块。
  • @TomášZato-ReinstateMonica 谢谢。用 JS 桥接两者在 99% 的情况下都很好,直到它成为瓶颈......

标签: c++ rust wasm-bindgen


【解决方案1】:

是的,如果他们共享相同的 ABI。

当编译成程序集时,重要的是 ABI,或应用程序二进制接口:

  • 类型在内存中是如何表示的?
  • 如何将参数传递给函数?
  • ...

当您听说C 是编程语言的通用语时,这意味着任何使用 C ABI 的语言1 都可以与任何其他使用该语言的语言进行通信C ABI。

因此,无论是针对 x64 上的 Windows 还是 WebAssembly,真正重要的是两个程序在相互通信时共享相同的约定 (ABI)。

在您的情况下,Rust 和 C++ 都可以与 C 通信,因此通过 C API 进行通信,它们可以在 x86、x64、各种 ARM 上进行通信,当然还有 WASM。

1按照惯例,平台的所有者为该平台定义了 C ABI,并且所有 C 编译器在针对该平台时都实现了定义的 ABI。这意味着存在多个不兼容的 C ABI;但是,由于 ABI 仅在二进制级别交互时才重要,而这仅在同一平台上执行时才会发生,因此实际上在任何给定情况下都有一个相关的 C ABI。

【讨论】:

  • 谢谢!优秀的答案。很长一段时间我都没有真正理解 ABI 是什么。你让我变得非常简单:How are types represented in memory?。我确实看到了 Rust 的 C 绑定(只是自己没有编写它们),所以我知道它们存在并且是可能的。所以我觉得我应该学习那个领域。
  • @NurbolAlpysbayev 顺便说一句,如果您在一些独立的答案中完成这项工作,那么在此处发布将是一个很棒的自我回答问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-07
  • 1970-01-01
  • 2020-09-24
  • 2018-03-13
  • 2020-03-22
  • 2013-10-24
  • 1970-01-01
相关资源
最近更新 更多