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», которая позволяет выполнять векторные операции над несколькими данными одновременно, что особенно важно для игр и научных расчётов.
Источники
- Спецификация WebAssembly Core Specification, W3C Recommendation, 2019.
- Документация проекта WebAssembly, официальный сайт webassembly.org.
- Статья «WebAssembly: A New Hope» на Mozilla Hacks, 2015.
- Исследование производительности WebAssembly, Google Chrome Team, 2017.
- Стандарт WebAssembly System Interface (WASI), проект на GitHub.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →