Introduzione a WebAssembly - WASM: Una Guida per Principianti

Ciao futuro supercampione del coding! Sono entusiasta di essere il tuo guida in questo emozionante viaggio nel mondo di WebAssembly, o WASM per brevissimo. Non preoccuparti se non hai mai scritto una riga di codice prima - inizieremo dal molto principio e scaleremo insieme. Allora, prenditi una tazza della tua bevanda preferita, mettiti comodo, e tuffiamoci!

WebAssembly - WASM

Cos'è WebAssembly?

WebAssembly è come una lingua segreta che i browser web capiscono. È progettato per far funzionare le applicazioni web più velocemente e in modo più efficiente. Immagina di voler giocare a un videogioco complesso su un sito web. Senza WebAssembly, potrebbe essere lento e malandato. Ma con WebAssembly, può funzionare agevolmente, quasi come se stessimo giocando su una console per videogiochi!

Una Breve Storia

WebAssembly è nato dal desiderio di rendere le applicazioni web più potenti. È stato annunciato per la prima volta nel 2015, e entro il 2017, era supportato da tutti i principali browser web. Questo è piuttosto rapido nel mondo della tecnologia - quasi come quando la tua applicazione di social media preferita si aggiorna con nuove funzionalità!

Il Modello di Macchina a Stack

Ora, parliamo di qualcosa che sembra un po' tecnico ma è in realtà abbastanza semplice quando lo analizzi: il Modello di Macchina a Stack. Questo è il cuore di come funziona WebAssembly.

Cos'è uno Stack?

Pensa a uno stack come a una pila di piatti. Puoi solo aggiungere o rimuovere piatti dalla cima della pila. In termini di computer, chiamiamo aggiungere allo stack "push" e rimuovere dallo stack "pop".

Come WebAssembly Utilizza lo Stack

WebAssembly utilizza questa idea di stack per eseguire operazioni. È come un cuoco molto efficiente in una cucina, che sa esattamente quale ingrediente (o numero, nel nostro caso) usare dopo.

Guardiamo un esempio semplice:

(module
(func $add (param $a i32) (param $b i32) (result i32)
local.get $a
local.get $b
i32.add)
(export "add" (func $add))
)

Non panicare! So che questo sembra un linguaggio alieno in questo momento, ma analizziamo:

  1. (module): È come dire "Ecco un nuovo libro di ricette".
  2. (func $add ...): Stiamo definendo una nuova funzione (o ricetta) chiamata "add".
  3. (param $a i32) (param $b i32): La nostra funzione prende due ingredienti (parametri), entrambi numeri interi a 32 bit.
  4. (result i32): Il risultato sarà anche un numero intero a 32 bit.
  5. local.get $a: Metti il primo numero in cima alla nostra pila di piatti.
  6. local.get $b: Metti il secondo numero sopra il primo.
  7. i32.add: Aggiungi i due numeri in cima e rimpiazzali con il risultato.

Quindi, se chiamassimo questa funzione con 5 e 3, la nostra pila apparirebbe così:

  1. Iniziamo con una pila vuota: []
  2. Dopo local.get $a: [5]
  3. Dopo local.get $b: [5, 3]
  4. Dopo i32.add: [8]

E voilà! Abbiamo aggiunto due numeri utilizzando il modello di macchina a stack di WebAssembly.

Perché Usare WebAssembly?

Potresti chiederti, "Questo sembra complicato. Perché non usare JavaScript?" Ottima domanda! WebAssembly ha alcuni superpoteri che lo rendono speciale:

  1. Velocità: WebAssembly può eseguire某些任务比JavaScript molto più velocemente.
  2. Efficienza: Utilizza meno memoria e potenza di elaborazione.
  3. Flessibilità Linguistica: Puoi scrivere codice in linguaggi come C++ o Rust e convertirlo in WebAssembly.

Immagina di costruire un castello di sabbia. JavaScript è come usare le mani - è flessibile e facile da iniziare. WebAssembly è come avere un set di strumenti specializzati - potrebbe richiedere un po' più di configurazione, ma puoi costruire castelli molto più complessi e solidi!

Il Tuo Primo Programma WebAssembly

Scriviamo un programma semplice che aggiunge due numeri. Useremo un linguaggio chiamato WAT (WebAssembly Text Format), che è una versione leggibile da humanos di WebAssembly.

(module
(func $add (param $left i32) (param $right i32) (result i32)
local.get $left
local.get $right
i32.add)
(export "add" (func $add))
)

Questo potrebbe sembrare familiare - è molto simile al nostro esempio precedente! Ecco cosa fa:

  1. Definisce un modulo (il nostro programma).
  2. Crea una funzione chiamata $add che prende due numeri interi a 32 bit e ne restituisce uno.
  3. Prende il primo numero ($left) e lo mette sulla pila.
  4. Prende il secondo numero ($right) e lo mette sopra il primo.
  5. Aggiunge i due numeri sulla pila.
  6. Esporta la funzione così possiamo usarla da JavaScript.

Per usarlo in una pagina web, abbiamo bisogno di un po' di JavaScript:

fetch('add.wasm')
.then(response => response.arrayBuffer())
.then(bytes => WebAssembly.instantiate(bytes))
.then(results => {
const add = results.instance.exports.add;
console.log(add(5, 3));  // Output: 8
});

Questo codice carica il nostro modulo WebAssembly, ne crea un'istanza e poi chiama la nostra funzione add con i numeri 5 e 3.

Conclusione

Congratulations! Hai appena fatto i tuoi primi passi nel mondo di WebAssembly. Abbiamo coperto cos'è WebAssembly, come utilizza il modello di macchina a stack e abbiamo persino scritto il nostro primo programma WebAssembly.

Ricorda, imparare a codificare è come imparare una nuova lingua o uno strumento musicale - richiede pratica e pazienza. Non scoraggiarti se tutto non ti sembra chiaro subito. Continua a sperimentare, continua a imparare, e prima di sapere, sarai costruire cose fantastiche con WebAssembly!

Nella nostra prossima lezione, esploreremo concetti WebAssembly più complessi e inizieremo a costruire progetti davvero interessanti. Fino a quel momento, happy coding!

Metodi WebAssembly Descrizione
local.get Recupera una variabile locale o un parametro
local.set Imposta il valore di una variabile locale
i32.add Aggiunge due numeri interi a 32 bit
i32.sub Sottrae due numeri interi a 32 bit
i32.mul Moltiplica due numeri interi a 32 bit
i32.div_s Divisione con segno di due numeri interi a 32 bit
i32.rem_s Resto con segno di due numeri interi a 32 bit
i32.and AND bit a bit di due numeri interi a 32 bit
i32.or OR bit a bit di due numeri interi a 32 bit
i32.xor XOR bit a bit di due numeri interi a 32 bit
i32.shl Shift a sinistra di un numero intero a 32 bit
i32.shr_s Shift a destra con segno di un numero intero a 32 bit
i32.eq Confronto di uguaglianza di due numeri interi a 32 bit
i32.ne Confronto di disuguaglianza di due numeri interi a 32 bit
i32.lt_s Confronto minore con segno di due numeri interi a 32 bit

Credits: Image by storyset