WebAssembly - Struttura del programma
WebAssembly, chiamato anche WASM, è un codice in formato binario di basso livello sviluppato per essere eseguito all'interno dei browser nel modo più efficiente. Il codice WebAssembly è strutturato con i seguenti concetti:
- Values
- Types
- Instructions
Vediamoli ora in dettaglio.
Valori
I valori in WebAssembly hanno lo scopo di memorizzare dati complessi come testo, stringhe e vettori. WebAssembly supporta quanto segue:
- Bytes
- Integers
- Virgola mobile
- Names
Byte
Bytes è la forma più semplice di valori supportati in WebAssembly. Il valore è in formato esadecimale.
For exampleI byte rappresentati come b possono anche prendere numeri naturali n, dove n <256.
byte ::= 0x00| .... |0xFF
Interi
In WebAssembly, i numeri interi supportati sono i seguenti:
- i32: numero intero a 32 bit
- i64: intero a 64 bit
Virgola mobile
In WebAssembly i numeri in virgola mobile supportati sono i seguenti:
- f32: virgola mobile a 32 bit
- f64: virgola mobile a 64 bit
Nomi
I nomi sono sequenze di caratteri, con valori scalari definiti da Unicode, disponibile al collegamento http://www.unicode.org/versions/Unicode12.1.0/ dato qui.
Tipi
Le entità in WebAssembly sono classificate come tipi. I tipi supportati sono i seguenti:
- Tipi di valore
- Tipi di risultati
- Tipi di funzione
- Limits
- Tipi di memoria
- Tipi di tabella
- Tipi globali
- Tipi esterni
Analizziamoli uno per uno.
Tipi di valore
Il tipo di valori supportato da WebAssembly è indicato di seguito:
- i32: numero intero a 32 bit
- i64: intero a 64 bit
- f32: virgola mobile a 32 bit
- f64: virgola mobile a 64 bit
valtype ::= i32|i64|f32|f64
Tipi di risultati
I valori scritti tra parentesi vengono eseguiti e memorizzati all'interno dei tipi di risultato. Il tipo di risultato è l'output dell'esecuzione di un blocco di codice composto da valori.
resulttype::=[valtype?]
Tipi di funzione
Un tipo di funzione accetta un vettore di parametri restituisce un vettore di risultati.
functype::=[vec(valtype)]--> [vec(valtype)]
Limiti
I limiti sono l'intervallo di archiviazione collegato alla memoria e ai tipi di tabella.
limits ::= {min u32, max u32}
Tipi di memoria
I tipi di memoria si occupano delle memorie lineari e della gamma di dimensioni.
memtype ::= limits
Tipi di tabella
I tipi di tabella sono classificati in base al tipo di elemento assegnato.
tabletype ::= limits elemtype
elemtype ::= funcref
Il tipo di tabella dipende dal limite delle dimensioni minime e massime assegnate.
Tipi globali
Tipo globale contiene le variabili globali che hanno il valore, che possono cambiare o rimanere invariate.
globaltype ::= mut valtype
mut ::= const|var
Tipi esterni
Tipi esterni si occupa di importazioni e valori esterni.
externtype ::= func functype | table tabletype | mem memtype | global globaltype
Istruzioni
Il codice WebAssembly è una sequenza di istruzioni che segue un modello di macchina stack. Poiché WebAssembly segue un modello di macchina dello stack, le istruzioni vengono inserite nello stack.
I valori degli argomenti per una funzione, ad esempio, vengono estratti dallo stack e il risultato viene reinserito nello stack. Alla fine, ci sarà un solo valore nello stack e questo è il risultato.
Alcune delle istruzioni comunemente utilizzate sono le seguenti:
- Istruzioni numeriche
- Istruzioni variabili
Istruzioni numeriche
Le istruzioni numeriche sono operazioni che vengono eseguite su un valore numerico.
For examplenn, mm ::= 32|64
ibinop ::= add|sub|mul|div_sx|rem_sx|and|or|xor
irelop ::= eq | ne | lt_sx | gt_sx | le_sx | ge_sx
frelop ::= eq | ne | lt | gt | le | ge
Istruzioni variabili
Le istruzioni variabili riguardano l'accesso alle variabili locali e globali.
For example
Per accedere alle variabili locali:
get_local $a
get_local $b
Per set variabili locali -
set_local $a
set_local $b
Per access variabili globali -
get_global $a
get_global $b
Per set variabili globali -
set_global $a
set_global $b