WebAssembly - WASM

WebAssembly juga disebut wasm, yang merupakan perbaikan Javascript. Ini dirancang untuk berjalan di dalam browser seperti javascript dan juga dengan nodejs. Anda kebetulan mendapatkan keluaran wasm, ketika bahasa tingkat tinggi seperti C, C ++, Rust dikompilasi.

Pertimbangkan program C berikut -

int factorial(int n) {
   if (n == 0) 
      return 1; 
   else 
      return n * factorial(n-1); 
}

Manfaatkan WasmExplorer, yang tersedia dihttps://mbebenita.github.io/WasmExplorer/ untuk mendapatkan kode yang dikompilasi seperti yang ditunjukkan di bawah ini -

Format teks WebAssembly untuk program faktorial adalah seperti yang dinyatakan di bawah ini -

(module 
   (table 0 anyfunc) 
   (memory $0 1) 
   (export "memory" (memory $0)) (export "factorial" (func $factorial)) 
   (func $factorial (; 0 ;) (param $0 i32) (result i32)
      (local $1 i32) 
      (local $2 i32) 
      (block $label$0 
         (br_if $label$0 
            (i32.eqz 
               (get_local $0) 
            )
         )
         (set_local $2 
            (i32.const 1) 
         ) 
         (loop $label$1 
            (set_local $2 
               (i32.mul 
                  (get_local $0) (get_local $2) 
               ) 
            ) 
            (set_local $0 
               (tee_local $1        (i32.add 
                  (get_local $0) (i32.const -1) 
               ) 
               ) 
            ) 
            (br_if $label$1      (get_local $1) 
            ) 
         ) 
         (return 
            (get_local $2)
         ) 
      ) 
      (i32.const 1) 
   )
)

Menggunakan alat Wat2Wasm, Anda dapat melihat kode WASM, seperti yang disebutkan di bawah ini -

Pengembang tidak seharusnya menulis kode di wasm atau belajar membuat kode di dalamnya, karena sebagian besar dihasilkan saat Anda mengompilasi bahasa tingkat tinggi.

Model Mesin Stack

Di WASM, semua instruksi didorong ke tumpukan. Argumen akan muncul dan hasilnya didorong kembali ke tumpukan.

Pertimbangkan format Teks WebAssembly berikut yang menambahkan 2 angka -

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

Nama fungsinya adalah $add, dibutuhkan 2 parameter $ a dan $ b. Hasilnya adalah bilangan bulat 32-bit tipe. Variabel lokal diakses menggunakan get_local dan operasi penambahan dilakukan menggunakan i32.add.

Representasi stack untuk menambahkan 2 angka sedangkan eksekusinya adalah sebagai berikut -

Di step 1 - Eksekusi instruksi get_local $ a, parameter pertama yaitu $ a didorong pada tumpukan.

Di step 2 - Selama eksekusi instruksi get_local $ b, parameter kedua yaitu $ b didorong pada stack.

Di step 3- Eksekusi i32.add akan memunculkan elemen dari tumpukan dan akan mendorong hasilnya kembali ke tumpukan. Nilai yang tersisa di akhir tumpukan adalah hasil dari fungsi $ add.