WASI
WASI (WebAssembly System Interface) — это системный интерфейс (API) и набор стандартов, предназначенный для выполнения кода, скомпилированного в формат WebAssembly (Wasm), в средах, отличных от веб-браузера. WASI предоставляет абстрактный слой взаимодействия с операционной системой, позволяя программам на WebAssembly получать доступ к таким ресурсам, как файловая система, сеть, часы и случайные числа, при этом сохраняя высокий уровень безопасности и изолированности (песочница). Разработка WASI ведётся под эгидой организации Bytecode Alliance, в которую входят такие компании, как Mozilla, Fastly, Intel и Red Hat.
История
Предпосылкой к созданию WASI стало развитие WebAssembly как переносимого формата байт-кода. Первоначально WebAssembly был ориентирован на выполнение в браузерах, где он взаимодействовал с окружением через JavaScript API. Однако к 2019 году стало очевидно, что потенциал WebAssembly выходит за рамки веба: его можно использовать для серверных вычислений, контейнеризации, плагинов и edge-вычислений. Для этого требовался стандартизированный интерфейс, который бы позволил программам на Wasm безопасно взаимодействовать с хост-системой.
В апреле 2019 года на конференции Wasm Community Group в Париже представители Mozilla и Fastly впервые публично представили концепцию WASI. Изначально проект назывался «WebAssembly System Interface» и позиционировался как «POSIX для WebAssembly». В 2020 году был выпущен черновик спецификации WASI 0.1 (snapshot), который включал базовые возможности: работу с файлами, ввод-вывод, аргументы командной строки и переменные окружения. В 2021 году вышла версия WASI 0.2 (preview), которая значительно расширила функциональность, добавив поддержку асинхронных операций, сетевых сокетов и криптографических функций.
В 2022 году Bytecode Alliance объявил о начале работы над WASI 0.3 (preview), которая должна стать основой для стабильного релиза. Ключевым изменением в этой версии стало введение «компонентной модели» (Component Model), позволяющей модулям WebAssembly обмениваться данными и вызывать функции друг друга без привязки к конкретному языку программирования.
Архитектура и принципы работы
WASI реализует концепцию «капабилити-ориентированного проектирования» (capability-based security). В отличие от традиционных системных вызовов, где программа может запросить любой ресурс (например, открыть любой файл), в WASI программа получает только те возможности, которые ей явно предоставила хост-система. Это достигается через механизм «дескрипторов возможностей» (capability handles). Например, если программа хочет работать с файлом, ей должен быть передан дескриптор, указывающий на конкретный файл или директорию. Без такого дескриптора доступ к файловой системе невозможен.
Основные компоненты WASI:
- Модули — скомпилированные в формат WebAssembly программы, которые могут быть загружены и выполнены в среде WASI.
- Хост-среда — программа (например, рантайм Wasmtime или WasmEdge), которая загружает модули и предоставляет им доступ к системным ресурсам через WASI.
- Дескрипторы — абстрактные ссылки на ресурсы (файлы, сокеты, таймеры), которые передаются модулю.
- Системные вызовы — функции, которые модуль может вызывать для взаимодействия с хост-средой (например,
fd_read,fd_write,clock_time_get).
Безопасность
WASI обеспечивает изоляцию на уровне операционной системы: модули выполняются в песочнице, не имея доступа к памяти других процессов, к ядру ОС или к неразрешённым ресурсам. Это делает WASI привлекательным для выполнения непроверенного кода (например, плагинов в браузере или серверных приложений). В отличие от контейнеров Docker, которые используют виртуализацию на уровне ядра, WASI работает на уровне пользовательского пространства, что снижает накладные расходы.
Версии и стандарты
WASI 0.1 (snapshot)
- Базовая поддержка файлового ввода-вывода.
- Работа с аргументами командной строки и переменными окружения.
- Функции для работы с часами (время, таймеры).
- Ограниченная поддержка случайных чисел.
WASI 0.2 (preview)
- Добавлена поддержка асинхронных операций (через механизм
poll). - Введены сетевые сокеты (TCP/UDP).
- Реализована криптографическая подсистема (хэши, подписи, шифрование).
- Улучшена работа с файловой системой (поддержка символических ссылок, прав доступа).
WASI 0.3 (preview, в разработке)
- Внедрение компонентной модели (Component Model) для модульного взаимодействия.
- Унификация интерфейсов для разных языков программирования.
- Поддержка многопоточности (через модель
shared memory). - Улучшенная обработка ошибок и типизация.
Применение
Серверные вычисления и edge-вычисления
WASI активно используется в edge-сетях (например, Cloudflare Workers, Fastly Compute@Edge, Fly.io). Программы на WebAssembly с WASI могут выполняться на границе сети, обрабатывая запросы с минимальной задержкой. Это позволяет разработчикам писать логику на любом языке, поддерживающем компиляцию в WebAssembly (Rust, C, C++, Go, Zig, AssemblyScript), и запускать её в изолированной среде.
Контейнеризация и микросервисы
WASI рассматривается как альтернатива традиционным контейнерам (Docker) для микросервисов. Преимущества: меньший размер образов (несколько килобайт вместо десятков мегабайт), более быстрый запуск (миллисекунды), повышенная безопасность за счёт изоляции. Однако WASI пока не поддерживает все возможности POSIX (например, fork, сигналы, потоки), что ограничивает его применение для сложных приложений.
Плагины и расширения
Многие приложения (например, текстовые редакторы, игры, базы данных) используют WASI для выполнения пользовательских плагинов. Примеры:
- Envoy — прокси-сервер, поддерживающий WASI-фильтры.
- Unity — игровой движок, использующий WebAssembly с WASI для пользовательских скриптов.
- SQLite — база данных, поддерживающая загрузку расширений в формате WebAssembly.
Научные вычисления и IoT
WASI применяется в ресурсо-ограниченных средах, таких как микроконтроллеры и устройства Интернета вещей (IoT). Благодаря малому размеру и низкому энергопотреблению, WebAssembly с WASI может выполняться на устройствах с ограниченной памятью и процессорной мощностью.
Инструменты и рантаймы
Для выполнения WASI-программ разработано несколько рантаймов:
- Wasmtime — основной рантайм от Bytecode Alliance, написанный на Rust. Поддерживает WASI 0.1 и 0.2.
- WasmEdge — рантайм, ориентированный на облачные и edge-вычисления. Поддерживает WASI 0.1 и частично 0.2.
- Wasm3 — лёгкий интерпретатор, работающий на микроконтроллерах.
- Lucet — рантайм от Fastly, используемый в edge-сети.
- WAMR (WebAssembly Micro Runtime) — рантайм для встраиваемых систем.
Для компиляции кода в WASI используются стандартные инструменты WebAssembly:
- Rust — компилятор
rustcс цельюwasm32-wasi. - C/C++ — компилятор Clang с целью
wasm32-wasi. - Go — компилятор
goс цельюjs/wasm(ограниченная поддержка WASI). - Zig — нативная поддержка WASI.
Критика и ограничения
Несмотря на преимущества, WASI имеет ряд ограничений:
- Неполная поддержка POSIX — многие системные вызовы (например,
fork,exec,mmap) отсутствуют, что делает невозможным запуск традиционных серверных приложений (например, веб-серверов на C) без серьёзной адаптации. - Производительность — хотя WebAssembly близок к нативной скорости, изоляция и проверка типов могут приводить к накладным расходам (до 10-20% по сравнению с нативным кодом).
- Сложность отладки — из-за абстракции и отсутствия прямого доступа к ОС отладка WASI-программ может быть затруднена.
- Экосистема — количество библиотек и инструментов, поддерживающих WASI, пока значительно меньше, чем для нативных платформ.
Перспективы
Развитие WASI направлено на расширение функциональности и повышение совместимости с существующими системами. В 2024-2025 годах ожидается стабилизация спецификации WASI 0.3, которая должна обеспечить полную поддержку многопоточности, асинхронного ввода-вывода и сетевых протоколов. Также ведётся работа над интеграцией WASI с операционными системами (например, Linux через модуль ядра wasm). В перспективе WASI может стать основой для новой модели облачных вычислений, где приложения будут распространяться в виде компактных, безопасных и переносимых модулей.
Источники
- Bytecode Alliance. «WASI Specification». GitHub, 2023.
- Lin Clark. «Standardizing WASI: A system interface for running WebAssembly outside the web». Mozilla Hacks, 2019.
- Fastly. «WASI: WebAssembly System Interface». Fastly Blog, 2020.
- The WebAssembly Community Group. «WASI Overview». W3C, 2022.
- Ralph Squillace. «WASI: The WebAssembly System Interface». Microsoft Research, 2021.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →