Представлен выпуск проекта Wasmer 5.0, развивающего runtime для выполнения модулей WebAssembly, который можно использовать для создания универсальных приложений, способных выполняться в разных операционных системах. Wasmer также можно применять для изолированного выполнения не заслуживающих доверия блоков кода в составе обычных приложений. Код проекта написан на языке Rust и распространяется под лицензией MIT.
Возможность запуска одного приложения на разных платформах реализована через компиляцию в низкоуровневый промежуточный код WebAssembly, который может запускаться в любых ОС или встраиваться в программы на других языках программирования. Программы представляют собой легковесные контейнеры, в которых выполняется псевдокод WebAssembly. Данные контейнеры не привязаны к операционной системе и могут включать код, изначально написанный на любом языке программирования.
Для для выполнения промежуточного кода WebAssembly или его трансляции в машинный код целевой платформы предлагаются разные бэкенды:
- Бэкенд на базе компилятора Singlepass, оптимальный для использования в блокчейнах.
- Бэкенд на базе генератора кода Cranelift, оптимальный для использования в процессе разработки.
- Бэкенд на базе компилятора LLVM, оптимальный для использования в рабочих внедрениях.
- Бэкенд для запуска в web-браузере.
- Бэкенд на базе JavaScript-движка JavascriptCore, оптимальный для использования на платформе macOS.
- Бэкенд на базе JavaScript-движка V8, оптимальный для приложений для платформ iOS и Android.
- Бэкенд на базе интерпретатора Wasmi, оптимальный для блокчейнов и Rust-проектов, не использующих стандартную библиотеку (nostd).
- Бэкенд на базе runtime WAMR, оптимальный для платфлормы iOS
Приложения изолируются от основной системы в sandbox-окружении и имеют доступ только к заявленной функциональности. Для изоляции применяется механизм на основе управления возможностями – для действий с каждым из ресурсов (файлы, каталоги, сокеты, системные вызовы и т.п.) приложению должны быть даны соответствующие полномочия. Управление доступом и взаимодействие с системой обеспечивается при помощи API WASI (WebAssembly System Interface), предоставляющего программные интерфейсы для работы с файлами, сокетами и другими системными функциями.
Платформа позволяет добиться производительности выполнения приложений, близкой к выполнению родных сборок. При помощи Native Object Engine для WebAssembly-модуля можно сгенерировать машинный код, для запуска которого требуется минимальный runtime, но сохраняются все возможности sandbox-изоляции. Возможна поставка предкомпилированных программ со встроенным Wasmer. Для создания надстроек и дополнений предлагаются Rust API и Wasm-C-API.
Для запуска WebAssembly-контейнера достаточно установить в системе runtime Wasmer, который поставляется без внешних зависимостей (“curl https://get.wasmer.io -sSfL | sh”), и запустить необходимый файл (“wasmer test.wasm”). Программы распространяются в форме обычных WebAssembly-модулей, для управления которыми можно использовать пакетный менеджер WAPM. Wasmer также доступен в форме библиотеки, которую можно использовать для встраивания кода WebAssembly в программы на языках Rust, С/C++, C#, D, Python, JavaScript, Go, PHP, Ruby, Elixir и Java.
Основные новшества Wasmer 5.0:
- Реализована возможность использования интерпретаторов WebAssembly.
- Добавлен экспериментальный бэкенд на базе легковесного интерпретатора Wasmi, позволяющего выполнять промежуточный код WebAssembly в окружениях с ограниченными ресурсами.
- Добавлен экспериментальный бэкенд на базе WebAssembly runtime WAMR (WebAssembly Micro Runtime), оптимизированного для минимального потребления ресурсов и пригодного для применения на устройствах с небольшим объёмом оперативной памяти.
- Добавлен экспериментальный бэкенд на базе JavaScript-движка v8, используемого в браузерах на кодовой базе Chromium. Основным достоинством применения бэкенда на базе V8 называется возможность использования встроенного в данный движок отладчика и инструментария для web-разработчиков, а также доступность в V8 расширенной функциональности WebAssembly, такой как обработка исключений и сборка мусора.
- В бэкенд, использующий LLVM, добавлена экспериментальная поддержка архитектуры Loongarch64.
- Добавлена поддержка платформы iOS, доступная при использовании бэкендов WAMR, Wasmi и V8.
- Прекращена поддержка компилятора Emscripten.
- Обновлены зависимости, среди которых LLVM 18, генератор кода Cranelift 27 и фреймворк rkyv 0.8.
- Проведена оптимизация производительности. Например, при выполнении операций десериализации модулей наблюдается прирост производительности до 50%.