【问题标题】:Is it possible to call WebAssembly functions from Go?是否可以从 Go 调用 WebAssembly 函数?
【发布时间】:2017-05-28 06:00:24
【问题描述】:

我想将 C++ 库编译为 webassembly,然后使用 Go 程序中的 webassembly 库。是否可以?我知道cgo,但不幸的是我在受限环境中运行代码,所以我不能使用cgo。 WebAssembly 似乎有一种 JavaScript 接口,所以我认为任何其他语言都应该能够使用相同的接口。

【问题讨论】:

  • 我不确定你是否理解 WebAssembly 是什么。它有一个 JavaScript 接口,因为它适用于 Web 浏览器,其中 JavaScript 是唯一可用的本地语言。浏览器只运行 JavaScript,因此,为了让 WebAssembly 在那里工作,它们也需要使用 JavaScript 进行推断。如果您没有编写应该在 Web 浏览器上运行的程序,那么您也不会使用 WebAssembly。
  • @paulortorrens 我认为您实际上弄错了。据我了解,webassembly 并非仅适用于 Web 浏览器。它实际上也针对物联网/嵌入式环境。 webassembly.org/docs/non-web 。引用重要部分:WebAssembly could be used as a portable binary format on many platforms, bringing great benefits in portability, tooling and language-agnosticity
  • 还不错;但它是为 Web 设计的,即使在 Web 环境中,它仍然是一项新技术。此外,即使 WebAssembly 可以在其他地方使用,JavaScript 界面也肯定是为 Web 设计的。到目前为止,与其他任何东西的接口都不会那么简单。你需要解释它吗?因为,如果你只是想在 Go 程序中使用 C++ 库,肯定有更简单的方法,因为你可以使用本地编译器将它们一起编译。您能否详细说明您想要实现的目标?
  • 据我所知,目前唯一存在的 WebAssembly 实现是 JavaScript 引擎(如 V8)中的实现。 JavaScript 可以调用和加载 WebAssembly,因为同一个虚拟机实现了这两者,并且通过设计知道如何桥接它们。所以,如果你想在你的 Go 程序中嵌入 WebAssembly,你需要要么使用 JavaScript 引擎,要么实现你自己的虚拟机来解释 WebAssembly(从而为你的 Go 代码添加一个接口)。 WebKit 使用 JavaScriptCore 作为其虚拟机,似乎支持 WebAssembly;你可以使用它。
  • 如果你有 WA,你可以通过在 Go 中运行 JS 解释器或使用 GopherJS编译你的 Go 到 JS。在您的情况下,可能更好的解决方案是使用 cgo 直接与 C++ 交互。我不认为 WA 给你任何优势——它只是增加了另一个不必要的(并且可能无法克服的)抽象层。

标签: go webassembly


【解决方案1】:

最近 WebAssembly 编译支持已经落地。所以应该可以从已经编译成 WebAssembly 的 go 代码中调用其他模块。

【讨论】:

  • 我该怎么做?(显然,不使用javascript)
猜你喜欢
  • 2019-10-17
  • 2020-06-01
  • 1970-01-01
  • 2015-05-22
  • 2019-10-15
  • 2012-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多