WebAssembly (Wasm) è progettato per essere un formato di bytecode portatile e indipendente dalla piattaforma. Ciò significa che il codice compilato in Wasm può essere eseguito su una varietà di ambienti, inclusi browser Web, server, dispositivi IoT e molto altro ancora. Compilare linguaggi come Python in Wasm consente di eseguire facilmente il codice su una vasta gamma di dispositivi e ambienti, senza doverlo adattare per ciascuna piattaforma.
Wasm sta rivoluzionando il Web perché, ad esempio, offre prestazioni enormemente superiori rispetto a linguaggi interpretati come JavaScript. Wasm permette inoltre l’utilizzo di una vasta gamma di linguaggi di programmazione, inclusi C, C++, Rust e ora anche Python, per sviluppare applicazioni Web. Ciò consente agli sviluppatori di utilizzare gli strumenti e i linguaggi più adatti alle loro esigenze, senza dover compromettere performance e funzionalità.
Come compilare codice Python in WASM
Uno dei linguaggi più popolari in circolazione è Python: sebbene sia certamente possibile eseguire programmi Python in WebAssembly, le prestazioni risultano nel complesso piuttosto scadenti.
Così, gli autori del progetto Wasmer, avviato cinque anni fa con il preciso obiettivo di trasformare in WebAssembly il codice realizzato con qualsiasi linguaggio di programmazione, annunciano oggi un’importante novità. Il nuovo compilatore py2wasm “traduce” i programmi Python in Wasm (grazie a Nuitka) consentendo l’esecuzione tre volte più veloce rispetto all’interprete di base.
Come usare py2wasm
Per utilizzare il compilatore py2wasm da Python a Wasm, è necessario che sul sistema in uso risulti già presente Python 3.11. Per impostare facilmente Python, si può ricorrere a pyenv
:
pyenv install 3.11 && pyenv global 3.11
I comandi seguenti consentono invece di installare il compilatore, richiedere la compilazione di uno script Python nel bytecode Wasm quindi di avviarne l’esecuzione con Wasmer:
pip install py2wasm
py2wasm myprogram.py -o myprogram.wasm
wasmer run myprogram.wasm
Come velocizzare l’esecuzione del codice Python con Wasm
Diverse strategie possono essere utilizzate per ottimizzare i carichi di lavoro Python in WebAssembly. I vari schemi applicabili sono essenzialmente tre.
Ci si può limitare a usare un sottoinsieme di Python, più facilmente traducibile in codice Wasm performante; si può attivare il compilatore JIT (Just-in-Time) all’interno di Python in modo tale da ottimizzare e compilare il codice durante l’esecuzione; infine si può ricorrere all’analisi statica per ottimizzare il codice generato.
Gli autori di Wasmer e del compilatore py2wasm, spiegano che l’ultima via dà ottimi frutti. L’analisi statica, infatti, permette di analizzare e rilevare automaticamente, e in anticipo, le tipizzazioni del programma, così il codice può essere reso con un approccio più performante (di solito attraverso la trasposizione di Python a C).
Le tipizzazioni si riferiscono alla pratica di assegnare un tipo di dato specifico a una variabile, a una funzione o a un valore. Questo tipo di dato definisce il tipo di valore che la variabile può contenere o restituire e specifica come quel valore può essere manipolato.
L’analisi statica, processo mediante il quale il codice sorgente è esaminato per individuare eventuali errori, inefficienze o aree di miglioramento senza passare effettivamente all’esecuzione del programma, è gestita da Nuitka (citato in precedenza). Come accennato, Nuitka funziona trasponendo le chiamate Python che il programma effettua in C, utilizzando le chiamate API interne.
Può addirittura funzionare come code obfuscator, per rendere impossibile decompilare il programma Wasm.
C’è ancora del lavoro da fare
I promotori del progetto Wasmer ammettono che nel caso di Python c’è ancora del lavoro da svolgere. Nuitka, ad esempio, ancora non è compatibile con Python 3.12 e diverse modifiche a basso livello sono risultate necessarie per gestire, ad esempio, i valori conservati in cache e accelerarne il recupero, soprattutto sulle piattaforme a 64 bit.
Sistemati tutti i problemi residui, il compilatore py2wasm sarà aggiunto alla lista dei pacchetti disponibili di Wasmer: in questo modo basterà un unico semplice comando per farlo funzionare.
In ogni caso, un’importante pietra miliare è stata già posta e la possibilità di eseguire codice Python da browser Web da oggi apre orizzonti praticamente sconfinati.
L’immagine in apertura è realizzata da Wasmer.