Языки программирования

6 языков, которые можно развернуть на WebAssembly прямо сейчас

6 языков, которые можно развернуть на WebAssembly прямо сейчас

WebAssembly, или Wasm, дает разработчикам возможность создавать программы, работающие на скорости, близкой к нативной, в браузере или в любом другом месте, где можно развернуть среду выполнения WebAssembly. Но обычно вы не пишете программы на Wasm напрямую. Вместо этого вы пишете программы на других языках - некоторые из них лучше подходят для перевода на Wasm, чем другие - и компилируете их с Wasm в качестве целевого.

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

Rust

В некотором смысле Rust - это язык, наиболее подходящий для развертывания на WebAssembly. Ваш существующий код на Rust не нужно сильно модифицировать для компиляции в Wasm, и большинство изменений связаны с установкой правильной цели компилятора и параметров компиляции. Инструментарий также автоматически генерирует шаблонный JavaScript, чтобы скомпилированные модули Wasm могли работать непосредственно с веб-страницами.

Размер скомпилированного модуля будет варьироваться, но Rust может генерировать довольно компактный и эффективный код, так что простой «Hello, world» обычно не занимает больше нескольких килобайт. Мейнтейнеры Rust написали целое руководство по использованию Wasm в Rust, в котором подробно рассказывается о том, как уменьшить размер поставляемых двоичных файлов и добавить поддержку Wasm в существующий крейт Rust общего назначения.

C/C++

C и C++ были одними из первых языков, скомпилированных в Wasm, во многом потому, что многие из низкоуровневых моделей поведения в этих языках хорошо соответствуют набору инструкций Wasm. Ранняя волна демонстраций Wasm представляла собой порты графических демонстраций и игр, написанных на C/C++, и эти проекты, подтверждающие концепцию, проделали долгий путь к продаже Wasm как технологии. (Смотрите! Мы можем играть в Doom в браузере!)

Одним из первых инструментов, разработанных для компиляции C/C++ в Wasm, была цепочка инструментов Emscripten. С тех пор Emscripten стал полноценным инструментарием для компиляции C или C++ в Wasm - полноценным в том смысле, что он предлагает подробные инструкции по переносу кода. SIMD (которые поддерживаются в Wasm), сетевое взаимодействие, исключения C++, асинхронный код и многие другие расширенные возможности могут быть перенесены в Wasm, хотя объем работы зависит от возможностей. Поддержка Pthread, например, не включена по умолчанию и будет работать в браузерах только в том случае, если на веб-сервере правильно установлены определенные заголовки происхождения.

Начиная с версии 8, компилятор Clang C/C++ может компилировать в Wasm нативно, без дополнительных инструментов. Однако Emscripten использует ту же технологию, что и Clang - фреймворк компилятора LLVM - и может предоставить более полный набор инструментов специально для компиляции.

Go

Язык Go добавил поддержку WebAssembly в качестве цели компиляции в версии 1.11, выпущенной еще в августе 2018 года. Изначально являвшийся экспериментальным проектом, Wasm сейчас довольно хорошо поддерживается как цель, но с некоторыми оговорками.

Как и в случае с Rust, большинство изменений в Go-программе ради Wasm связаны с изменением процесса компиляции, а не самой программы. Инструментарий Wasm входит в состав компилятора Go, поэтому вам не нужно устанавливать какие-либо другие инструменты или пакеты; вам просто нужно изменить переменные окружения GOOS и GOARCH при компиляции. Вам нужно будет вручную настроить котел JavaScript для использования модулей Go, скомпилированных Wasm, но сделать это несложно: в основном нужно скопировать несколько файлов, и при необходимости этот процесс можно автоматизировать.

Более сложные части использования Go для Wasm связаны с взаимодействием с DOM. Входящий в комплект инструментарий для этого через пакет syscalls/js работает, но он неудобен для чего-то, кроме базового взаимодействия. Для чего-то большего подберите подходящую стороннюю библиотеку.6 языков, которые вы можете развернуть на WebAssembly прямо сейчас Rust, Go, JavaScript, C/C++ и JavaScript могут работать на Wasm. Вот что вам нужно знать.

Еще один недостаток использования Go с Wasm - размер генерируемых бинарных артефактов. Благодаря времени выполнения Go даже модуль «Hello, world» может занимать до двух мегабайт. Для экономии места можно сжимать двоичные файлы Wasm или использовать другую среду выполнения Go, например TinyGo- хотя этот вариант работает только с подмножеством языка Go.

JavaScript

Может показаться излишним переводить JavaScript в Wasm. Ведь одним из самых распространенных мест назначения Wasm является браузер, а большинство браузеров поставляются со встроенной средой выполнения JavaScript. Но при желании можно скомпилировать JavaScript в Wasm.

Наиболее доступным инструментом для преобразования JavaScript в Wasm является Javy, созданный и поддерживаемый Bytecode Alliance (главным сторонником инициатив Wasm). Javy не столько компилирует код JavaScript в Wasm, сколько выполняет его в основанной на Wasm среде выполнения JavaScript. Он также использует стратегию динамического связывания, чтобы сохранить результирующие модули Wasm достаточно маленькими, хотя размер будет варьироваться в зависимости от возможностей, используемых в вашей программе.

Python

Ситуация с Python похожа на ситуацию с Go, но выражена еще сильнее. Вы не можете запустить программу на Python без среды выполнения Python, и трудно сделать что-то полезное без стандартной библиотеки Python, не говоря уже об экосистеме сторонних пакетов Python. Вы можете запускать Python с помощью среды выполнения Wasm, но она громоздкая и громоздкая, а текущее состояние инструментария для Python-on-Wasm не является оптимизированным.

Распространенным способом запуска Python-приложений через среду выполнения Wasm является Pyodide - перенос среды выполнения CPython на Wasm через Emscripten. Одна из его реализаций, PyScript, позволяет запускать Python-программы на веб-страницах, как на JavaScript. Она также включает двунаправленную поддержку для связи между Python и JavaScript/DOM.

Тем не менее, Pyodide имеет множество недостатков. Пакеты, использующие расширения C (например, NumPy), должны быть вручную перенесены в Pyodide для работы. Из PyPI можно установить только пакеты чистого Python. Кроме того, Pyodide требует загрузки отдельного пакета Wasm для среды выполнения Python, который занимает несколько мегабайт, поэтому может оказаться обременительным для тех, кто не ожидает большой загрузки потенциально каждый раз, когда использует этот язык.

Читайте также