Что такое WebAssembly
Знакомимся с WebAssembly: что это, откуда взялось и зачем нужно.
WebAssembly (Wasm) — это компактный портируемый формат байткода и виртуальная машина для его выполнения, дающие почти нативную скорость в браузере и на сервере.
Простыми словами
Долгие годы единственным языком, который понимал браузер, был JavaScript. Это удобно для интерфейсов, но плохо подходит для тяжёлых вычислений: видеомонтаж, 3D-игры, симуляции физики, обработка фотографий. JavaScript — динамический интерпретируемый язык, и хотя современные движки очень умны, у них есть потолок предсказуемости: одна и та же функция может то ускоряться, то замедляться в зависимости от того, какие данные в неё попали.
WebAssembly решает другую задачу. Это не язык, на котором вы пишете руками каждый день, а цель компиляции. Вы берёте программу на C, C++, Rust или Go, прогоняете через компилятор — и получаете модуль .wasm: компактный бинарный файл с инструкциями для стековой виртуальной машины. Браузер (или серверный рантайм) загружает этот модуль и исполняет его почти на скорости нативного машинного кода.
Аналогия
Представьте, что JavaScript — это живой переводчик, который слушает вашу речь и на лету переводит её собеседнику. Он гибкий, но каждое предложение обрабатывает заново. WebAssembly — это заранее напечатанная и заверенная книга на языке собеседника: её не нужно переводить в момент чтения, она уже готова к исполнению. Разница в том, что одно создаётся для гибкости, другое — для скорости и предсказуемости.
Откуда взялся Wasm
До Wasm были попытки ускорить веб тяжёлым кодом: Java-апплеты, Flash, Google Native Client (NaCl), asm.js. Все они либо были небезопасны, либо привязаны к одному вендору, либо медленно грузились. В 2015 году крупные браузерные команды (Google, Mozilla, Microsoft, Apple) объединились и согласовали единый стандарт. В 2017 году WebAssembly заработал во всех основных браузерах, а в 2019 стал официальной рекомендацией W3C — четвёртым «родным» языком веба после HTML, CSS и JavaScript.
Что важно понять сразу
- Wasm — это байткод, а не язык исходного кода. Люди обычно не пишут его руками (хотя умеют — об этом весь курс).
- У Wasm есть бинарный формат (что грузит браузер) и текстовый формат WAT (что читают люди).
- Wasm не заменяет JavaScript: он работает вместе с ним. JS управляет страницей и DOM, Wasm считает тяжёлое.
- Wasm не привязан к браузеру: тот же модуль можно запустить на сервере, на edge-узле или в CLI.
Как работает под капотом
Браузер получает .wasm-файл и не интерпретирует его построчно, как раньше делал с JavaScript. Вместо этого он быстро проверяет (валидирует) модуль на корректность типов, а затем компилирует его в настоящий машинный код процессора. Поскольку формат Wasm спроектирован близко к тому, как работают реальные процессоры (целые числа, числа с плавающей точкой, стек, линейная память), эта компиляция проста и быстра. Результат — код, который выполняется со скоростью, близкой к программе, скомпилированной обычным C-компилятором.
Частые ошибки в понимании
- «Wasm убьёт JavaScript» — нет. Wasm пока даже не имеет прямого доступа к DOM и сети, он зовёт JS для этого. Это инструменты для разных задач.
- «Wasm всегда быстрее JS» — не всегда. Для коротких операций накладные расходы на переход между мирами могут съесть выигрыш. Wasm побеждает на длинных вычислениях.
- «Wasm — это про веб» — изначально да, но сегодня Wasm активно живёт на серверах, в serverless и как формат плагинов.
Итоги
- WebAssembly — портируемый бинарный байткод с почти нативной скоростью.
- Это цель компиляции для C/C++/Rust/Go, а не повседневный язык.
- Он дополняет JavaScript, а не заменяет его.
- Стандарт W3C, работает во всех браузерах и за их пределами.