Wasm Hello World (wat2wasm) — WebAssembly

Wasm Hello World dengan WAT WAT (WebAssembly Text Format) adalah representasi teks yang human-readable dari Wasm binary. Memahami WAT membantu kamu memahami apa

Wasm Hello World dengan WAT

WAT (WebAssembly Text Format) adalah representasi teks yang human-readable dari Wasm binary. Memahami WAT membantu kamu memahami apa yang terjadi "di balik layar" saat Wasm dieksekusi.

WAT Text Format

;; add.wat — modul Wasm pertama kamu
(module
  ;; Fungsi yang menjumlahkan dua angka
  (func $add (param $a i32) (param $b i32) (result i32)
    local.get $a
    local.get $b
    i32.add
  )

  ;; Export agar bisa dipanggil dari JavaScript
  (export "add" (func $add))
)

Compile WAT ke Wasm

# Install wabt (WebAssembly Binary Toolkit)
# macOS
brew install wabt

# Ubuntu
sudo apt install wabt

# Compile .wat menjadi .wasm
wat2wasm add.wat -o add.wasm

# Inspect isi .wasm (disassemble kembali)
wasm2wat add.wasm

Load dari JavaScript

// Cara 1: WebAssembly.instantiateStreaming (recommended)
const response = await fetch("add.wasm");
const { instance } = await WebAssembly.instantiateStreaming(response);

console.log(instance.exports.add(40, 2)); // 42

// Cara 2: Manual instantiate
const response = await fetch("add.wasm");
const bytes = await response.arrayBuffer();
const { instance } = await WebAssembly.instantiate(bytes);

console.log(instance.exports.add(10, 20)); // 30

Tipe Data di WAT

Stack Machine

Wasm menggunakan model stack machine. Setiap instruksi push atau pop value dari stack:

;; Menghitung (2 + 3) * 4
(module
  (func $calc (result i32)
    i32.const 2    ;; stack: [2]
    i32.const 3    ;; stack: [2, 3]
    i32.add        ;; stack: [5]
    i32.const 4    ;; stack: [5, 4]
    i32.mul        ;; stack: [20]
  )
  (export "calc" (func $calc))
)

Yang akan kamu pelajari