Menelusuri spesifikasi Wasm 3.0 saat ini: WasmGC, exception handling dengan exnref, tail-call, multi-memory, relaxed SIMD, dan flexible vectors, plus baseline Wasm 2.0 sebagai fondasinya

Setelah di episode 7 dan 8 kalian menguasai kedua toolchain utama — Rust/wasm-pack dan C++/Emscripten — pada episode ini kita berhenti sejenak dan melihat arah spesifikasi Wasm ke depan. Wasm bukan teknologi beku: sejak Wasm 1.0 menjadi W3C Recommendation pada 2019, puluhan proposal terus diadopsi, dan kini kita berada di era Wasm 3.0.
Mengapa memahami versi penting? Karena setiap fitur baru mengubah cara kalian menulis dan mengoptimalkan kode. WasmGC membuka pintu bagi bahasa yang punya garbage collector. Exception handling membuat error handling lintas bahasa menjadi mungkin. Dan ketika kalian memilih runtime atau target toolchain, mengetahui fitur yang didukung akan mencegah kejutan di production.
Garis besar evolusi spesifikasi:
| Versi | Status | Fitur Kunci |
|---|---|---|
| Wasm 1.0 | W3C REC, 5 Des 2019 | Fondasi: i32/i64/f32/f64, memory, tables |
| Wasm 2.0 | Candidate Recommendation, 16 Jun 2025 | SIMD, reference types, bulk memory, multi-value |
| Wasm 3.0 | Spesifikasi saat ini (2026) | WasmGC, exception handling, tail-call, multi-memory, relaxed SIMD, flexible vectors |
Wasm 2.0 bisa dianggap sebagai baseline modern — fitur-fitur yang sudah didukung secara luas oleh semua engine. Wasm 3.0 menambahkan proposal besar yang sedang dalam proses adopsi bertahap.
Tiga fitur baseline yang kalian bisa andalkan hari ini:
SIMD (Single Instruction, Multiple Data) memungkinkan satu instruksi mengolah beberapa nilai sekaligus — misalnya menjumlahkan 4 float dalam satu operasi v128. Di Rust, ini diakses lewat std::simd; di C/C++, compiler otomatis menghasilkan instruksi SIMD dari loop yang bisa divektorisasi.
wasm-tools validate --features simd modul.wasmUntuk workload image processing, audio, atau kriptografi, SIMD bisa memberikan percepatan 2-4x — topik yang kita optimalkan di episode 13 dan 15.
Reference types memungkinkan nilai seperti externref (referensi ke objek host) dan funcref (referensi fungsi) dipakai dalam tanda tangan fungsi, tables, dan locals. Ini memungkinkan passing objek JS langsung tanpa serialisasi — fondasi interop yang lebih efisien.
Bulk memory menambah instruksi seperti memory.copy, memory.fill, dan table.init — operasi blok yang jauh lebih cepat daripada loop load/store per elemen.
WasmGC menambahkan tipe baru seperti (struct), (array), dan referensi yang bisa dikoleksi garbage collector host. Dampaknya besar: bahasa dengan GC — C# (.NET), Kotlin, Java, Python — bisa dikompilasi langsung ke Wasm tanpa menyertakan runtime GC sendiri.
(module
(type $point (struct (field $x i32) (field $y i32)))
(func $buat (result (ref $point))
(struct.new $point (i32.const 3) (i32.const 4))
)
(export "buat" (func $buat))
)Konsekuensi praktisnya: kalian bisa menjalankan Kotlin/Wasm atau .NET 10 langsung di browser tanpa JIT runtime raksasa. Kita bedah lebih dalam di episode 21.
Wasm murni tidak punya mekanisme exception — bahasa seperti C++ dan Rust (panic) harus mengelola error secara manual. Proposal ini menambahkan try/catch/throw dengan exception reference (exnref):
(module
(tag $e (param i32))
(func $coba (result i32)
(try (result i32)
(do
i32.const 42
)
(catch $e
i32.const 0
)
)
)
(export "coba" (func $coba))
)Dampaknya: bahasa compile-to-wasm bisa melemparkan error yang menyeberang batas modul dan ditangkap oleh bahasa lain atau oleh JS — kohesi yang selama ini mustahil.
Optimasi tail-call memungkinkan rekursi ekor dikompilasi menjadi loop tanpa menumbuhkan call stack. Ini penting untuk pemrograman fungsional dan untuk mempertahankan stack Wasm yang dangkal.
Proposal ini mengizinkan modul memiliki lebih dari satu linear memory. Manfaatnya: pisahkan memory untuk data user dan memory internal (misal untuk state VM) — meningkatkan isolasi dan mengurangi kesalahan offset.
Kapan fitur-fitur ini kalian pakai? Aturan praktisnya:
-O2 di emcc/rustc sudah memanfaatkan beberapa di antaranya.Tip
Cek dukungan fitur runtime kalian secara eksplisit: wasm-tools validate --features untuk mengetes modul terhadap proposal tertentu, dan WebAssembly.validate di browser memakai flag kompilasi runtime. Jangan berasumsi semua fitur sudah aktif.
Warning
Jangan membangun seluruh produk di atas fitur Wasm 3.0 yang belum diaktifkan default di semua engine — periksa matriks dukungan runtime yang kalian targetkan, lalu siapkan fallback. Fitur yang belum aktif akan menolak modul kalian dengan error validasi.
Pada episode 9 ini, kalian telah memahami peta spesifikasi Wasm dari 1.0 sampai 3.0 beserta proposal-proposal besarnya.
Inti yang harus dibawa pulang:
Di episode 10 selanjutnya kita akan membahas WASI 0.2/0.3 dan Component Model — system interface di luar browser (files, clocks, HTTP, random), komposisi antar bahasa via WIT interfaces, dan model async native WASI 0.3 dengan async func, stream, dan future. Sampai jumpa di episode 10!