2016-12-01 52 views

回答

15

是的,這是可能的。

如何在使用WebAssembly工具鏈時調用JavaScript API取決於特定的工具鏈。它實際上是FFI的一種形式:從C++代碼看起來您​​調用了外部函數,但工具鏈連接到嵌入程序(這裏是瀏覽器的JavaScript)。舉幾個例子:

工具鏈如Emscripten自動生成importObjectWebAssembly.instantiate(與沿和.js文件)/大多數內部WebAssembly細節因此通常隱藏(我在下面記錄它們)。

本設計允許您調用任何JavaScript代碼,而不僅僅是JavaScript API。因此,您可以從WebAssembly調用您自己的JavaScript代碼。工具鏈簡化了處理常用Web API集的過程,有時也是以跨平臺的方式處理的。 SDL2可以處理音頻,鍵盤,鼠標,操縱桿和圖形。

內部細節

WebAssembly的​​允許您通過an importObjectWebAssembly.Instantiate構造和WebAssembly.instantiate功能:

new Instance(moduleObject [, importObject]) 

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

的WebAssembly binary format包含import section,你(通過編譯器如LLVM)申報它將使用的進口。在importObject以及通過WebAssembly的callcall_indirect操作碼的函數can be invoked中查找每個導入的字段。

因此,您可以調用任意JavaScript,然後調用任何您想要的Web API。未來,WebAssembly可能會在gain capabilities which allow the embedder expose APIs directly的嵌入式瀏覽器中包含DOM,canvas,events等。