Прадстаўлены трэці значны выпуск праекта Wasmer, які развівае runtime для выканання модуляў WebAssembly, які можна выкарыстоўваць для стварэння ўніверсальных прыкладанняў, здольных выконвацца ў розных аперацыйных сістэмах, а таксама для ізаляванага выканання кода, не варты даверу. Код праекту напісаны на мове Rust і распаўсюджваецца пад ліцэнзіяй MIT.
Магчымасць запуску аднаго дадатку на розных платформах забяспечваецца дзякуючы кампіляцыі кода ў нізкаўзроўневы прамежкавы код WebAssembly, які можа запускацца ў любых АС або ўбудоўвацца ў праграмы на іншых мовах праграмавання. Праграмы ўяўляюць сабой легкаважныя кантэйнеры, у якіх выконваецца псеўдакод WebAssembly. Дадзеныя кантэйнеры не прывязаныя да аперацыйнай сістэмы і могуць уключаць код, першапачаткова напісаны на любой мове праграмавання. Для кампіляцыі ў WebAssembly можа выкарыстоўвацца інструментар Emscripten. Для трансляцыі WebAssembly у машынны код бягучай платформы падтрымліваецца падлучэнне розных бэкэндаў кампіляцыі (Singlepass, Cranelift, LLVM) і рухавічкоў (задзейнічанне JIT або генерацыя машыннага кода).
Прыкладанні ізаляваныя ад асноўнай сістэмы ў sandbox-акружэнні і маюць доступ толькі да заяўленай функцыянальнасці (механізм бяспекі на аснове кіравання магчымасцямі — для дзеянняў з кожным з рэсурсаў (файлы, каталогі, сокеты, сістэмныя выклікі і да т.п.) дадатку павінны быць дадзены адпаведныя паўнамоцтвы). Кіраванне доступам і ўзаемадзеянне з сістэмай забяспечваецца пры дапамозе API WASI (WebAssembly System Interface), які прадстаўляе праграмныя інтэрфейсы для працы з файламі, сокетамі і іншымі функцыямі, якія прадстаўляюцца аперацыйнай сістэмай.
Платформа дазваляе дамагчыся прадукцыйнасці выканання прыкладанняў, блізкай да выканання родных зборак. Пры дапамозе Native Object Engine для WebAssembly-модуля можна згенераваць машынны код ("wasmer compile -native" для генерацыі прадкампіляваных аб'ектных файлаў .so, .dylib і .dll), для запуску якога патрабуецца мінімальны 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 3.0:
- Дададзена магчымасць стварэння родных выкананых файлаў для любых платформ. Цалкам перапрацавана каманда "wasmer create-exe", якая дазваляе пераўтварыць файл з прамежкавым кодам WebAssembly у самадастатковыя выкананыя файлы для платформаў Linux, Windows і macOS, якія могуць працаваць без усталёўкі самога Wasmer.
- Дадзена магчымасць запуску WAPM-пакетаў, размешчаных у каталогу wapm.io, пры дапамозе каманды "wasmer run". Напрыклад, выкананне "wasmer run python/python" прывядзе да загрузкі з рэпазітара wapm.io пакета python і яго запуску.
- Цалкам перапрацаваны Wasmer Rust API, у якім зменены стыль працы з памяццю і забяспечана магчымасць бяспечнага захавання аб'ектаў Wasm у структуры Store. Прапанавана новая структура MemoryView, якая дазваляе чытаць і запісваць дадзеныя ў лінейную вобласць памяці.
- Рэалізаваны набор кампанентаў wasmer-js для запуску Wasmer у web-браўзэры і ўзаемадзеянні з ім з JavaScript, выкарыстаючы бібліятэку wasm-bindgen. Па сваіх магчымасцях wasmer-js адпавядае кампанентам wasmer-sys, прызначаным для запуску Wasmer у звычайных аперацыйных сістэмах.
- Спрошчаны рухавічкі. Замест паасобных рухавічкоў для JIT, дынамічнага і статычнага звязвання (Universal, Dylib, StaticLib) зараз прапануецца адзін агульны рухавічок і загрузка і захаванне кода у якім кіруецца на ўзроўні выстаўлення параметраў.
- Для дэсерыялізацыі артэфактаў задзейнічаны фрэймворк rkyv, які забяспечвае працу ў рэжыме zero-copy, г.зн. не патрабуе вылучэння дадатковай памяці і які выконвае дэсерыялізацыю толькі з выкарыстаннем першапачаткова прадстаўленага буфера. Ужыванне rkyv дазволіла значна павялічыць хуткасць запуску.
- Палепшаны аднапраходны кампілятар Singlepass, у якім з'явілася падтрымка функцый з некалькімі аргументамі (multi-value), падвышаная надзейнасць працы і дададзеная падтрымка кадраў апрацоўкі выключэнняў.
- Палепшана рэалізацыя API WASI (WebAssembly System Interface). Вырашаны праблемы ў праграмным інтэрфейсе WASI для працы з файлавай сістэмай. Унутраныя тыпы перапрацаваны з выкарыстаннем WAI (WebAssembly Interfaces), што ў будучыні дазволіць ажыццявіць серыю новых магчымасцяў.
Крыніца: opennet.ru