È stato rilasciato il secondo significativo aggiornamento 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, nonché per l'esecuzione isolata di codice non affidabile. Il codice del progetto è scritto in Rust e distribuito sotto licenza MIT.
La portabilità è garantita dalla compilazione del codice dell'applicazione in un codice intermedio a basso livello WebAssembly, che può essere eseguito su qualsiasi sistema operativo o incorporato in programmi scritti in altri linguaggi di programmazione. I programmi sono contenitori leggeri in cui viene eseguita la pseudo-codifica di WebAssembly. Questi contenitori non sono legati al sistema operativo 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 per la piattaforma attuale, è supportata l'integrazione di vari backend di compilazione (Singlepass, Cranelift, LLVM) e motori (utilizzo di JIT o generazione di codice macchina).
La gestione degli accessi e l'interazione con il sistema sono garantite dall'API WASI (WebAssembly System Interface), che fornisce interfacce software per operare con file, socket e altre funzioni fornite dal sistema operativo. Le applicazioni sono isolate dal sistema principale in un ambiente sandbox e hanno accesso solo alle funzionalità dichiarate (meccanismo di sicurezza basato sulla gestione delle capacità - per operazioni su ciascuna risorsa (file, directory, socket, chiamate di sistema, ecc.) all'applicazione devono essere concessi i corrispondenti diritti).
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.
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.
Il significativo cambiamento del numero di versione di Wasmer è legato all'introduzione di modifiche incompatibili con la versione precedente nell'API interna, che, secondo gli sviluppatori, non influenzeranno il 99% degli utenti della piattaforma. Tra le modifiche incompatibili si segnala anche la modifica del formato dei moduli serializzati Wasm (i moduli serializzati in Wasmer 1.0 non possono essere utilizzati in Wasmer 2.0). Altri cambiamenti:
- Supporto per istruzioni SIMD (Single Instruction, Multiple Data), che consentono di parallelizzare le operazioni sui dati. Tra i campi in cui l'applicazione di SIMD può notevolmente aumentare le prestazioni, si evidenziano l'apprendimento automatico, la codifica e decodifica video, l'elaborazione delle immagini, la simulazione di processi fisici e le manipolazioni grafiche.
- Supporto per i tipi di riferimento, che consente ai moduli Wasm di accedere alle informazioni in altri moduli o nell'ambiente sottostante.
- È stata effettuata una significativa ottimizzazione delle prestazioni. La velocità di esecuzione del runtime LLVM con numeri in virgola mobile è aumentata di circa il 50%. La chiamata di funzioni è stata notevolmente accelerata grazie alla riduzione dei casi che richiedono l'accesso al kernel. Le prestazioni del generatore di codice Cranelift sono aumentate del 40%. I tempi di deserializzazione dei dati sono stati ridotti.


- Per riflettere più accuratamente il significato, sono stati modificati i nomi dei motori: JIT → Universale, Nativo → Dylib (Libreria Dinamica), File Oggetto → StaticLib (Libreria Statica).
Fonte: opennet.ru


