WebAssembly
WebAssembly (skrócone jako Wasm) jest otwartym, niskopoziomowym formatem binarnym oraz wirtualną maszyną przeznaczoną do uruchamiania kodu w przeglądarkach internetowych oraz w środowiskach poza przeglądarką. Został zaprojektowany jako wydajna alternatywa dla JavaScript przy jednoczesnym zachowaniu bezpieczeństwa i przenośności.
Historia
Projekt WebAssembly rozpoczął się w 2015 roku jako wspólna inicjatywa trzech dużych firm technologicznych: Mozilla Foundation, Google i Microsoft, przy współpracy z Apple. Pierwsza wersja specyfikacji, znana jako WebAssembly 1.0, została opublikowana w marcu 2017 roku i od tego momentu wszystkie główne przeglądarki (Chrome, Firefox, Edge, Safari) wprowadziły pełne wsparcie.
Architektura i format
WebAssembly jest formatem binarnym, który po skompresowaniu jest jeszcze mniejszy niż kod JavaScript o podobnej funkcjonalności. Jego struktura opiera się na trzech głównych komponentach:
- Moduł – samodzielna jednostka zawierająca sekcje takie jak typy, funkcje, pamięć, tabele i kod.
- Instancja – uruchomiona wersja modułu, posiadająca własny kontekst wykonania.
- Maszyna wirtualna – interpreter lub JIT-kompilator, który tłumaczy bytecode Wasm na instrukcje natywne CPU.
Rodzaje instrukcji i typy danych
WebAssembly definiuje ograniczony zestaw typów prymitywnych: i32, i64, f32 i f64. Dzięki temu możliwe jest efektywne mapowanie na rejestry procesorów. Instrukcje operują bezpośrednio na stosie, co upraszcza model wykonania i przyspiesza optymalizacje w czasie rzeczywistym.
Kompatybilność językowa
Jednym z kluczowych celów WebAssembly jest umożliwienie kompilacji kodu napisanego w wielu językach wysokiego poziomu. Do najpopularniejszych narzędzi kompilujących do Wasm należą:
- Emscripten – kompilator bazujący na LLVM, obsługujący C i C++.
- Rust – posiada natywny backend
wasm32-unknown-unknown. - AssemblyScript – podzbiór TypeScript kompilujący bezpośrednio do Wasm.
- Go – od wersji 1.11 oferuje eksperymentalne wsparcie dla WebAssembly.
Interoperacyjność z JavaScriptem
WebAssembly nie jest samodzielnym środowiskiem – współpracuje ściśle z JavaScript poprzez interfejs WebAssembly dostępny w DOM. Dzięki temu aplikacje mogą wymieniać dane, wywoływać funkcje i korzystać z API przeglądarki, takiego jak WebGL czy Web Audio API.
Bezpieczeństwo
Podobnie jak JavaScript, WebAssembly działa w tzw. sandboxie – odizolowanym środowisku, które uniemożliwia bezpośredni dostęp do pamięci systemowej i zasobów operacyjnych. Wszystkie odwołania do pamięci odbywają się w obrębie liniowego bufora, co eliminuje ryzyko klasycznych ataków typu buffer overflow.
Zastosowania
WebAssembly znajduje zastosowanie w wielu dziedzinach:
- Gry i grafika 3D – porty silników Unity i Unreal Engine działają w przeglądarce.
- Kompresja i edycja multimediów – biblioteki FFmpeg i ImageMagick kompilowane do Wasm umożliwiają przetwarzanie wideo i obrazów po stronie klienta.
- Uczenie maszynowe – ramy takie jak TensorFlow.js wykorzystują Wasm do przyspieszenia inferencji.
- Aplikacje biurowe – edytory LibreOffice oraz przeglądarki PDF w wersji webowej.
- Środowiska serwerowe – Node.js obsługuje moduły Wasm, co pozwala na uruchamianie ich w backendzie.
Rozwój i przyszłe wersje
Po sukcesie wersji 1.0, społeczność pracuje nad kolejnymi rozszerzeniami. WebAssembly 2.0 ma wprowadzić m.in.:
- Obsługę SIMD (Single Instruction, Multiple Data) dla lepszej wydajności obliczeń wektorowych.
- Rozszerzenia wątków (SharedArrayBuffer) umożliwiające równoległe przetwarzanie.
- Funkcje GC oraz obsługę bardziej złożonych typów referencyjnych.
- Moduł WASI (WebAssembly System Interface) – standardowy interfejs systemowy pozwalający uruchamiać aplikacje Wasm poza przeglądarką.
Powiązane pojęcia
- ECMAScript – standard języka JavaScript, z którym Wasm współdziała.
- Format binarny – sposób kodowania instrukcji Wasm.
- JIT – technika kompilacji wykorzystywana przez przeglądarki do tłumaczenia Wasm na kod natywny.
- WASI – projekt umożliwiający uruchamianie WebAssembly w środowiskach serwerowych i systemowych.