2016-12-01 3 views

ответ

15

Да, это возможно.

Как выполнять JavaScript API API при использовании инструментальной привязки WebAssembly до этой конкретной инструментальной цепочки. Это эффективная форма FFI: из кода на C++ похоже, что вы вызываете внешнюю функцию, но привязки привязки к встраиванию (здесь, в JavaScript браузера). Несколько примеров:

компилированные инструменты, такие как Emscripten автоматически генерировать importObject для WebAssembly.instantiate (наряду с .html и .js файлов)/Большинство внутренних данных WebAssembly поэтому обычно скрыты (я документирую их ниже).

Эта конструкция позволяет вам называть код JavaScript, а не только API JavaScript. Поэтому вы можете вызвать свой собственный код JavaScript из WebAssembly. Инструментарий просто упрощает обработку общих наборов веб-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) объявить импорт, который он будет использовать. Каждое из этих импортированных полей просматривается в importObject, а функции can be invoked через код операции call и call_indirect WebAssembly.

Таким образом, вы можете вызвать произвольный JavaScript, который, в свою очередь, может вызвать любой веб-API, который вы хотите. В будущем WebAssembly может gain capabilities which allow the embedder expose APIs directly, в браузере это может включать DOM, холст, события и т. Д.

Смежные вопросы