Исполняющие среды WebAssembly

Что это, как устроено и кому надо

Исполняющие среды WebAssembly

Любая информация в компьютере в конечном итоге выглядит как набор битов — нулей и единиц. Но изначально биты просто сырьё, которое потом станет полезными вещами. Когда процессор или программа распознаёт нули и единицы как данные или набор инструкций, они становятся файлами и программами.

Сегодня разберёмся в этих слоях немного подробнее и узнаем, к чему относится WebAssembly, зачем его придумали и как используют сегодня.

Машинный код, байт-код и код на языках программирования

Есть память, которая может хранить нули или единицы. Память не понимает, что такое картинки, программы и вообще любые другие файлы, — она просто хранит биты.

Машинный код — это тоже биты, но особенные, которые процессоры договорились воспринимать как инструкции. Для разных CPU нужен и разный бинарный код. Смысл инструкции может быть один, например удалить файл из папки. Но для процессора x86_64 и ARM64 это будет код из разных последовательностей нулей и единиц.

CPU умеет распознавать специальные шаблоны битов и так понимает: вот эти биты — программа с инструкцией, а это — просто файлы.

Есть байт-код. Такой код процессор уже не понимает, но есть другие программы-переходники, которые переводят байт-код в машинный для CPU.

Байт-код, как и машинный, тоже бывает разным — но он не зависит от конкретного процессора. Поэтому байт-код можно выполнить на любом процессоре, при условии, что есть нужная программа-переходник между кодом и платформой, на которой его запускают.

Машинный и байт-код слишком сложные для того, чтобы их писал или читал человек.

Код на языках программирования удобный для чтения и написания, но его тоже не понимает процессор. Такой человекочитаемый код нужно перевести либо в байт-код, либо сразу в машинный.

Что такое WebAssembly

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

В браузерах WebAssembly нужен для работы со сложными операциями.

Для бизнес-логики веб-страниц используется язык JavaScript. Он создавался для простых вещей: реакции на клики, управления элементами страниц, проверки клиентских форм. Но постепенно веб-страницы выросли из просто сайтов в большие высоконагруженные приложения, и тут вскрылись ограничения JS: научные расчёты, криптография и другие сложные вычислительные операции занимали слишком много времени.

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

Что такое WebAssembly
Источник: physicscurriculum.com

Другой пример — обработка сигналов. Звук, изображения, видео — всё это получается из потока чисел: амплитуды волны, яркости пикселей, последовательностей кадров.

Что такое WebAssembly
Источник: pcmag.com

JavaScript был создан для удобного и быстрого создания кода, но из-за этого пострадала его производительность: для тяжёлых операций на процессоре JS требуются дополнительные накладные расходы, а автоматическая работа с памятью налагает ограничения и может вызывать остановки и паузы.

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

Основные принципы работы WebAssembly

Главное, что нужно знать: код WebAssembly не создают, его компилируют из любого другого высокоуровневого языка, который поддерживает такую компиляцию.

Получается такая схема:

  • Разработчик пишет программу на удобном ему языке.
  • Эту программу можно компилировать в файл WebAssembly. Разные языки используют для этого свои инструменты.
  • Wasm-файл можно запустить на любой машине, которая поддерживает программы-переходники для wasm-файлов.

Скомпилированный Wasm сохраняет свойства языка, из которого он получился. То есть байт-код программы, написанной на С, может работать быстро и предсказуемо, но опасность ошибок и поломок тоже остаётся высокой. Написанный на Питоне wasm-файл защищён от большого количества ошибок, но работать будет гораздо медленнее.

Полезный блок со скидкой

Если вам интересно разбираться со смартфонами, компьютерами и прочими гаджетами и вы хотите научиться создавать софт под них с нуля или тестировать то, что сделали другие, — держите промокод Практикума на любой платный курс: KOD (можно просто на него нажать). Он даст скидку при покупке и позволит сэкономить на обучении.

Бесплатные курсы в Практикуме тоже есть — по всем специальностям и направлениям, начать можно в любой момент, карту привязывать не нужно, если что.

Почему WebAssembly такой удобный

Один из главных плюсов — встроенная безопасность.

Код WebAssembly всегда выполняется в изолированной среде, где он просто не имеет доступа ни к памяти, ни к операционной системе. Все взаимодействия с внешним миром возможны только через явно разрешённые интерфейсы программ-посредников, что предотвращает неконтролируемое влияние на систему. Такое изолированное пространство называют sandbox, или песочницей.

