🔥

Тред (Андрей Нагих)


В общем, можете дальше сами фантазировать над применением 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…