Открыть сервис

WebAssembly

WebAssembly (сокращённо Wasm) — это низкоуровневый бинарный формат инструкций, предназначенный для выполнения в веб-браузерах и других средах. Он представляет собой переносимую виртуальную машину, которая обеспечивает выполнение кода с производительностью, близкой к нативной, и поддерживается всеми основными современными браузерами. WebAssembly разработан как цель компиляции для языков программирования высокого уровня, таких как C, C++, Rust, Go и других, позволяя запускать в браузере приложения, ранее доступные только в виде нативных исполняемых файлов.

История

Предпосылки создания

К началу 2010-х годов JavaScript стал единственным языком программирования, поддерживаемым всеми веб-браузерами для выполнения клиентского кода. Однако JavaScript, будучи интерпретируемым и динамически типизированным языком, имел ограничения по производительности для ресурсоёмких задач, таких как обработка видео, 3D-графика, научные вычисления и игры. Попытки улучшить ситуацию включали такие технологии, как Google Native Client (NaCl) и PNaCl (Portable Native Client), которые позволяли запускать нативный код в браузере, но были привязаны к платформе Google Chrome и не получили широкого распространения.

Разработка и анонс

В 2015 году команда инженеров из Mozilla, Google, Microsoft и Apple начала совместную работу над новым стандартом, который получил название WebAssembly. Проект был анонсирован в 2015 году на конференции JSConf.US. Основной целью было создание безопасного, эффективного и переносимого формата, который мог бы стать «вторым языком» для веба, дополняющим JavaScript.

Первый релиз и стандартизация

Первая рабочая версия WebAssembly была выпущена в марте 2017 года. В том же году все основные браузеры (Chrome, Firefox, Safari, Edge) включили поддержку Wasm по умолчанию. В декабре 2019 года консорциум W3C утвердил WebAssembly как официальный веб-стандарт (рекомендацию W3C). С этого момента началась активная фаза внедрения технологии.

Развитие после стандартизации

После стандартизации разработка WebAssembly продолжилась. Были добавлены новые возможности: многопоточность (Threads), поддержка сборки мусора (GC), интерфейс для работы с SIMD-инструкциями (Single Instruction, Multiple Data) и другие. В 2022 году был анонсирован проект «WebAssembly System Interface» (WASI), который позволяет запускать Wasm-модули вне браузера, на серверах, в облачных средах и на встраиваемых устройствах.

Архитектура и принцип работы

Бинарный формат

WebAssembly использует компактный бинарный формат (расширение файла .wasm), который оптимизирован для быстрой загрузки и декодирования. В отличие от текстового JavaScript, Wasm не требует парсинга и интерпретации — он загружается в виртуальную машину браузера и компилируется в нативный машинный код на лету (JIT-компиляция) или заранее (AOT-компиляция).

Виртуальная машина

WebAssembly работает в изолированной виртуальной машине (sandbox). Это означает, что код Wasm не имеет прямого доступа к памяти операционной системы, файловой системе или сети. Всё взаимодействие с внешним миром происходит через импортируемые функции, предоставляемые хост-средой (например, браузером). Это обеспечивает высокий уровень безопасности, сравнимый с JavaScript.

Типы данных и память

WebAssembly оперирует только четырьмя числовыми типами: 32- и 64-битные целые числа (i32, i64) и 32- и 64-битные числа с плавающей запятой (f32, f64). Строки, объекты и другие сложные типы данных отсутствуют. Для хранения данных используется линейная память — непрерывный массив байтов, доступный для чтения и записи. Управление памятью (выделение и освобождение) возлагается на код, скомпилированный в Wasm, или на внешнюю библиотеку.

Интерфейс с JavaScript

