Как WebAssembly (WASM) меняет фронтенд-разработку

3 мин

1. «Второй язык» браузера

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

WebAssembly, или WASM, появился именно для того, чтобы преодолеть это ограничение. Он не должен заменить JavaScript, а служит мощным дополнением, которое приносит Web-платформе невиданную прежде производительность и новые возможности.

2. Что такое WebAssembly?

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

Вместо этого он создан как цель компиляции для языков высокого уровня — C, C++, Rust, Go и других. Код можно написать на одном из этих производительных языков, скомпилировать в файл .wasm и выполнять в браузере со скоростью, близкой к нативной.

Ключевые положения:

  • Это не замена JavaScript: WASM и JavaScript работают вместе.
  • Это цель компиляции: вы пишете на C++ или Rust и компилируете код в WASM.
  • Он быстр, эффективен и переносим: производительность заложена в его основу с самого начала.

3. Как взаимодействуют JavaScript и WASM

Модуль WASM работает в изолированной среде. Он не может напрямую обращаться к DOM, вызывать Web API или отправлять сетевые запросы. Посредником для всех этих действий служит JavaScript — своего рода связующий слой.

Типичная схема взаимодействия выглядит так:

  1. JavaScript отвечает за координацию: JS-код управляет общей логикой приложения, обрабатывает пользовательские события и обновляет DOM.
  2. WASM отвечает за вычисления: когда возникает ресурсоёмкая вычислительная задача, JS вызывает функции, экспортированные из модуля .wasm.
  3. Обмен данными: JS и WASM могут эффективно обмениваться данными — прежде всего числами и блоками линейной памяти.

JavaScript можно представить как «руководителя», а WebAssembly — как «инженера-эксперта». Руководитель общается и координирует работу, а инженер решает самые трудные технические задачи.

4. Примеры применения в реальном мире

WASM уже перестал быть экспериментальной технологией. Многие ведущие Web-приложения используют его для своих основных функций:

  • Figma: основной движок рендеринга этого популярного онлайн-инструмента для дизайна написан на C++ и скомпилирован в WASM, что обеспечивает плавное редактирование графики.
  • Adobe Photoshop & Lightroom: с помощью WASM компания Adobe успешно перенесла в Web ядро своих флагманских настольных приложений, написанное на C++, и дала возможность пользоваться мощными функциями Photoshop в браузере.
  • Google Earth: новая версия Google Earth полностью работает в браузере, а сложный рендеринг трёхмерного земного шара обеспечивает WASM.
  • AutoCAD Web App: Autodesk скомпилировала свой крупный CAD-движок на C++ в WASM, благодаря чему полноценный AutoCAD может работать в браузере.

Эти примеры доказывают, что WASM уже способен переносить на Web-платформу сложные программы, которые раньше считались возможными только в виде настольных приложений.

5. Будущее: WASI и мир за пределами браузера

Амбиции WASM не ограничиваются браузером. WASI (WebAssembly System Interface) — развивающийся стандарт, цель которого состоит в том, чтобы предоставить WASM единый набор системных API, например доступ к файловой системе и сети.

Это означает, что в будущем файлы .wasm могут стать универсальным, кроссплатформенным и безопасным двоичным форматом, способным работать где угодно: на серверах, где он может составить конкуренцию Docker, на узлах периферийных вычислений и в устройствах Интернета вещей. Так действительно воплотится принцип «скомпилировать один раз, запускать везде».

Заключение

WebAssembly глубоко меняет наше представление о границах возможностей Web-приложений. JavaScript может сосредоточиться на том, что умеет лучше всего, — взаимодействии с интерфейсом и координации логики приложения, а потолок производительности берут на себя модули WASM, скомпилированные из системных языков вроде Rust и C++. Для фронтенд-разработчика понимание возможностей WASM и подходящих сценариев его применения станет ключом к созданию следующего поколения высокопроизводительных Web-приложений.