Ответ 1
Да, это возможно.
Как обращаться с API-интерфейсом JavaScript при использовании инструментальной привязки WebAssembly до этой конкретной инструментальной цепочки. Это эффективная форма FFI: из кода на С++ похоже, что вы вызываете внешнюю функцию, но связующая цепочка соединяется с вложением (здесь, браузер JavaScript). Несколько примеров:
Инструментальные цепочки, такие как Emscripten, автоматически генерируют importObject
для WebAssembly.instantiate
(вместе с файлами .html
и .js
)/Большинство внутренних данных WebAssembly поэтому обычно скрыты (я документирую их ниже).
Эта конструкция позволяет вам называть любой код JavaScript, а не только API JavaScript. Поэтому вы можете вызвать свой собственный код JavaScript из WebAssembly. Инструментарий просто упрощает обработку общих наборов веб-API, иногда кросс-платформенным способом, например. SDL2 делает звук, клавиатуру, мышь, джойстик и графику.
Внутренние данные
WebAssembly API JavaScript позволяет передать a importObject
к конструктору WebAssembly.instantiate
и функции WebAssembly.instantiate
:
new Instance(moduleObject [, importObject])
Promise<{module:WebAssembly.Module, instance:WebAssembly.Instance}>
instantiate(BufferSource bytes [, importObject])
Бинарный формат > содержит раздел , где вы (через компилятор, такой как LLVM) объявите импорт, который он будет использовать. Каждое из этих импортированных полей просматривается в importObject
, и функции могут быть вызваны через WebAssembly call
и call_indirect
opcode.
Таким образом, вы можете вызвать произвольный JavaScript, который, в свою очередь, может вызывать любой веб-API, который вы хотите. В будущем WebAssembly может получить возможности, которые позволяют встроенному экспорту напрямую отображать API, в встраивание браузера это может включать DOM, холст, события и т.д..