Introduzione
Il WebAssembly (conosciuto anche come Wasm) è un formato di istruzioni binarie per una macchina virtuale basata su stack (stack-based virtual machine). Per chi volesse approfondire, l’homepage del progetto è a questo indirizzo: https://webassembly.org.
Questa VM è stata progettata per essere sicura, per poter essere eseguita in ambienti runtime multipli (da linea comando, da browser, in node.js, ecc..) e per poter essere target di compilazione per vari linguaggi di programmazione. Come convenzione, una applicazione compilata per WASM ha come suffisso .wasm.
In questo articolo, affrontando l’esecuzione di WASM a riga di comando, potremo sfruttare lo standard WASI (WebAssembly System Interface). Il WASI (opzionale a riga di comando e vietato nei browser) ci permette di avere un controllo maggiore sull’host in cui è in esecuzione la VM e cioè:
- Accesso al filesystem (lettura/scrittura file)
- Accesso alle variabili d’ambiente
- Argomenti da riga di comando
- Accesso all’orologio di sistema
- I/O standard (stdin, stdout, stderr)
Il team di free pascal ha già iniziato a sperimentare la compilazione per WASM e, nonostante non sia ancora un ambiente pronto per la produzione, lo sviluppo è sicuramente ad uno stadio avanzato. Cosa infatti non da poco conto è che fpc compila se stesso in wasm e, questo, significa almeno 2 cose:
- che il cross compiler per wasm, benché ancora nella trunk, è già molto affidabile
- che fpc stesso può girare in un browser! (vedi: https://wiki.freepascal.org/WebAssembly)
Credo l’argomento sia già molto interessante quindi… iniziamo a vedere come funziona.
Prerequisiti
In questa occasione esploreremo la possibilità di generare binari WASM con WASI, per essere eseguiti a linea di comando. Per poter compilare il test di questo articolo, abbiamo bisogno:
- del linker lld
- del cross-compiler di fpc per wasm
- del runtime per eseguire il classico hello world
Seguono quindi le indicazioni per impostare tutto il necessario.
Setup del linker lld
Iniziamo dal linker. Il compilatore WASM del Free Pascal utilizza il linker di LLVM e lo troviamo quindi (quasi) su tutte le piattaforme.
La homepage del progetto è: https://github.com/llvm/llvm-project/releases.
Nei sistemi Gnu/Linux e Mac lo si può installare tramite i repository ufficiali mentre, per windows, si può scaricare l’installer.
Una volta installato lld, possiamo testarne il funzionamento con i seguenti comandi:
lld --versionwasm-ld --version
In ambedue i casi, dovremmo ottenere un messaggio che conferma la corretta installazione.
Setup cross compiler wasm per fpc
Nel momento in cui sto scrivendo questo articolo, il necessario per poter usare il target WASM non è nella versione stabile del compilatore fpc: dobbiamo quindi installare la trunk.
Se non avete già un fpc versione trunk, ci sono diversi modi per ottenerlo. Sicuramente il più veloce è quello di utilizzare fpcupdeluxe.
Scaricate quindi l’ultima versione di fpcupdeluxe ed impostate l’installazione come segue:
- compilatore fpc trunk
- lazarus trunk
poi spostatevi nel tab “cross”, impostate:
- wasm32
- wasip1
Avviate l’installazione ed attendete qualche minuto.
Per provare il compilatore, creiamo un file che chiamiamo hw.pas e copiamoci dentro il seguente contenuto.
program helloworld;
begin
Writeln(’Hello, world!’);
end.
Per compilare, ovviamente, dobbiamo usare il cross-compiler di fpc trunk.
Nell’esempio sotto, troviamo l’invocazione della compilazione da linea comando in ambiente linux.
Notare il parametro -Twasip1 che abilita l’utilizzo di WASI: usare il WASI in un “hello world” sembrerebbe superfluo ma bisogna ricordare che “hello world” viene scritto nello standard ouput.
$ /fullpath/LazTrunk/fpc/bin/x86_64-linux/fpc.sh -Twasip1 -Pwasm32 hw.pas
Free Pascal Compiler version 3.3.1-19236-gefcfa3ce1e-dirty [2026/01/16] for wasm32
Copyright (c) 1993-2026 by Florian Klaempfl and others
Target OS: The WebAssembly System Interface Preview 1 (WASI 0.1)
Compiling hw.pas
Linking hw.wasm
4 lines compiled, 0.1 sec, 443147 bytes code, 45260 bytes data
Se non ci sono stati errori di compilazione, vedrete che ora è presente il nuovo file hw.wasm.
Setup VM runtime per esecuzione .wasm
Ci sono molti runtime per WASM, in questo esempio andiamo ad usare wasmtime, nulla vieta di utilizzarne un altro qualsiasi.
Per scaricare wasmtime, possiamo usarne uno dei pre-compilati pronti all’uso.
https://github.com/bytecodealliance/wasmtime/releases
Una volta scaricato l’archivio che fa al caso vostro, decomprimetelo in una cartella: la VM è pronta all’uso!
Esecuzione del binario .wasm
Lanciamo quindi il nostro “hello world” indicandolo come parametro (hw.wasm).
L’invocazione è la seguente:
/fullpath-to/wasmtime-dev-x86_64-linux/wasmtime hw.wasm
In ambiente Windows il lancio si potrà fare con un comando tipo:
C:\fullpath-to\wasmtime-dev-x86_64-win\wasmtime.exe hw.wasm
Dovreste vedere comparire nel terminale l’output del comando aspettato.
Conclusioni
Abbiamo terminato questo primo approccio con fpc e WASM. Spero che questo articolo sia sufficiente ad introdurre l’argomento, a fare i primi passi e perché no, a stimolare un po’ la curiosità. Per eventuali domande o chiarimenti potete usufruire del nostro forum https://www.lazaruspascal.it/index.php
Riferimenti
https://www.freepascal.org/~michael/articles/fpcwasm1/fpcwasm1.pdf