Ещё одно преимущество WebAssembly в его кросс-платформенности, но это мы разберём подробнее дальше.

Что такое среда выполнения Wasm

Программа-переходник — это среда выполнения байт-кода, или runtime. Runtime для Wasm — это программа, которая берёт файл WebAssembly, читает его и объясняет CPU, что нужно сделать.

Все скрипты WebAssembly имеют один формат. Но запустить их можно только после установки рантайма, посредника-переводчика между файлом .wasm и финальным исполнителем — процессором.

Runtime есть не только у WebAssembly. Это потому, что в байт-код можно перевести разные языки и это будут разные виды байт-кода. Для запуска каждого нужны разные рантаймы.

Например, есть runtime для Python. Программа на Питоне при запуске сначала компилируется в байт-код Python, а потом запускается в среде выполнения Python. Среда выполнения построчно читает байт-код и переводит его в машинный язык. Получается машинный язык из нулей и единиц, который создан из python-программы. И всё это будет отличаться от байт-кода и машинного кода, созданного на других языках.

В чём главное отличие runtime конкретного языка программирования и WebAssembly: runtime для языка поймёт только байт-код для одного языка, например Python, а Wasm может получиться из любого языка. Поэтому можно сказать, что рантайм WebAssembly запускает программу на любом языке.

Почему всё сложно и как Wasm делает всё проще

Если попробовать сложить всё вместе, получается ад:

  • Все языки программирования разные и устроены тоже по-разному: некоторые хорошо подходят только для простых задач, а некоторые дают возможность делать почти всё, но работать с ними гораздо сложнее.
  • Чтобы компьютер понял вашу программу, она может компилироваться в байт-код. Полученный из разных языков байт-код работает по-разному.
  • Для запуска разного байт-кода и на разных устройствах нужны разные среды выполнения, или рантаймы. Какие именно, зависит от байт-кода и от машины, на которой вы хотите запустить программу.
  • В итоге программа становится машинным кодом, и хотя все они состоят из нулей и единиц, но всё равно получаются разными.

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

Почему всё сложно и как Wasm делает всё проще
Источник: aws.plainenglish.io

Он будет работать по-разному, но при этом вы можете создавать программы, переводить их в один формат, запускать на разных устройствах и смотреть на результат.

Бонус для читателей

Если вам интересно погрузиться в мир ИТ и при этом немного сэкономить, держите наш промокод на курсы Практикума. Он даст вам скидку при оплате, поможет с льготной ипотекой и даст безлимит на маркетплейсах. Ладно, окей, это просто скидка, без остального, но хорошая.

Архитектура сред выполнения WebAssembly

Большинство runtime для WebAssembly состоят из нескольких главных компонентов: загрузчика модулей, валидатора, движка исполнения и набора системных интерфейсов. Эти части могут быть реализованы по-разному в зависимости от целей среды.

Одни среды выполнения делают ставку на максимальную производительность, другие — на минимальный размер или безопасность.

Вот два основных вида рантаймов WebAssembly:

1. Компилятор Wasm

Компилятор преобразует wasm-код в машинный код конкретной платформы один раз. Это даёт высокую скорость выполнения, потому что компилятор всё подготавливает, отдаёт CPU и на этом его работа заканчивается. Но при этом у таких рантаймов более сложная архитектура и увеличенное потребление ресурсов.

2. Интерпретатор Wasm

Интерпретатор исполняет wasm-инструкции напрямую, без предварительной компиляции, по одной строке: читает байт-код → превращает его в машинный → отдаёт в CPU. Это делает запуск быстрым и простым, потому что не нужно тратить время на создание одной большой инструкции. Но зато снижает производительность, потому что интерпретатор будет постоянным посредником между файлом WebAssembly и процессором.

Такой подход часто используется в микроконтроллерах и IoT-устройствах, где важны малый размер и низкое энергопотребление.

Системный интерфейс WebAssembly (WASI)

Это ещё один посредник в цепочке выполнения программы:

Системный интерфейс WebAssembly (WASI)
Источник: moimhossain.com

Посмотрите, сначала мы пишем программу, потом компилируем её в Wasm, потом запускаем через runtime, а runtime запускает WASI, который уже работает с конечными объектами напрямую: файловой системой, сетями, базой данных.

