Адбыўся другі значны выпуск праекта 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#, 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