Design: когда нам понадобится клеевой код?

Созданный на 9 апр. 2018  ·  4Комментарии  ·  Источник: WebAssembly/design

Встречаю несколько случаев.

one нам нужен код клея:

int addThree(uint8_t *buf, int len) {
  uint8_t *item;
  uint8_t *end = buf + len;

  for (item = buf; item<end; item++) {
    *item += 3;
  }

  return 0;
}

но, проще говоря, нам нужно использовать только файл .wasm

int adder (int a, int b) {
    return a + b;
}

Итак, что делает клей-код? Я не смог найти некоторые документы.

Самый полезный комментарий

Клей-код, описанный в комментарии выше, является загрузчиком JavaScript, который генерирует Emscripten. Он делает именно то, что говорится в комментарии: преобразует между представлениями данных JS и C ++ (например, строками) и между различными представлениями объектов (т.е. создает объекты прокси JS для объектов C ++). Он также создает необходимые типизированные массивы.

Как вы заметили, вы можете обойтись без загрузчика Emscripten для простых случаев, таких как две функции, которые вы использовали в качестве примеров. Ни один из них не требует сложного связующего кода: каждому просто нужен JS-файл для загрузки Wasm-файла (а во втором примере для wasm-файла addThree также потребуется создать Uint8Array).

Наконец, выделение памяти обрабатывается кодом Wasm, который должен включать копию malloc из musl (хотя Emscripten по-прежнему включает его malloc, а не использует musl). Утечки памяти можно избежать стандартным способом, просто освободив память в вашем коде C / C ++ после того, как вы закончите с ним, ничего особенного, что требуется Wasm здесь.

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

Эту проблему можно было бы закрыть, это вопрос Emscripten, а не ошибка в самом дизайне WebAssembly.

Все 4 Комментарий

Какой клей код? Вы, кажется, скопировали сюда две функции ( addThree() и adder() ) из каких-то руководств по Wasm? Они кажутся просто примерами функций, которые на самом деле мало что делают, а просто служат для демонстрации простого учебника по Wasm. Ни одна из этих функций не имеет сложной подписи и должна быть вызвана без какого-либо связующего кода.

Но это не моя точка зрения. В некоторых документах это объясняется следующим образом:

В долгосрочной перспективе wasm с типизированными объектами и сборщик мусора могут помочь. Это то, что здесь имеется в виду?
В противном случае я не уверен, как можно удалить этот клейкий код в краткосрочной или среднесрочной перспективе. Чтобы сформировать оболочку вокруг вещей C / C ++, которые сделают их похожими на JS, нужно потрудиться. Например, связующий код должен содержать методы для преобразования строки C в строку JS и наоборот. На уровне C ++ поддержка расширения класса C ++ в JS и реализация виртуальных методов в JS требует значительных усилий. И вообще, для доступа к веб-API из wasm через JS потребуется много клея.

и другие:

Emscripten требует большого разнообразия «связующего» кода JavaScript для обработки выделения памяти, утечек памяти и множества других проблем, которые уже включены в предоставленный шаблон. Это проще использовать, чем писать все самостоятельно.

Когда я встречаю простой код C / C ++, я легко могу использовать wasm, скомпилировав его, и export.xxxFn() .

int adder (int a, int b) {
    return a + b;
}

и когда я использую код, который использует Buffer, я предпочитаю использовать клей-код.

# C/C++
int addThree(uint8_t *buf, int len) {
  uint8_t *item;
  uint8_t *end = buf + len;

  for (item = buf; item<end; item++) {
    *item += 3;
  }

  return 0;
}

# deal with buffer in JS
...
let dataHeap = new Uint8Array(Module.HEAPU8.buffer, dataPtr, nDataBytes);
dataHeap.set(new Uint8Array(buffer_pcm.buffer));
...

Итак, я могу сделать вывод, что когда я передаю буфер в WASM, мне нужен связующий код для обработки выделения памяти, утечек памяти и множества других проблем?

Клей-код, описанный в комментарии выше, является загрузчиком JavaScript, который генерирует Emscripten. Он делает именно то, что говорится в комментарии: преобразует между представлениями данных JS и C ++ (например, строками) и между различными представлениями объектов (т.е. создает объекты прокси JS для объектов C ++). Он также создает необходимые типизированные массивы.

Как вы заметили, вы можете обойтись без загрузчика Emscripten для простых случаев, таких как две функции, которые вы использовали в качестве примеров. Ни один из них не требует сложного связующего кода: каждому просто нужен JS-файл для загрузки Wasm-файла (а во втором примере для wasm-файла addThree также потребуется создать Uint8Array).

Наконец, выделение памяти обрабатывается кодом Wasm, который должен включать копию malloc из musl (хотя Emscripten по-прежнему включает его malloc, а не использует musl). Утечки памяти можно избежать стандартным способом, просто освободив память в вашем коде C / C ++ после того, как вы закончите с ним, ничего особенного, что требуется Wasm здесь.

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

Эту проблему можно было бы закрыть, это вопрос Emscripten, а не ошибка в самом дизайне WebAssembly.

Спасибо большое

Была ли эта страница полезной?
0 / 5 - 0 рейтинги

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

chicoxyzzy picture chicoxyzzy  ·  5Комментарии

artem-v-shamsutdinov picture artem-v-shamsutdinov  ·  6Комментарии

ghost picture ghost  ·  7Комментарии

konsoletyper picture konsoletyper  ·  6Комментарии

jfbastien picture jfbastien  ·  6Комментарии