WebAssembly (WASM) adalah format instruksi biner tingkat rendah (low-level) yang dirancang untuk menjalankan kode di web dengan kecepatan mendekati native speed (kecepatan aplikasi desktop asli).
Mengapa WASM lahir?
Keterbatasan JavaScript: JS adalah satu-satunya bahasa asli browser, tetapi kurang ideal untuk tugas berat (seperti video editing, 3D gaming, simulasi ilmiah).
Kebutuhan Performa: Developer butuh cara menjalankan kode dari bahasa performa tinggi (C, C++, Rust) di browser.
Timeline Singkat:
2015: Diumumkan.
2017: Didukung oleh semua browser utama (Chrome, Firefox, Safari, Edge).
2019: Menjadi standar rekomendasi W3C ke-4 untuk web (setelah HTML, CSS, JS).
2. Empat Fitur Kunci (Key Features)
Platform-Independent: Kode WASM dikompilasi satu kali dan bisa jalan di browser mana saja, OS apa saja, dan arsitektur CPU apa saja (x86, ARM).
Web Compatibility: Berjalan berdampingan dengan JavaScript. JS bisa panggil WASM, dan WASM bisa panggil JS.
Secure & Sandboxed: Berjalan di lingkungan memori yang aman dan terisolasi, sama seperti JS, sehingga tidak bisa sembarangan akses file sistem user.
Performance-Critical: Didesain khusus untuk aplikasi yang butuh perhitungan matematika berat dan cepat.
3. Arsitektur & Cara Kerja
Bagaimana kode C++ bisa jalan di Chrome?
Source Code: Developer menulis kode di C, C++, Rust, atau Go.
Kompilasi: Compiler khusus (seperti Emscripten) mengubah kode tersebut menjadi file .wasm (binary).
Distribusi: File .wasm dikirim ke browser lewat internet.
Eksekusi: Browser memiliki WASM Virtual Machine yang menerjemahkan binary .wasm menjadi Machine Code spesifik perangkat user (x86/ARM) dengan sangat cepat.
4. Struktur Memori (Linear Memory Model)
WASM tidak punya Garbage Collector otomatis seperti JS (di versi awal).
Linear Memory: Memori di WASM hanyalah satu array bytes (ArrayBuffer) yang kontinu dan bisa diubah ukurannya (resizable).
Sharing: Memori ini bisa dibaca/tulis oleh JavaScript. Jadi JS dan WASM bisa bertukar data lewat “kolam memori” yang sama ini.
Efisien dan sederhana untuk tugas tingkat rendah.
5. Integrasi dengan JavaScript (Kodingan)
Slide menunjukkan cara memuat modul WASM di JavaScript modern:
// 1. Ambil file wasmfetch('module.wasm') // 2. Ubah jadi ArrayBuffer .then(response => response.arrayBuffer()) // 3. Instansiasi modul .then(bytes => WebAssembly.instantiate(bytes)) .then(results => { const instance = results.instance; // 4. Panggil fungsi yang diekspor WASM console.log(instance.exports.add(5, 10)); });
6. Studi Kasus Penggunaan (Use Cases)
Kapan kita harus pakai WASM? Bukan untuk menggantikan JS total, tapi untuk bagian berat:
Game Engines: Unity & Unreal Engine di web.
Media Editing: Adobe Photoshop Web, Video Editor (Figma menggunakan WASM untuk render engine).
Scientific Simulation: Simulasi fisika, visualisasi data kompleks.
AI/ML: TensorFlow.js menggunakan backend WASM untuk inferensi model yang cepat.
Summary
WebAssembly (WASM) adalah revolusi performa web yang memungkinkan bahasa pemrograman tingkat rendah seperti C++, Rust, dan Go berjalan di browser dengan kecepatan Near-Native. WASM tidak menggantikan JavaScript, melainkan melengkapinya untuk tugas-tugas berat (heavy computation). Dengan arsitektur Virtual Machine berbasis stack dan model Linear Memory, WASM menjadi solusi standar W3C untuk aplikasi web masa depan yang kompleks seperti Game 3D, Video Editing, dan AI.
Additional Information (Deep Dive Teknis)
1. Konsep Stack Machine
WASM bekerja sebagai “Stack Machine”. Instruksinya beroperasi pada tumpukan nilai (stack), bukan register CPU langsung.
Contoh operasi 1 + 2:
i32.const 1 (Push angka 1 ke stack)
i32.const 2 (Push angka 2 ke stack)
i32.add (Pop dua angka teratas, jumlahkan, push hasilnya ke stack)
Desain ini membuat file binary .wasm sangat padat (kecil ukurannya) dan mudah divalidasi oleh browser.
2. Emscripten & Toolchain
Salah satu tool paling populer untuk WASM adalah Emscripten. Ia bertindak sebagai Drop-in Replacement untuk compiler C/C++ standar (seperti GCC/Clang).
Perintah compile sederhana:
emcc hello.c -o hello.html
Perintah ini akan menghasilkan file .wasm, file .js (sebagai perekat/glue code), dan file .html untuk demo langsung.
3. Berbagi Memori (SharedArrayBuffer)
Untuk aplikasi multithreading, WASM bisa menggunakan SharedArrayBuffer dan Atomics untuk berbagi data antar Web Workers tanpa perlu menyalin data (zero-copy), yang sangat meningkatkan performa konkurensi.
Spaced Repetition Questions (Review)
1. Apakah WebAssembly bertujuan untuk menggantikan JavaScript sepenuhnya?
Tidak. WASM didesain untuk bekerja berdampingan (complementary) dengan JavaScript. JS menangani interaksi UI dan logika tingkat tinggi, sementara WASM menangani komputasi berat.
2. Mengapa WASM disebut "Platform-Independent"?
Karena format biner WASM tidak terikat pada satu OS atau arsitektur prosesor tertentu. Browser memiliki Virtual Machine yang menerjemahkan kode WASM ke kode mesin perangkat pengguna secara real-time.
3. Apa itu Linear Memory dalam konteks WASM?
Model memori di mana seluruh data aplikasi disimpan dalam satu array byte yang kontinu (contiguous). Ini bisa diakses oleh WASM (baca/tulis) dan juga oleh JavaScript (sebagai ArrayBuffer).
4. Bahasa pemrograman apa saja yang bisa dikompilasi ke WASM?
Utamanya bahasa tingkat rendah seperti C, C++, Rust, dan Go. Namun sekarang bahasa seperti Python, C#, dan Kotlin juga memiliki dukungan eksperimental untuk target WASM.