È stato presentato il terzo rilascio significativo del progetto Wasmer, che sviluppa un runtime per l'esecuzione di moduli WebAssembly, utilizzabile per creare applicazioni universali in grado di funzionare su diversi sistemi operativi e per l'esecuzione isolata di codice non attendibile. Il codice del progetto è scritto in Rust e distribuito sotto licenza MIT.
La possibilità di eseguire un'applicazione su diverse piattaforme è garantita dalla compilazione del codice in un codice intermedio a basso livello chiamato WebAssembly, che può essere eseguito su qualsiasi sistema operativo o integrato in programmi scritti in altri linguaggi di programmazione. I programmi sono contenitori leggeri in cui viene eseguito il pseudocodice WebAssembly. Questi contenitori non sono legati a un sistema operativo specifico e possono includere codice scritto originariamente in qualsiasi linguaggio di programmazione. Per la compilazione in WebAssembly può essere utilizzato l'ambiente di sviluppo Emscripten. Per la traduzione di WebAssembly in codice macchina della piattaforma attuale è supportata l'integrazione di vari backend di compilazione (Singlepass, Cranelift, LLVM) e motori (utilizzando JIT o generazione di codice macchina).
Le applicazioni sono isolate dal sistema principale in un ambiente sandbox e hanno accesso solo alle funzionalità dichiarate (un meccanismo di sicurezza basato sulla gestione delle capacità: per le azioni su ciascuna risorsa (file, directory, socket, chiamate di sistema, ecc.) l'applicazione deve ricevere i corrispondenti permessi). La gestione degli accessi e l'interazione con il sistema sono garantite tramite le API WASI (WebAssembly System Interface), che forniscono interfacce software per lavorare con file, socket e altre funzioni fornite dal sistema operativo.
La piattaforma permette di raggiungere prestazioni di esecuzione delle applicazioni simili a quelle delle build nativo. Utilizzando il Native Object Engine per il modulo WebAssembly, è possibile generare codice macchina (‘wasmer compile —native’ per generare file oggetto precompilati .so, .dylib e .dll), la cui esecuzione richiede un runtime minimo, ma mantiene tutte le capacità di isolamento sandbox. È possibile fornire programmi precompilati con Wasmer integrato. Sono disponibili API Rust e Wasm-C-API per la creazione di estensioni e plugin.
Per avviare un container WebAssembly, è sufficiente installare il runtime Wasmer nel sistema, che viene fornito senza dipendenze esterne ("curl https://get.wasmer.io -sSfL | sh") e avviare il file necessario ("wasmer test.wasm"). I programmi sono distribuiti sotto forma di normali moduli WebAssembly, gestibili tramite il gestore di pacchetti WAPM. Wasmer è anche disponibile come libreria, utilizzabile per incorporare codice WebAssembly in programmi scritti in Rust, C/C++, C#, D, Python, JavaScript, Go, PHP, Ruby, Elixir e Java.
Principali cambiamenti in Wasmer 3.0:
- È stata aggiunta la possibilità di creare file eseguibili nativi per qualsiasi piattaforma. È stata completamente riprogettata la comando "wasmer create-exe", che consente di convertire un file con codice intermedio WebAssembly in file eseguibili autonomi per le piattaforme Linux, Windows e macOS, che possono funzionare senza installare Wasmer.
- È stata fornita la possibilità di eseguire pacchetti WAPM ospitati nella directory wapm.io tramite il comando "wasmer run". Ad esempio, eseguendo "wasmer run python/python" si caricherà il pacchetto python dal repository wapm.io e verrà avviato.
- L'API Wasmer Rust è stato completamente riprogettato, modificando lo stile di gestione della memoria e consentendo la memorizzazione sicura degli oggetti Wasm nella struttura Store. È stata proposta una nuova struttura MemoryView che permette di leggere e scrivere dati in un'area di memoria lineare.
- È stato implementato un set di componenti wasmer-js per eseguire Wasmer nel web browser e interagire con esso tramite JavaScript, utilizzando la libreria wasm-bindgen. Le capacità di wasmer-js sono equivalenti a quelle dei componenti wasmer-sys, progettati per eseguire Wasmer nei normali sistemi operativi.
- I motori sono stati semplificati. Invece dei motori separati per JIT, linking dinamico e linking statico (Universal, Dylib, StaticLib), ora è proposto un unico motore comune, con gestione del caricamento e del salvataggio del codice a livello di configurazione.
- Per la deserializzazione degli artefatti è stato utilizzato il framework rkyv, che opera in modalità zero-copy, cioè non richiede l'allocazione di memoria aggiuntiva e esegue la deserializzazione utilizzando esclusivamente il buffer fornito inizialmente. L'adozione di rkyv ha notevolmente aumentato la velocità di avvio.
- È stato migliorato il compilatore Singlepass a passaggio singolo, che ora supporta funzioni con più argomenti (multi-value), aumentando l'affidabilità e aggiungendo il supporto per i frame di gestione delle eccezioni.
- Migliorata l'implementazione dell'API WASI (WebAssembly System Interface). Sono stati risolti problemi nell'interfaccia API WASI per la gestione del file system. I tipi interni sono stati ridefiniti utilizzando WAI (WebAssembly Interfaces), il che permetterà in futuro di realizzare una serie di nuove funzionalità.
Fonte: opennet.ru
