U paraqit versioni i tretë i rëndësishëm i projektit Wasmer, i cili po zhvillon një runtime për ekzekutimin e moduleve WebAssembly, i cili mund të përdoret për të krijuar aplikacione universale që mund të funksionojnë në sisteme të ndryshme operative, si dhe për ekzekutimin e izoluar të kodit jo të besueshëm. Kodi i projektit është shkruar në gjuhën Rust dhe shpërndahet nën licencën MIT.
Mundësia e ekzekutimit të një aplikacioni në platforma të ndryshme sigurohet përmes kompilim të kodit në kodin e ndërmjetëm të ulët WebAssembly, i cili mund të ekzekutohet në çfarëdo OS ose të embed-uar në programe të tjera në gjuhë programuese. Programet janë konteinerë të lehtë në të cilët ekzekutohet pseudokodi WebAssembly. Këta konteinerë nuk janë të lidhur me sistemin operativ dhe mund të përfshijnë kod që fillimisht është shkruar në çfarëdo gjuhë programuese. Për kompilim në WebAssembly mund të përdoret instrumenti Emscripten. Për përkthimin e WebAssembly në kodin makinerik të platformës aktuale mbështetet lidhja e backend-eve të ndryshme të kompilim (Singlepass, Cranelift, LLVM) dhe motorëve (përdorimi i JIT ose gjenerimin e kodit makinerik).
Aplikacionet janë të izoluara nga sistemi kryesor në një ambient sandbox dhe kanë qasje vetëm në funksionalitetin e deklaruar (mekanizmi i sigurisë i bazuar në kontrollin e mundësive - për veprimet me çdo burim (skedarë, katalogë, socket, thirrje sistemore, etj.) aplikacionit duhet t'i jepen autorizimet përkatëse). Menaxhimi i aksesit dhe ndërveprimi me sistemin sigurohet përmes API WASI (WebAssembly System Interface), e cila ofron ndërfaqe programuese për punën me skedarët, socket-at dhe funksione të tjera që ofrohen nga sistemi operativ.
Platforma lejon arritjen e performancĂ«s sĂ« ekzekutimit tĂ« aplikacioneve, tĂ« afĂ«rt me ekzekutimin e ndĂ«rtimeve natives. FalĂ« Native Object Engine pĂ«r modul WebAssembly mund tĂ« gjeneroni kodin e makinerisĂ« («wasmer compile ânative» pĂ«r gjenerimin e skedarĂ«ve tĂ« objektit .so, .dylib dhe .dll tĂ« parakomplikuara), pĂ«r ekzekutimin e tĂ« cilit kĂ«rkohet njĂ« runtime minimal, por ruhet tĂ«rĂ« mundĂ«sia e izolimit sandbox. Ofrimi i programeve tĂ« parakomplikuara me Wasmer tĂ« integruar Ă«shtĂ« i mundur. PĂ«r krijimin e shtesave dhe plotĂ«simeve ofrohen Rust API dhe Wasm-C-API.
Për të ekzekutuar një kontejner WebAssembly mjafton të instaloni në sistemin runtime Wasmer, i cili vijon pa varësi të jashtme ("curl https://get.wasmer.io -sSfL | sh"), dhe të ekzekutoni skedarin e nevojshëm ("wasmer test.wasm"). Programet shpërndahen në formën e moduleve të zakonshëm WebAssembly, për menaxhimin e të cilave mund të përdoret menaxheri i paketave WAPM. Wasmer është gjithashtu i disponueshëm në formën e një biblioteke, e cila mund të përdoret për të integruar kodin WebAssembly në programe në gjuhët Rust, C/C++, C#, D, Python, JavaScript, Go, PHP, Ruby, Elixir dhe Java.
Ndryshimet kryesore në Wasmer 3.0:
- Shtë shtuar mundësia e krijimit të skedarëve ekzekutivë native për çdo platformë. Ekipi «wasmer create-exe» është rishikuar plotësisht, duke lejuar shndërrimin e skedarit me kodin e ndërmjetëm WebAssembly në skedarë ekzekutivë të pavarur për platformat Linux, Windows dhe macOS, të cilat mund të funksionojnë pa instaluar vetë Wasmer.
- Eshtë ofruar mundësia e ekzekutimit të paketave WAPM, të vendosura në katalogun wapm.io, duke përdorur komandën «wasmer run». Për shembull, ekzekutimi i «wasmer run python/python» do të çojë në ngarkimin e paketës python nga repository wapm.io dhe në ekzekutimin e saj.
- API-i i Wasmer Rust është riparë plotësisht, me një stil të ri të punës me memorie dhe mundësinë e ruajtjes së sigurt të objekteve Wasm në strukturën Store. Një strukturë e re MemoryView është propozuar, e cila lejon leximin dhe shkruan të dhëna në hapësirën lineare të memories.
- Një grup komponentësh wasmer-js është implementuar për të ekzekutuar Wasmer në shfletuesin web dhe për t'u ndërvepruar me të nga JavaScript, duke përdorur bibliotekën wasm-bindgen. Aftësitë e wasmer-js përkojnë me ato të komponentëve wasmer-sys, të destinuara për ekzekutimin e Wasmer në sisteme operative të zakonshme.
- Motoret janë thjeshtuar. Në vend të mjeteve të ndara për JIT, lidhje dinamike dhe statike (Universal, Dylib, StaticLib), tani ofrohet një motor i vetëm dhe ngarkimi dhe ruajtja e kodit menaxhohet në nivelin e konfigurimit.
- Për deserializimin e artefakteve, është përdorur një kornizë rkyv që siguron punë në modalitetin zero-copy, pra pa kërkuar alokim të memories shtesë dhe duke realizuar deserializimin vetëm duke përdorur tamponin fillestar të ofruar. Përdorimi i rkyv ka lejuar një rritje të konsiderueshme të shpejtësisë së nisjes.
- Kompliku si njëri i kalimit, Singlepass është përmirësuar, duke sjellë mbështetje për funksione me argumente të shumta (multi-value), rritje të besueshmërisë dhe mbështetje për kornizat e trajtimit të përjashtimeve.
- Implementimi i API WASI (WebAssembly System Interface) është përmirësuar. Problemet në ndërfaqen e programit WASI për punën me sistemin e skedarëve janë zgjidhur. Tipet e brendshme janë riprojektuar duke përdorur WAI (WebAssembly Interfaces), që në të ardhmen do të lejojë realizimin e një serie mundësish të reja.
Burimi: opennet.ru
