Могут ли несколько модулей Wasm взаимодействовать друг с другом и совместно использовать память через функции? - PullRequest
0 голосов
/ 14 января 2020

Есть ли способ создания двух модулей Wasm, a и b, чтобы a мог вызывать функции из b, а также обращаться к отдельной памяти из b? Например, предположим, что a получает память, вызывая реализацию malloc в b, которая подвергается a. Таким образом, вся полезная память берется из b. Если так, как это можно сделать? В частности, можно ли это сделать без дополнительных затрат и без взаимодействия с JavaScript между этими операциями (кроме шага инициализации при создании экземпляров модулей и настройке импорта / экспорта)? Каковы характеристики производительности такого рода косвенного доступа и доступа к памяти, или это вообще не проблема? В этом случае я хочу микрооптимизировать .

(Я прочитал несколько документов, но не могу найти четкого ответа. Я думаю, что в будущих версиях Вася, есть планы стандартизированного динамического связывания c, которое помогло бы, но мы еще не пришли.)

1 Ответ

2 голосов
/ 14 января 2020

Есть ли способ создать два модуля WASM, a и b, чтобы a мог вызывать функции из b

Да, вы можете создать экземпляр модуля b, экспортировав одну из его функций затем создайте экземпляр a, импортируя ту же функцию, чтобы они могли взаимодействовать. Однако это не так быстро, как одна функция WebAssembly, вызывающая другую, так как вызов происходит через среду хоста.

, а также доступ к отдельной памяти из b

Да, еще раз, это возможно. Линейная память может быть разделена между модулем WebAssemnbly и его хостом, а также может быть разделена между двумя модулями.

это можно сделать без дополнительных затрат и без взаимодействия с JavaScript между ними операции

Как и выше, нет, в настоящее время это не может быть сделано без дополнительных затрат.

Это изменится в будущем по мере расширения и развития спецификации WebAssembly. Одной из проблем, связанных с полезной связью непосредственно между двумя модулями WebAssembly, является понимание API, которое каждый из них предоставляет. WebAssembly является целью компиляции, и различные исходные языки (C ++, Rust) кодируют типы по-разному - это значительно ограничивает межмодульное взаимодействие.

Важным шагом к этому является Типы интерфейса, который кодирует спецификацию API для модуля / функции. Как только это будет реализовано, прямая связь между модулями WebAssembly станет вполне возможной.

...