WebAssembly
WebAssembly (skrótowo Wasm) – otwarty standard binarnego kodu bajtowego przeznaczonego do uruchamiania w przeglądarkach internetowych oraz w środowiskach poza nimi. Standard definiuje wirtualną maszynę, zestaw instrukcji, format plików oraz interfejsy programistyczne (API), które umożliwiają wydajne wykonywanie kodu napisanego w językach takich jak C, C++, Rust, Go czy AssemblyScript.
Historia
Koncepcja binary web format powstała w 2015 roku w ramach inicjatywy W3C. Pierwsza wersja specyfikacji została przyjęta w 2017 roku i od tego czasu jest rozwijana przez grupę WebAssembly Community Group. W 2018 przeglądarki Chrome, Firefox, Safari i Edge wprowadziły wsparcie produkcyjne.
Architektura i zasady działania
WebAssembly składa się z trzech warstw:
- Format pliku – binarny, kompaktowy, oparty na LEB128 oraz sekcjach opisujących typy, funkcje, importy/eksporty i dane.
- Maszyna wirtualna – definiuje zestaw instrukcji (~150) działających na 32‑bitowych i 64‑bitowych wartościach, z obsługą typów
i32,i64,f32,f64oraz najnowszychv128(SIMD). - API hosta – pozwala praktycznemu kodowi WebAssembly komunikować się z otoczeniem (np. JavaScript) poprzez importy i eksporty funkcji oraz dostęp do pamięci liniowej.
Języki docelowe i narzędzia
Do kompilacji do WebAssembly najczęściej wykorzystuje się:
- LLVM – poprzez backend
wasm32-unknown-unknownlubwasm32-wasi. - Emscripten – zestaw narzędzi bazujący na LLVM, upraszczający integrację z JavaScript i systemem plików.
- Rust – posiada wbudowany target
wasm32-unknown-unknowni bibliotekęwasm-bindgendo interoperacyjności. - AssemblyScript – język podobny do TypeScript, kompilujący bezpośrednio do Wasm.
Bezpieczeństwo
WebAssembly działa w izolowanym środowisku sandbox, co oznacza, że nie ma bezpośredniego dostępu do pamięci systemowej, plików czy innych zasobów. Wszystkie operacje muszą być przeprowadzone za pośrednictwem importowanych funkcji hosta, które podlegają politykom bezpieczeństwa przeglądarki. Dzięki temu:
- nie ma możliwości przeprowadzenia przepełnienia bufora poza przydzieloną pamięcią liniową,
- kod jest weryfikowany pod kątem poprawności strukturalnej przed wykonaniem,
- nie ma dostępu do systemowych wywołań API bez wyraźnego zezwolenia.
Przykłady zastosowań
WebAssembly znajduje zastosowanie w licznych dziedzinach:
- Gry przeglądarkowe – porty silników Unity i Unreal Engine.
- Aplikacje multimedialne – edytory zdjęć i wideo działające w przeglądarce, np. FFmpeg w WebAssembly.
- Obliczenia naukowe – biblioteki numeryczne (NumPy, TensorFlow) przyspieszone przy użyciu Wasm.
- Rozszerzenia systemowe – platforma WASI (WebAssembly System Interface) umożliwiająca uruchamianie aplikacji Wasm poza przeglądarką, np. w Node.js czy Dockerze.
Porównanie z innymi technologiami
W porównaniu z tradycyjnym JavaScript, WebAssembly oferuje:
| Cecha | WebAssembly | JavaScript |
|---|---|---|
| Format | Binarne, kompaktowe | Tekstowy |
| Wydajność | Zbliżona do natywnej (≈80‑90 % kodu C/C++) | Interpretowane/JIT – zależne od silnika |
| Typowanie | Statyczne, silnie typowane | Dynamiczne |
| Bezpieczeństwo | Silny sandbox, brak dostępu do systemu | Sandbox, ale możliwość exploitu poprzez API przeglądarki |
| Interoperacyjność | Poprzez importy/eksporty oraz WebAssembly.instantiateStreaming |
Bezpośredni dostęp do DOM i API przeglądarki |
Przyszłość
Rozwój WebAssembly obejmuje m.in.:
- Rozszerzenia SIMD – przyspieszenie obliczeń wektorowych.
- Wielowątkowość dzięki Threads i SharedArrayBuffer.
- Rozszerzenia GC – integracja z językami zarządzającymi pamięcią.
- Dalsza integracja z WASI i możliwości uruchamiania Wasm jako natywnej aplikacji serwerowej.
Bibliografia
- Specyfikacja WebAssembly – WebAssembly Specification.
- „WebAssembly: The Future of Web Performance”, artykuł w IEEE Software, 2020 rok.
- Dokumentacja Emscripten oraz Rust Wasm Book.