Відбувся другий значний випуск проекту Wasmer, що розвиває runtime для виконання модулів WebAssembly, який можна використовувати для створення універсальних додатків, здатних виконуватися в різних операційних системах, а також для ізольованого виконання коду, що не заслуговує на довіру. Код проекту написаний мовою Rust та поширюється під ліцензією MIT.
Перенесення забезпечується завдяки компіляції коду програми в низькорівневий проміжний код WebAssembly, який може запускатися в будь-яких ОС або вбудовуватися в програми іншими мовами програмування. Програми є легковажними контейнерами, в яких виконується псевдокод WebAssembly. Дані контейнери не прив'язані до операційної системи і можуть включати код, спочатку написаний будь-якою програмуванням. Для компіляції WebAssembly може використовуватися інструментарій Emscripten. Для трансляції WebAssembly в машинний код поточної платформи підтримується підключення різних бекенд компіляції (Singlepass, Cranelift, LLVM) і движків (задіяння JIT або генерація машинного коду).
Управління доступом та взаємодія з системою забезпечується за допомогою 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++, C#, D, Python, JavaScript, Go, PHP, Ruby, Elixir та Java.
Платформа дозволяє досягти продуктивності виконання додатків, близьких до виконання рідних збірок. За допомогою Native Object Engine для WebAssembly-модуля можна згенерувати машинний код ("wasmer compile -native" для генерації передкомпільованих об'єктних файлів .so, .dylib і .dll), для запуску якого потрібен мінімальний runtime, але зберігаються всі можливості sandbox-ізоляції. Можливе постачання передкомпільованих програм із вбудованим Wasmer. Для створення надбудов та доповнень пропонуються Rust API та Wasm-C-API.
Значна зміна номера версії Wasmer пов'язана з внесенням змін, що порушують сумісність, у внутрішній API, які, як запевняють розробники, ніяк не позначаться на 99% користувачів платформи. З змін, що порушують сумісність, також відзначається зміна формату серіалізованих модулів Wasm (модулі, серіалізовані у Wasmer 1.0, не зможуть використовуватися в Wasmer 2.0). Інші зміни:
- Підтримка інструкцій SIMD (Single Instruction, Multiple Data), що дозволяють організувати розпаралелювання операцій над даними. З областей, у яких застосування SIMD може помітно підняти продуктивність, відзначається машинне навчання, кодування та декодування відео, обробки зображень, симуляція фізичних процесів та маніпуляції з графікою.
- Підтримка типів посилань, що дозволяють модулям Wasm звертатися до інформації в інших модулях або в базовому оточенні.
- Проведено значну оптимізацію продуктивності. Швидкість роботи LLVM runtime з числами з плаваючою комою збільшена приблизно на 50%. Значно прискорено виклик функцій рахунок скорочення ситуацій, потребують звернення до ядру. На 40% збільшено продуктивність генератора коду Cranelift. Скорочено час десеріалізації даних.
- Для більш точного відображення суті змінені назви двигунів: JIT → Universal, Native → Dylib (Dynamic Library), Object File → StaticLib (Static Library).
Джерело: opennet.ru