使用WebAssembly调用Web API方法

goo*_*goo 21 webassembly

是否可以将Web API与WebAssembly 一起使用?如果是这样,怎么样?我对Navigator界面更感兴趣.

JF *_*ien 22

对的,这是可能的.

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

工具链如Emscripten自动生成一个importObject用于WebAssembly.instantiate(带有沿.html.js文件)/大多数内部WebAssembly细节因此通常是隐藏的(I记录他们下文).

此设计允许您调用任何JavaScript代码,而不仅仅是JavaScript API.因此,您可以从WebAssembly调用自己的JavaScript代码.工具链只是简单地处理常见的Web API集合,有时以跨平台的方式处理,例如SDL2可以处理音频,键盘,鼠标,操纵杆和图形.

内部细节

WebAssembly的的JavaScript API允许你传递一个importObjectWebAssembly.Instantiate构造函数和WebAssembly.instantiate函数:

new Instance(moduleObject [, importObject])

Promise<{module:WebAssembly.Module, instance:WebAssembly.Instance}>
    instantiate(BufferSource bytes [, importObject])
Run Code Online (Sandbox Code Playgroud)

WebAssembly 二进制格式包含一个导入部分,您可以通过编译器(如LLVM)声明它将使用的导入.每个导入的字段都在其中查找importObject,并且可以通过WebAssembly callcall_indirect操作码调用这些函数.

因此,您可以调用任意JavaScript,这反过来可以调用您想要的任何Web API.将来,WebAssembly可能会获得允许嵌入器直接公开API的功能,在浏览器中嵌入这可能包括DOM,画布,事件等.