Прошло 10 лет с тех пор, как Mozilla, Microsoft, Apple и Google анонсировали WebAssembly (Wasm) как совместную работу. Тогда цель казалась ясной: создать низкоуровневый формат двоичных инструкций для компиляции старых, не веб-языков для запуска в браузере.
Его использование вышло за пределы этой первоначальной цели, но Wasm предлагает гораздо больше разработчикам внешнего интерфейса. Список расширился еще больше с выходом Wasm 3 в сентябре.
The New Stack поговорил с Томасом Штайнером, инженером по связям с разработчиками в Google, о распространенных способах использования WebAssembly.
Wasm для бизнес-логики
По словам Штайнера, одним из наиболее популярных способов использования приложений является написание бизнес-логики для приложения и последующее использование этого кода на разных платформах с помощью WebAssembly.
«Это обычная ситуация, когда люди передают бизнес-логику модулю WebAssembly, а затем извлекают этот модуль из различных контекстов, которые могут быть веб-приложениями, собственными приложениями, а некоторые даже используют [applications on] на стороне сервера, — рассказал Штайнер The New Stack. — Если у вас есть логика, работающая на сервере, которому не обязательно нужен интерфейс, вы также можете использовать там WebAssembly».
Он указал на Snapchat, который, по его словам, имеет более или менее одинаковое приложение на веб-платформах и на мобильных платформах. Вместо того, чтобы перекодировать бизнес-логику для каждой платформы, Snapchat пишет бизнес-логику на одном языке, а затем переводит ее в WebAssembly.
«WebAssembly можно запускать как в Интернете, так и на собственных платформах», — сказал он. «Они могут использовать одну и ту же бизнес-логику в разных контекстах, что позволяет сэкономить массу усилий по разработке».
JavaScript и веб-сборка
По словам Штайнера, во многих случаях WebAssembly может работать быстрее, чем код JavaScript. Например, задачи, требующие большого объема вычислений, могут выполняться быстрее внутри WebAssembly.
Его также можно использовать для решения проблем с расстановкой переносов. JavaScript не допускает расстановки переносов в именах переменных и функций. Для некоторых языков — например, английского и немецкого — браузер уже умеет расставлять переносы.
«Мы видим, что одна вещь, которая используется довольно часто, — это расстановка переносов», — сказал он. «Есть некоторые языки, в которых браузер не знает правил расстановки переносов».
Когда эти правила реализованы в библиотеках и разработчик хочет отображать на веб-странице строки, написанные на неподдерживаемом языке, он может расставить переносы в модуле WebAssembly, а затем просто вывести текст с переносами на веб-страницу.
«Вы вводите текст, который хотите расставить через переносы. Модуль WebAssembly выполняет свою логику, сообщает вам, где он будет разделять слова и так далее, а затем вы берете их и отображаете на экране», — сказал он. «Это распространенный пример».
Другой распространенный вариант использования WebAssembly — криптография, если вам нужно что-то зашифровать или расшифровать. Он добавил, что его можно использовать для реализации функций, которые уже реализованы где-то еще.
«Я, например, поддерживаю библиотеку, которая преобразует растровые изображения в векторные», — сказал он. «Вы можете себе представить, что это относительно дорогостоящая операция, поэтому с помощью WebAssembly мы можем передать затраты на обработку на сборку. [and] заставьте его запускаться в отдельном потоке в браузере».
Это позволяет разработчикам иметь полностью интерактивный интерфейс, который в то же время выполняет очень ресурсоемкие задания в фоновом режиме.
Новый подход к строкам JavaScript
Wasm 3 предлагает более эффективный способ обработки строк JavaScript. Мы спросили Штайнера о значении этого изменения.
«Основная идея этой функции заключается в том, что у вас есть язык JavaScript, который уже имеет встроенные функции, например, для работы со строками», — сказал он.
Одним из примеров является обработка строк Unicode, которая довольно сложна. Такая функция уже реализована в языке JavaScript, но если разработчик захочет использовать ее в WebAssembly, ему нужно будет скомпилировать код для этого и превратить его в WebAssembly.
Новый метод предоставляет более простой вариант.
«Вы можете просто позаимствовать реализацию, которая уже существует в мире JavaScript, импортировать ее в WebAssembly, сделать ее оттуда пригодной для использования и избавить себя от выполнения некоторых работ по компиляции, которые уже существуют на хост-языке, например, в данном случае, в JavaScript», — сказал он.
Новая функция создает механизм, который позволяет модулю Wasm просто вызывать или напрямую импортировать существующую встроенную строковую функцию JavaScript.
Новые языки благодаря сбору мусора
Благодаря сентябрьскому обновлению Wasm 3, включающему сборку мусора, в большее количество языков более высокого уровня добавлена поддержка WebAssembly. Согласно блогу WebAssembly.org, сообщающему об улучшении, Java, OCaml, Scala, Kotlin, Scheme и Dart — это лишь некоторые из языков, которые теперь предназначены для компиляции Wasm.
В Wasm 3 команда WebAssembly добавила поддержку новой отдельной формы хранилища, которая автоматически управляется средой выполнения Wasm через сборщик мусора. Поскольку Wasm является языком низкого уровня, Wasm GC добавляет в Wasm низкоуровневые примитивы, что позволяет компиляторам легче ориентироваться на Wasm для языков со сборкой мусора.
«Он может объявлять структуру памяти своих структур данных во время выполнения с точки зрения типов структур и массивов, а также неупакованных целых чисел с тегами, распределение которых и время жизни затем обрабатываются Wasm. Но это все», — говорится в сообщении в блоге Wasm. «Все остальное, например разработка подходящих представлений для значений исходного языка, включая детали реализации, такие как таблицы методов, остается обязанностью компиляторов, ориентированных на Wasm».
Это означает, что никакие встроенные объектные системы, замыкания или другие конструкции более высокого уровня, которые добавлены в сообщении, «неизбежно будут сильно предвзято относиться к конкретным языкам».
«Вместо этого Wasm предоставляет только базовые строительные блоки для представления таких конструкций и фокусируется исключительно на аспекте управления памятью», — отмечается в сообщении.
Wasm, бессерверное управление и освобождение серверной части
Его также можно использовать для поддержки бессерверных функций во внешнем интерфейсе, хотя Штайнер отметил, что термин «бессерверный» — неправильное название.
«Конечно, сервер есть, но идея в том, что сервер не работает постоянно», — сказал он.
Разработчики напишут свою бизнес-логику, и среда выполнения WebAssembly (которая запускается на сервере) быстро запустится, обработает запрос, а затем снова перейдет в режим сна, сказал он.
«WebAssembly обладает множеством уникальных функций, которые позволяют очень быстро разворачиваться в таких контекстах», — сказал Штайнер. «Вот почему в экосистеме WebAssembly многие стартапы также работают над поддержкой WebAssembly на сервере».
Fastly — одна из таких компаний, добавил он. Fastly — это периферийная облачная платформа, предлагающая сеть доставки контента (CDN). Он добавил, что высокопроизводительный веб-сервер с открытым исходным кодом Nginx также поддерживает Wasm на сервере.
«Существует целый стек сервисов, который запускает все на сервере в WebAssembly», — продолжил он. Это позволяет разработчикам легко переключать поставщика серверной части, поэтому разработчик не привязан к определенному стеку серверных технологий.
«Пока ваш стек поддерживает WebAssembly, все, что находится за пределами среды выполнения WebAssembly, вам не о чем беспокоиться», — сказал он.
Инструменты для компиляции Wasm
Если вы видите применение Wasm, которое может подойти для вашего приложения, вот несколько вариантов компиляции в WebAssembly.
Одним из самых популярных инструментов является Эмскрипты. Первоначально предназначенный для переноса видеоигр — в частности, шутера от первого лица под названием «Sauerbraten» (или «Syntensity» в сети) — написанного на C и C++ в браузер, Emscripten был создан Алоном Закаи, бывшим инженером Mozilla, который сейчас работает в Google. Это открытый исходный код как под лицензией MIT, так и под лицензией открытого исходного кода Университета Иллинойса / NCSA. Он использует как Binaryen, так и является компилятором на основе LLVM/Clang.
ЛЛВМ может использоваться для компиляции в WebAssembly для серверной части и оптимизации. Согласно вводному курсу KodeKloud Notes по Wasm, он поддерживает интерфейсы для C, C++ и Rust, используя расширенный анализ и этапы преобразования.
Бинариен По словам KodeKloud, позволяет разработчикам собирать, оптимизировать и преобразовывать двоичные файлы Wasm, что делает его идеальным для минимизации размера кода и точной настройки низкоуровневой производительности.
Васм-пак может компилировать, тестировать и публиковать пакеты Wasm на основе Rust в npm.
Ассемблерскрипт предоставляет синтаксис с привкусом TypeScript, который компилируется непосредственно в Wasm. По словам KodeKloud, он предоставляет специфичные для WebAssembly типы (например, i32, f64) для предсказуемой производительности.
ТЕНДЕНЦИОННЫЕ ИСТОРИИ YOUTUBE.COM/THENEWSTACK Технологии развиваются быстро, не пропустите ни одной серии. Подпишитесь на наш канал YouTube, чтобы смотреть все наши подкасты, интервью, демонстрации и многое другое. ПОДПИСАТЬСЯ Группа, созданная в Sketch. Лорейн Лоусон — опытный репортер в области технологий, которая в течение 25 лет освещала технологические вопросы, от интеграции данных до безопасности. До прихода в The New Stack она работала редактором сайта банковских технологий Bank Automation News. У нее есть… Подробнее от Лорейн Лоусон.