【问题标题】:Using WebAssembly to call Web API methods使用 WebAssembly 调用 Web API 方法
【发布时间】:2017-04-15 16:51:18
【问题描述】:

是否可以将Web APIs 与 WebAssembly 一起使用?如果是这样,怎么做?我对Navigator interface更感兴趣。

【问题讨论】:

    标签: webassembly


    【解决方案1】:

    是的,有可能。

    如何在使用 WebAssembly 工具链时调用 JavaScript API 取决于特定的工具链。它实际上是 FFI 的一种形式:从 C++ 代码看来,您正在调用一个外部函数,但工具链桥接至嵌入器(此处为浏览器的 JavaScript)。几个例子:

    诸如 Emscripten 之类的工具链会自动为 WebAssembly.instantiate(以及 .html.js 文件)生成一个 importObject/因此大多数内部 WebAssembly 细节通常是隐藏的(我在下面记录它们)。

    这种设计允许您调用任何 JavaScript 代码,而不仅仅是 JavaScript API。因此,您可以从 WebAssembly 调用您自己的 JavaScript 代码。工具链只是让处理常见的 Web API 集变得更容易,有时以跨平台的方式,例如SDL2 负责音频、键盘、鼠标、操纵杆和图形。

    内部细节

    WebAssembly 的 JavaScript API 允许您将 an importObject 传递给 WebAssembly.Instantiate 构造函数和 WebAssembly.instantiate 函数:

    new Instance(moduleObject [, importObject])
    
    Promise<{module:WebAssembly.Module, instance:WebAssembly.Instance}>
        instantiate(BufferSource bytes [, importObject])
    

    WebAssembly binary format 包含一个 import section,您(通过 LLVM 等编译器)在其中声明它将使用的导入。通过 WebAssembly 的 callcall_indirect 操作码在 importObject 和函数 can be invoked 中查找每个导入的字段。

    因此,您可以调用任意 JavaScript,而后者又可以调用您想要的任何 Web API。将来,WebAssembly 可能会gain capabilities which allow the embedder expose APIs directly,在浏览器中嵌入这可能包括 DOM、画布、事件等。

    【讨论】:

    • 后来添加了这些功能吗? IE。这个答案需要更新吗?
    猜你喜欢
    • 2014-12-11
    • 2015-10-08
    • 2015-08-24
    • 2018-12-07
    • 2013-06-04
    • 1970-01-01
    • 1970-01-01
    • 2016-11-16
    • 2013-09-24
    相关资源
    最近更新 更多