Использование WebAssembly для вызова методов Web API

Можно ли использовать веб-API с помощью WebAssembly? Если да, то как? Меня больше интересует интерфейс Navigator.

Ответы

Ответ 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, холст, события и т.д..