WebAssembly-модули не могут самостоятельно взаимодействовать с DOM (Document Object Model) или другими API браузера. Для этого используется JavaScript как «клей»: JavaScript-код загружает Wasm-модуль, вызывает его функции и передаёт данные. В ответ Wasm может вызывать JavaScript-функции, которые были импортированы в модуль. Этот механизм позволяет интегрировать высокопроизводительные вычисления Wasm с гибкостью JavaScript.

Применение

Веб-приложения

Основная область применения WebAssembly — веб-приложения, требующие высокой производительности:

  • Игры: движки на C++ (например, Unity, Unreal Engine) компилируются в Wasm, что позволяет запускать 3D-игры в браузере без установки плагинов.
  • Обработка медиа: кодеки для видео и аудио, библиотеки для обработки изображений (например, фоторедакторы) работают быстрее на Wasm.
  • Научные и инженерные расчёты: симуляции, математические вычисления, обработка больших данных.
  • Криптография: выполнение криптографических алгоритмов с производительностью, близкой к нативной.

Серверные и облачные среды

С появлением WASI WebAssembly начал использоваться вне браузера:

  • Бессерверные вычисления (Serverless): Wasm-модули могут запускаться в облачных функциях (например, AWS Lambda, Cloudflare Workers) с быстрым холодным стартом и низким потреблением ресурсов.
  • Микросервисы: лёгкие изолированные модули для выполнения отдельных задач.
  • Контейнеризация: Wasm рассматривается как альтернатива контейнерам Docker для некоторых сценариев, особенно на встраиваемых устройствах.

Встраиваемые системы и IoT

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

Преимущества и недостатки

Преимущества

  • Высокая производительность: код на Wasm выполняется в 1,5–2 раза быстрее эквивалентного JavaScript для вычислительных задач.
  • Переносимость: один и тот же бинарный файл работает в любом браузере и на любой платформе, поддерживающей Wasm.
  • Безопасность: изолированная среда исполнения предотвращает несанкционированный доступ к системе.
  • Малый размер: бинарный формат значительно компактнее текстового JavaScript.
  • Поддержка множества языков: разработчики могут писать на C, C++, Rust, Go, Python (через компиляцию) и других языках.

Недостатки

  • Ограниченный доступ к API: Wasm не может напрямую работать с DOM, что требует дополнительного JavaScript-кода.
  • Сложность отладки: отладка скомпилированного бинарного кода сложнее, чем отладка JavaScript.
  • Отсутствие прямого доступа к памяти: для работы со сложными структурами данных требуется ручное управление памятью.
  • Не подходит для всех задач: для простых веб-страниц или приложений с интенсивным DOM-взаимодействием JavaScript остаётся более эффективным.

Примеры использования

  • Google Earth: веб-версия Google Earth использует WebAssembly для рендеринга 3D-карт.
  • AutoCAD Web: популярная САПР-система была портирована в браузер с помощью Wasm.
  • FFmpeg.wasm: библиотека для обработки видео и аудио, работающая в браузере.
  • TensorFlow.js: часть вычислительных операций выполняется через WebAssembly для ускорения машинного обучения.

Интересные факты

  • WebAssembly не является заменой JavaScript — оба языка дополняют друг друга. JavaScript остаётся основным языком для логики интерфейса, а Wasm берёт на себя ресурсоёмкие вычисления.
  • Формат Wasm может быть представлен не только в бинарном, но и в текстовом виде (расширение .wat) для чтения и отладки человеком.
  • В 2021 году была выпущена спецификация «WebAssembly SIMD», которая позволяет выполнять векторные операции над несколькими данными одновременно, что особенно важно для игр и научных расчётов.

Источники

  1. Спецификация WebAssembly Core Specification, W3C Recommendation, 2019.
  2. Документация проекта WebAssembly, официальный сайт webassembly.org.
  3. Статья «WebAssembly: A New Hope» на Mozilla Hacks, 2015.
  4. Исследование производительности WebAssembly, Google Chrome Team, 2017.
  5. Стандарт WebAssembly System Interface (WASI), проект на GitHub.

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →