В общем, можете дальше сами фантазировать над применением WebAssembly.
Думаю, демки хорошо иллюстрируют его возможности.
Отличная идея на хакатон или research-день: взять какую-нибудь библиотеку на C или C++ и попробовать её скомпилировать в WebAssembly.
❓ Спрашивают, почему Wasm c нами надолго?
Было много попыток построить второй рантайм в браузере:
ActiveX
Java Applets
Flash
Silverlight
NaCl
Все они провалились по одной и той же причине: слишком большой доступ к системе.
WebAssembly основывается на той изоляции, которая работает уже много лет в браузере.
Да, из-за этого есть проблемы с реализацией некоторых фич, таких как доступ к диску или сети.
Но с развитием Web API, белых пятен на этой карте будет всё меньше.
❓Именно поэтому WebAssembly не пришёл, чтобы заменить JS. Это также частый вопрос.
Для запуска .wasm файла как минимум необходимо сделать несколько вызовов JS.
Нужен «клеевой код» на JS, который пробрасывает в Wasm встроенные API браузера и ваши объекты и функции.
При компиляции через Emscripten такой код генерируется автоматически. Т.е. деплоим мы 2 файла: .wasm и .js с клеевым кодом.
Вообще, Emscripten работает как «Browserify для C++», т.к. по максимуму старается полифилить нативные API:
STDIN/STDOUT
системные вызовы
файловую систему
3D графику
сокеты конвертирует в WebSockets
треды
и многое другое
Также большая часть Emscripten, это тот самый биндинг сущностей из двух миров.
Есть три способа это делать:
ccall/cwrap
WebIDL
Embind
ccall/cwrap не умеет в объекты, это только для простых C-функций. Чаще всего встречается в tutorials для начинающих.
WebIDL это язык описания интерфейсов. Умеет много чего, и похоже, что сейчас это самый перспективный вариант. Я уже говорил, что Rust его активно использует.
Мы взяли Embind, т.к. он лучше лёг на нашу кодовую базу. С помощью жёсткой магии шаблонов C++ он предоставляет вполне читаемый DSL для описания связей объектов.
Умеет, кажется, ещё больше, чем WebIDL.
Можно пробрасывать:
функции
классы
интерфейсы
статические методы
value objects
сырые указатели
умные указатели
абстрактные методы
виртуальные методы
перегрузка функций
enum
константы
класс val для работы с браузерным API
векторы
А также довольно логично биндит встроенные типы данных C++ в типы данных JS.
Честно говоря, писать биндинги поначалу это очень больно.
Синтаксис непривычен ни плюсовикам, ни фронтендерам, легко опечататься.
Есть тонкие нюансы.
Кое-где ошибки стреляют не сразу
Но задачу свою он решает, и потренировавшись на кошках, можно им пользоваться.
Документация есть, но не самая полная, и точная. Я делал PR с правкой фактических ошибок.
emscripten.org/docs/porting/c…
Поэтому лучше всего — смотреть в тесты Embind. Там есть такие выкрутасы, которые даже не сразу придумаешь.
Один сложный случай биндинга мы решили только благодаря тестам.
Файл на 3000 строк!
github.com/emscripten-cor…