【发布时间】: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