WASI — отдельный большой развивающийся проект. Это программа, которая определяет, какие возможности получит байт-код Wasm при выполнении.

Популярные среды выполнения WASM

Вот несколько рантаймов WebAssembly для разных задач.

Wasmtime

Один из самых популярных runtime для запуска WebAssembly на сервере. Он активно развивается и тесно связан с экосистемой WASI. Wasmtime часто используют в backend-сценариях, где важны безопасность, стабильность и хорошая интеграция с языком Rust.

WasmCloud

Это не просто runtime, а платформа для распределённых приложений. Она использует WebAssembly как основу для микросервисов. Здесь wasm-модули взаимодействуют друг с другом, не зная деталей общей инфраструктуры.

Lucet

Runtime с упором на быстрый старт. Он активно применялся в edge-вычислениях, когда работа ведётся на удалённом, максимально близко находящемуся к пользователю сервере. Сеть CDN — это edge-вычисления. Например, когда вы смотрите потоковое видео на стриминге онлайн, оно загружается с ближайшего к вам edge-сервера.

Lucet хорошо подходит для сценариев, где важны миллисекунды при старте контейнера или функции. 

Сейчас проект заморожен.

Wasm3

Минималистичный интерпретатор WebAssembly. Его основная цель — работать там, где нет ресурсов для тяжёлых runtime. Часто используется в программах, которые работают внутри устройств и микроконтроллеров. Например, в Arduino.

WAMR

Среда выполнения WAMR (WebAssembly Micro Runtime) ориентирована на интернет вещей и встраиваемые системы. Она поддерживает как интерпретацию, так и компиляцию. Это компромисс между производительностью и минимальным потреблением памяти.

Wasmer

Универсальная среда выполнения, работающая на разных ОС и архитектурах. Поддерживает плагины, WASI и разные движки исполнения.

Wasmer часто используют как рантайм по умолчанию для экспериментов и продакшена.

Ищете работу в IT?

Карьерный навигатор Практикума разберёт ваше резюме, проложит маршрут к первому работодателю, подготовит к собеседованиям в 2026 году, а с января начнёт подбирать вакансии именно под вас.

Как выбрать подходящую среду выполнения

Видов runtime много, поэтому логично понять, как именно выбрать среду выполнения, которая подойдёт под конкретный проект.

Важные факторы при выборе

Сначала нужно ответить на вопрос, где будет запускаться Wasm-код — сервер, IoT-девайс или локальная машина. От этого зависит выбор между интерпретатором и компилятором.

Требования к безопасности и наличие активного сообщества тоже важны. Чем больше сообщество пользователей, тем выше шанс найти ответ на проблему или вопрос при работе, когда они появятся.

Тестирование производительности

Производительность WebAssembly зависит не только от runtime, но и от того, как скомпилирован код. Один и тот же файл .wasm может показывать разные результаты в разных средах.

Лучший способ узнать производительность — писать небольшие программы-бенчмарки под реальные задачи и тестировать их в нескольких runtime.

Тестирование энергопотребления

Для мобильных и IoT-устройств энергопотребление критично. 

Интерпретаторы часто выигрывают за счёт простоты у компиляторов, даже если интерпретаторы медленнее.

Сценарии использования WebAssembly

Где сегодня применение Wasm особенно полезно в этих направлениях:

  • Веб-приложения — для сложных вычислений.
  • Периферийные вычисления (Edge Computing), где важны быстрый запуск и изоляция процессов для безопасности.
  • Интернет вещей для использования переносимого кода для разных устройств.
  • Применение в блокчейне для безопасных транзакций. Ещё Wasm позволяет не привязываться к одному языку программирования.

Это только несколько примеров. В следующий раз попробуем написать одну и ту же программу на разных языках, запустить её через WebAssembly и посмотреть на результат.

Получите ИТ-профессию
В «Яндекс Практикуме» можно стать разработчиком, тестировщиком, аналитиком и менеджером цифровых продуктов. Первая часть обучения всегда бесплатная, чтобы попробовать и найти то, что вам по душе. Дальше — программы трудоустройства.
Получите ИТ-профессию Получите ИТ-профессию Получите ИТ-профессию Получите ИТ-профессию
Вам может быть интересно
medium