WebAssembly - Formato testo

WebAssembly ha il codice in un formato binario chiamato WASM. È inoltre possibile ottenere il formato di testo in WebAssembly e si chiama WAT ​​(WebAssembly Text format). Come sviluppatore non dovresti scrivere codice in WebAssembly, invece, devi compilare linguaggi di alto livello come C, C ++ e Rust in WebAssembly.

Codice WAT

Scriviamo gradualmente il codice WAT.

Step 1 - Il punto di partenza in un WAT è dichiarare il modulo.

(module)

Step 2 - Aggiungiamo ora alcune funzionalità sotto forma di funzione.

La funzione è dichiarata come mostrato di seguito -

(func <parameters/result> <local variables> <function body>)

La funzione inizia con la parola chiave func seguita da parametri o risultato.

Parametri / Risultato

I parametri e il valore restituito come risultato.

I parametri possono avere il seguente tipo supportato da wasm:

  • i32: numero intero a 32 bit
  • i64: intero a 64 bit
  • f32: virgola mobile a 32 bit
  • f64: 64 bit in virgola mobile

I parametri per le funzioni sono scritti come indicato di seguito:

  • (param i32)
  • (param i64)
  • (param f32)
  • (param f64)

Il risultato verrà scritto come segue:

  • (risultato i32)
  • (risultato i64)
  • (risultato f32)
  • (risultato f64)

La funzione con parametri e valore di ritorno sarà definita come segue:

(func (param i32) (param i32) (result i64) <function body>)

Variabili locali

Le variabili locali sono quelle di cui hai bisogno nella tua funzione. Un valore locale per la funzione sarà definito come segue:

(func (param i32) (param i32) (local i32) (result i64) <function body>)

Funzione Body

Il corpo della funzione è la logica da eseguire. Il programma finale sarà simile a questo:

(module (func (param i32) (param i32) (local i32) (result i64) <function body>) )

Step 3 - Per leggere e impostare parametri e variabili locali.

Per leggere i parametri e le variabili locali, utilizzare get_local e set_local comando.

Example

(module 
   (func (param i32) (param i32) (local i32) (result i64) get_local 0 
      get_local 1 
      get_local 2 
   ) 
)

Secondo la firma della funzione,

  • get_local 0 darà il param i32

  • get_local 1 darà il prossimo parametro param i32

  • get_local 2 darà local value i32

Invece di fare riferimento ai parametri e alle variabili locali utilizzando valori numerici come 0,1,2, puoi anche usare il nome prima dei parametri, anteponendo al nome un segno di dollaro.

L'esempio seguente mostra come utilizzare il nome con parametri e variabili locali.

Example

(module 
   (func 
      (param $a i32) 
      (param $b i32) 
      (local $c i32) 
      (result i64) get_local $a get_local $b get_local $c 
   ) 
)

Step 4 - Istruzione nel corpo e nell'esecuzione della funzione.

L'esecuzione in wasm segue la strategia dello stack. Le istruzioni eseguite vengono inviate una ad una sullo stack. Ad esempio, l'istruzione get_local $ a invierà il valore, si legge nello stack.

L'istruzione piace i32.add che aggiungerà il pop gli elementi dalla pila.

(func (param $a i32) (param $b i32) 
   get_local $a 
   get_local $b 
   i32.add
)

L'istruzione per i32.add è ($a+$b). Il valore finale di i32.add, verrà inserito nello stack e verrà assegnato al risultato.

Se la firma della funzione ha un risultato dichiarato, dovrebbe esserci un valore nello stack alla fine dell'esecuzione. Se non ci sono parametri di risultato, lo stack deve essere vuoto alla fine.

Quindi, il codice finale insieme al corpo della funzione sarà il seguente:

(module 
   (func (param $a i32) (param $b i32) (result i32) 
      get_local $a
      get_local $b 
      i32.add
   )
)

Step 5 - Chiamata alla funzione.

Il codice finale con il corpo della funzione è come mostrato nel passaggio 4. Ora, per chiamare la funzione, dobbiamo esportarla.

Per esportare la funzione, può essere fatto con valori di indice come 0,1, ma possiamo anche dare dei nomi. Il nome sarà preceduto da $ e verrà aggiunto dopo la parola chiave func.

Example

(module 
   (func $add (param $a i32) (param $b i32) (result i32) 
      get_local $a 
      get_local $b i32.add
   ) 
)

La funzione $ add deve essere esportata, utilizzando la parola chiave export come mostrato di seguito -

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

Per testare il codice sopra nel browser, dovrai convertirlo in formato binario (.wasm). Fare riferimento al capitolo successivo che mostra come convertire.WAT to .WASM.