Что такое веб-сборка? Объяснение веб-платформы следующего поколения

автор vadim


В течение двух десятилетий у нас был только один язык программирования, доступный для использования в веб-браузере: JavaScript. Медленная смерть сторонних бинарных плагинов исключила другие языки, такие как Java и Flash ActionScript, как первоклассные средства веб-разработки. Другие веб-языки, такие как CoffeeScript, просто компилируются в JavaScript.

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

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

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

Разработчикам следует рассмотреть возможность использования WebAssembly для случаев использования с высокой производительностью, таких как игры, потоковая передача музыки, редактирование видео и приложения САПР. Многие веб-сервисы уже сделали этот шаг, например, Google Earth. Figma, приложение для совместного рисования и построения диаграмм, обратилось к WebAssembly, чтобы сократить время загрузки и скорость выполнения, даже когда WebAssembly был относительно новым.

Как работает WebAssembly

WebAssembly, разработанный W3C, по словам его создателей, является «целью компиляции». Разработчики не пишут WebAssembly напрямую; они пишут на языке по своему выбору, который затем компилируется в байт-код WebAssembly. Затем байт-код запускается на клиенте (обычно в веб-браузере), где он преобразуется в собственный машинный код и выполняется на высокой скорости.

Код WebAssembly должен загружаться, анализироваться и выполняться быстрее, чем JavaScript. Когда WebAssembly используется веб-браузером, по-прежнему возникают затраты на загрузку модуля Wasm и его настройку. В более крупных проектах Wasm эти модули могут занимать несколько мегабайт, поэтому задержки могут быть значительными. Но при прочих равных условиях WebAssembly работает быстрее.

WebAssembly также предоставляет модель выполнения в изолированной программной среде, основанную на тех же моделях безопасности, которые сейчас существуют для JavaScript. Приложения Wasm не могут напрямую обращаться ни к чему за пределами песочницы, включая DOM веб-страницы, на которой они работают. Любое взаимодействие с остальной частью машины должно использовать ABI, например системный интерфейс WebAssembly (WASI). WASI обеспечивает контролируемый доступ к файлам, сети, системным часам и другим системным службам, часто необходимым в программах.

На данный момент запуск WebAssembly в веб-браузерах является наиболее распространенным вариантом использования, но WebAssembly задуман как нечто большее, чем просто веб-решение. Проект Wasmer запускает приложения WebAssembly на стороне сервера, почти так же, как среда выполнения Node.js запускает JavaScript вне браузера.

Варианты использования WebAssembly

Самый простой вариант использования WebAssembly — создание программного обеспечения для браузера. Компоненты, скомпилированные в WebAssembly, могут быть написаны на любом из множества языков; окончательная полезная нагрузка WebAssembly затем доставляется клиенту через JavaScript.

WebAssembly был разработан с учетом ряда требовательных к производительности сценариев использования на основе браузера: игры, потоковая передача музыки, редактирование видео, САПР, шифрование и распознавание изображений, и это лишь некоторые из них.

В более общем плане полезно сосредоточиться на этих трех областях при определении конкретного варианта использования WebAssembly:

  • Высокопроизводительный код, который уже существует на целевом языке. Например, если у вас уже есть высокоскоростная математическая функция, написанная на C, и вы хотите включить ее в веб-приложение, вы можете развернуть ее как модуль WebAssembly. Менее критичные к производительности части приложения, ориентированные на пользователя, могут оставаться в JavaScript.
  • Высокопроизводительный код, который нужно писать с нуля, где JavaScript не идеален. Раньше для написания такого кода можно было использовать asm.js. Вы все еще можете это сделать, но WebAssembly позиционируется как лучшее долгосрочное решение.
  • Портирование десктопного приложения в веб-среду. Многие демонстрации технологий asm.js и WebAssembly попадают в эту категорию. WebAssembly может предоставить основу для более амбициозных приложений, чем просто графический интерфейс, представленный через HTML. Два примера см. в демонстрациях WebDSP и Windows 2000 в браузере.

