WebAssembly (w skrócie Wasm) to niskopoziomowy format kodu binarnego, który przeglądarka uruchamia z wydajnością zbliżoną do natywnej. W praktyce oznacza to, że nie musisz pisać wszystkiego w JavaScripcie — możesz wziąć kod napisany w C, C++, Rust czy Go, skompilować go do .wasm i odpalić w tej samej karcie, w której działa Twoja strona. Wasm nie zastępuje JavaScriptu, tylko gra z nim w jednej drużynie: JS dyryguje interfejsem i logiką, a Wasm bierze na siebie ciężkie, obliczeniowe kawałki.
Jak to działa i do czego się przydaje
Kod źródłowy kompilujesz nie do kodu maszynowego konkretnego procesora, tylko do przenośnego bajtkodu Wasm. Ten format jest zaprojektowany tak, żeby przeglądarka mogła go bardzo szybko zweryfikować i przetłumaczyć na instrukcje natywne. Wszystko dzieje się w tej samej piaskownicy (sandbox) co JavaScript, więc moduł Wasm nie ma magicznego dostępu do Twojego systemu plików ani sieci — z otoczeniem rozmawia przez funkcje, które mu wprost udostępnisz.
Sięgasz po Wasm tam, gdzie JavaScript zaczyna sapać: edytory grafiki i wideo, gry 3D, kompresja, kryptografia, emulatory, obliczenia naukowe czy renderowanie PDF-ów. Co ważne, Wasm wyszedł poza przeglądarkę — dzięki standardowi WASI (WebAssembly System Interface) te same moduły uruchomisz na serwerze albo w środowiskach edge, co czyni go ciekawą alternatywą dla kontenerów przy lekkich zadaniach.
Przykład z praktyki
Klasyk to przeniesienie biblioteki C/C++ do sieci za pomocą Emscripten. Mając plik hello.c, kompilujesz go poleceniem emcc hello.c -o hello.html, a dostajesz moduł Wasm wraz z gotowym „klejem” w JS. Tak właśnie powstały webowe wersje narzędzi w rodzaju FFmpeg czy SQLite. Po stronie Rusta robotę robi wasm-pack (wasm-pack build --target web), który pakuje Twój crate do paczki gotowej do importu w bundlerze.
Mity i na co uważać
Najczęstszy mit: „Wasm jest zawsze szybszy od JavaScriptu”. Nieprawda — przy prostych operacjach na DOM-ie często przegra, bo każde przejście przez granicę JS↔Wasm i kopiowanie danych kosztuje. Wasm błyszczy dopiero przy gęstych obliczeniach na liczbach. Drugi mit: „to język programowania”. Nie — to cel kompilacji, target, do którego prowadzą inne języki. I jeszcze jedno: Wasm sam z siebie nie dotknie DOM-u — manipulacja stroną idzie zawsze przez JavaScript albo bindingi.
Pojęcia powiązane
Warto skojarzyć Wasm z: JavaScript, Emscripten, WASI, Rust, asm.js (jego protoplasta), sandbox, bajtkod, JIT oraz edge computing.