WebAssembly - Format Teks

WebAssembly memiliki kode dalam format biner yang disebut WASM. Anda juga bisa mendapatkan format teks dalam WebAssembly dan itu disebut WAT (format Teks WebAssembly). Sebagai pengembang, Anda tidak seharusnya menulis kode di WebAssembly, sebaliknya, Anda harus mengkompilasi bahasa tingkat tinggi seperti C, C ++ dan Rust ke WebAssembly.

Kode WAT

Mari kita tulis kode WAT secara bertahap.

Step 1 - Titik awal dalam WAT adalah mendeklarasikan modul.

(module)

Step 2 - Mari kita sekarang, tambahkan beberapa fungsi ke dalamnya dalam bentuk fungsi.

Fungsi tersebut dideklarasikan seperti yang ditunjukkan di bawah ini -

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

Fungsi dimulai dengan kata kunci func yang diikuti oleh parameter atau hasil.

Parameter / Hasil

Parameter dan nilai kembalian sebagai hasilnya.

Parameter dapat memiliki tipe berikut yang didukung oleh wasm -

  • i32: bilangan bulat 32-bit
  • i64: Integer 64-bit
  • f32: float 32-bit
  • f64: mengapung 64-bit

Parameter untuk fungsi ditulis seperti di bawah ini -

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

Hasilnya akan ditulis sebagai berikut -

  • (hasil i32)
  • (hasil i64)
  • (hasil f32)
  • (hasil f64)

Fungsi dengan parameter dan nilai kembali akan ditentukan sebagai berikut -

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

Variabel Lokal

Variabel lokal adalah variabel yang Anda butuhkan dalam fungsi Anda. Nilai lokal untuk fungsi tersebut akan ditentukan sebagai berikut -

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

Fungsi Tubuh

Badan fungsi adalah logika yang harus dilakukan. Program terakhir akan terlihat seperti ini -

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

Step 3 - Untuk membaca dan mengatur parameter dan variabel lokal.

Untuk membaca parameter dan variabel lokal, gunakan get_local dan set_local perintah.

Example

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

Sesuai tanda tangan fungsi,

  • get_local 0 akan memberikan param i32

  • get_local 1 akan memberikan parameter selanjutnya param i32

  • get_local 2 akan memberi local value i32

Alih-alih merujuk ke parameter dan penduduk setempat menggunakan nilai numerik seperti 0,1,2, Anda juga dapat menggunakan nama sebelum parameter, mengawali nama dengan tanda dolar.

Contoh berikut menunjukkan, bagaimana menggunakan nama dengan parameter dan lokal.

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 - Instruksi dalam tubuh Fungsi dan eksekusi.

Eksekusi di wasm mengikuti strategi stack. Instruksi yang dijalankan dikirim satu per satu di tumpukan. Misalnya, instruksi get_local $ a akan mendorong nilai, terbaca di tumpukan.

Instruksi seperti i32.add yang akan menambah kemauan memunculkan elemen dari tumpukan.

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

Instruksi untuk i32.add adalah ($a+$b). Nilai akhir i32.add, akan didorong ke tumpukan dan itu akan ditetapkan ke hasilnya.

Jika tanda tangan fungsi memiliki hasil yang dideklarasikan, seharusnya ada satu nilai dalam tumpukan di akhir eksekusi. Jika tidak ada parameter hasil, tumpukan harus kosong di akhir.

Jadi, kode terakhir bersama dengan function body adalah sebagai berikut -

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

Step 5 - Melakukan panggilan ke fungsi tersebut.

Kode terakhir dengan badan fungsi seperti yang ditunjukkan pada langkah 4. Sekarang, untuk memanggil fungsi, kita perlu mengekspornya.

Untuk mengekspor fungsi bisa dilakukan dengan nilai indeks seperti 0,1, tapi kita juga bisa memberi nama. Nama akan diawali dengan $ dan akan ditambahkan setelah kata kunci func.

Example

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

Fungsi $ add harus diekspor, menggunakan kata kunci ekspor seperti yang ditunjukkan di bawah ini -

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

Untuk menguji kode di atas di browser, Anda harus mengubahnya menjadi bentuk biner (.wasm). Mengaculah ke bab berikutnya yang menunjukkan bagaimana mengonversi.WAT to .WASM.