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 example

I 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 example
nn, 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