Wasmer 1.0, инструментарий для платформонезависимых приложений на базе WebAssembly

После двух лет разработки опубликован первый значительный выпуск проекта Wasmer, развивающего runtime для выполнения модулей WebAssembly. Из областей применения Wasmer отмечается создание универсальных приложений, способных выполняться в разных операционных системах, а также организация изолированного выполнения кода, не заслуживающего доверия. В том числе поддерживается создание серверных приложений, например, продемонстрирован запуск сервера Nginx, скомпилированного в WebAssembly. Код проекта написан на языке Rust и распространяется под лицензией MIT.

Переносимость обеспечивается благодаря компиляции кода приложения в низкоуровневый промежуточный код WebAssembly, который может запускаться в любых ОС или встраиваться в программы на других языках программирования. Программы представляют собой легковесные контейнеры, в которых выполняется псевдокод WebAssembly. Данные контейнеры не привязаны к операционной системе и могут включать приложения, изначально написанные на любом языке программировании. Для компиляции в WebAssembly может использоваться инструментарий Emscripten. Для трансляции WebAssembly в машинный код текущей платформы подключаются разные фреймворки, такие как LLVM и генератор кода Cranelift.

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

Для запуска 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 1.0 называется:

  • Высокая производительность выполняемых приложений, близкая к выполнению родных сборок, и высокая скорость компиляции.
  • Расширяемая архитектура с возможностью подключения разных бэкендов компиляции (Singlepass, Cranelift, LLVM) и движков (задействование JIT или генерация машинного кода).
  • Native Object Engine, позволяющий генерировать для WebAssembly-модуля машинный код для заданных систем («wasmer compile —native» для генерации предкомпилированных объектных файлов .so, .dylib и .dll). Для запуска предкомпилированного кода требуется минимальный runtime, но сохраняются все возможности sandbox-изоляции.
  • Headless-режим для поставки предкомпилированных программ со встроенным Wasmer.
  • Поддержка кросс-компиляции, например, позволяющая на системе x86_64 генерировать машинный код для архитектуры Aarch64.
  • Простой API для создания надстроек и дополнений, не требующий изучения расширенных концепций WebAssembly. Поддержка Wasm-C-API.
  • Средства для отладки и обработки ошибок.

Источник: http://www.opennet.ru/opennews/art.shtml?num=54363