🔥

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


Что умеет WebAssembly? Во-первых, это цель компиляции. Нет смысла писать его руками (хотя такая возможность есть). 1⃣ Исторически, полнее всего поддержка C и C++. Осуществляется компилятором Emscripten авторства Alon Zakai @kripken.

Alon ключевая фигура в этой технологии, именно он был основной движущей силой проекта asm.js, приведшего к Wasm. И именно поэтому компилятор Emscripten хорошо проработан — он старше самой технологии Wasm.

Наш проект Bytefog b2b.peers.tv/bytefog написан как раз на C++, поэтому нашим основным инструментом был как раз Emscripten. Мы остановимся на его возможностях позже.

2⃣ Очень активно развивается поддержка в Rust. Это не удивительно, т.к. и язык, и технология авторства Mozilla. На сегодняшний день компилятор Rust сам умеет выдавать Wasm байткод.

Также, в экосистеме Rust пишутся файлы биндингов к Web API. Биндинги нужны, если мы хотим из контекста Wasm вызвать функцию контекста JS (встроенную, или пользовательскую). Очень классно, что теперь не нужно будет вручную делать это для встроенных.

Команда Rust использует для написания биндингов язык WebIDL (тот же, что и W3C для спецификаций браузерных API). Emscripten также поддерживает биндинги в этом формате, так что можно будет их адаптировать. Ещё у Emscripten есть своя технология для биндинга: Embind.

В своём проекте мы использовали именно Embind, и я расскажу о его возможностях подробнее позже.

3⃣ Начиная с версии 1.11 Go поддерживает Wasm. Эта поддержка до сих пор экспериментальна. И на выходе получаются большие бинарники, т.к туда попадает рантайм Go для горутин, сборки мусора и пр. Минимальный размер файла — около 2 Мб на пустое приложение, что довольно много.

Для сравнения, весь наш код Bytefog уложился в 2Mб. Очень классно, что .wasm файлы отлично жмутся gzip: на выходе получается 500 Кб. Т.е. в 4 раза это реально. Не забывайте настраивать сжатие для них.

4⃣ Симметрично, хотелось бы поддержки Kotlin. И некоторые подвижки в этом есть. Статья 2018 года superkotlin.com/kotlin-and-web… показывает как скомпилировать Kotlin/Native в Wasm. Но с тех пор новостей не было. Полагаю, поддержка экспериментальна, как и сам Kotlin/Native.

5⃣ Есть эксперименты с поддержкой Java. Но все они пока не достигли зрелости. Ключевые слова: TeaVM, JWebAssembly, Bytecoder

6⃣ Гораздо лучше дела у .Net, в репозитории Mono есть примеры как скомпилировать в WebAssembly. github.com/mono/mono/tree…

7⃣ Многие спрашивают: «Можно ли JavaScript скомпилировать в WebAssembly». Идея звучит странно, но есть команда, реализовавшая её для TypeScript. Проект называется AssemblyScript, движется очень хорошо и имеет популярность github.com/AssemblyScript… Это простой способ начать с Wasm

Есть ряд интерпретируемых языков (например Lua), которые тоже работают в Wasm. Но это достигли тем, что скомпилировали их интерпретаторы в Wasm. С помощью такого хака можно поддержать хоть PHP, хоть Brainfuck. Можно с этим поэкспериментировать, результат может быть забавным.

Реестр поддерживаемых языков ведётся на GitHub github.com/appcypher/awes… Там можно взять ссылки на те проекты, что я упоминал. И посмотреть остальные, совсем сырые варианты.