Если у вас есть существующее приложение JavaScript, которое не требует каких-либо ограничений по производительности, на данном этапе разработки WebAssembly его лучше оставить в покое. Но если вам нужно, чтобы это приложение работало быстрее, WebAssembly может помочь.

Поддержка языка WebAssembly

WebAssembly не предназначен для написания напрямую. Как следует из названия, он больше похож на язык ассемблера, предназначенный для использования машиной, чем на высокоуровневый, дружественный к человеку язык программирования. WebAssembly ближе к промежуточному представлению (IR), создаваемому инфраструктурой компилятора языка LLVM, чем к C или Java.

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

  • Прямая компиляция. Исходный код переводится в WebAssembly с помощью собственного инструментария компилятора языка. Rust, C/C++, Kotlin/Native и D теперь имеют встроенные способы генерации Wasm из компиляторов, поддерживающих эти языки.
  • Сторонние инструменты. Язык не имеет встроенной поддержки Wasm в своей цепочке инструментов, но для преобразования в Wasm можно использовать стороннюю утилиту. Java, Lua и семейство языков .Net имеют такую ​​поддержку.
  • Интерпретатор на основе WebAssembly. Здесь сам язык не переводится в WebAssembly; скорее, интерпретатор языка, написанный на WebAssembly, запускает код, написанный на этом языке. Это наиболее громоздкий подход, поскольку интерпретатор может содержать несколько мегабайт кода, но он позволяет выполнять существующий код, написанный на этом языке, практически без изменений. У Python (например, посредством PyScript) и Ruby есть интерпретаторы, переведенные на Wasm.

Возможности веб-сборки

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

Примитивы сборки мусора

WebAssembly не поддерживает напрямую языки, использующие модели памяти со сборкой мусора. Такие языки, как Lua или Python, можно поддерживать только путем ограничения наборов функций или путем внедрения всей среды выполнения в виде исполняемого файла WebAssembly. Но ведется работа по поддержке моделей памяти со сборкой мусора независимо от языка или реализации.

Резьба

Встроенная поддержка потоков является общей для таких языков, как Rust и C++. Отсутствие поддержки потоков в WebAssembly означает, что целые классы программного обеспечения, ориентированного на WebAssembly, не могут быть написаны на этих языках. Предложение добавить потоки в WebAssembly использует модель потоков C++ в качестве одной из своих идей.

Операции с большой памятью и SIMD

Операции с большими объемами памяти и параллелизм SIMD (одна инструкция, несколько данных) необходимы для приложений, которые обрабатывают груды данных и нуждаются в собственном ускорении ЦП, чтобы избежать удушья, таких как машинное обучение или научные приложения. Рассматриваются предложения по добавлению этих возможностей в WebAssembly с помощью новых операторов.

Конструкции языка высокого уровня

Многие другие функции, рассматриваемые для WebAssembly, напрямую связаны с высокоуровневыми конструкциями на других языках.

  • Исключения можно эмулировать в WebAssembly, но нельзя реализовать изначально с помощью набора инструкций WebAssembly. Предлагаемый план исключений включает примитивы исключений, совместимые с моделью исключений C++, которые, в свою очередь, могут использоваться другими языками, скомпилированными в WebAssembly.
  • Типы ссылок упростить передачу объектов, используемых в качестве ссылок на среду хоста. Это облегчит реализацию сборки мусора и ряда других высокоуровневых функций в WebAssembly.
  • Хвостовые вызовышаблон проектирования, используемый во многих языках.
  • Функции, возвращающие несколько значенийнапример, через кортежи в Python или C#.
  • Операторы расширения знака, полезная низкоуровневая математическая операция. (LLVM также поддерживает их.)

Инструменты отладки и профилирования

Одной из самых больших проблем с транспилированным JavaScript была сложность отладки и профилирования из-за невозможности коррелировать между транспилированным кодом и исходным кодом. С WebAssembly у нас есть аналогичная проблема, и она решается аналогичным образом (поддержка карты исходного кода). См. примечание к проекту о запланированной поддержке инструментов.

Related Posts

Оставить комментарий