Практическое введение в Web Assembly с использованием C

WebAssembly — это низкоуровневый двоичный формат для Интернета, разработанный, чтобы быть быстрым, безопасным для памяти и открытым. Такие языки, как C, Rust и C++, компилируются в WebAssembly и запускаются в браузере.

Эта статья представляет собой краткое практическое руководство по созданию и использованию двоичных файлов веб-сборки в JavaScript. Для получения дополнительной информации, пожалуйста, обратитесь к ссылкам, приведенным в конце статьи.

Установка Эмдск

Ниже приведены основные команды для установки компилятора в Linux.

$ git clone https://github.com/emscripten-core/emsdk.git
$ cd emsdk
$ git pull
$ ./emsdk install latest
$ ./emsdk activate latest
$ source ./emsdk_env.sh

Посетите официальный веб-сайт Emscripten, чтобы узнать больше о загрузке компилятора emsdk для вашей конкретной платформы.

Привет, мир

Мы начнем с традиционной программы hello world, чтобы начать наш проект.

$ emcc hello.c 

После компиляции будут сгенерированы файлы a.out.js и a.out.wasm. Чтобы запустить код, просто запустите.

$ node a.out.js
Hello, World!

Добавить два числа

EMSCRIPTEN_KEEPALIVE необходимо добавить для любой функции, которую необходимо экспортировать. Теперь, чтобы создать отдельный файл WASM, в котором нет файла main.

$ emcc add.c -o add.wasm --no-entry

Чтобы запустить код:

$ node add.js
30

Для асинхронного создания WASM мы можем использовать следующее:

Линейный поиск

$ emcc linearsearch.c -o linearsearch.wasm — no-entry

Когда мы создаем Int32Array , экземпляр wasm создает буфер памяти, начиная с ячейки памяти 0. Буфер памяти предоставляется JavaScript как ArrayBuffer через memory.buffer. Мы указываем длину как 5.

$ node linearsearch.js 
2

Умножить массив

$ emcc multiply.c -o multiply.wasm --no-entry
$ node a.js 
[ 4, 10, 18 ]

Рекомендации

  1. https://marcoselvatici.github.io/WASM_tutorial/
  2. https://rob-blackbourn.github.io/blog/webassembly/wasm/javascript/c/clang/wasi-sdk/marshalling/2020/07/02/wasi-marshalling.html
  3. https://emscripten.org/docs/porting/guidelines/api_limitations.html
  4. https://www.tech-wiki.online/en/webassembly.html