encyklopedia.run.place

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.