encyklopedia.space

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, f64 oraz najnowszych v128 (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-unknown lub wasm32-wasi.
  • Emscripten – zestaw narzędzi bazujący na LLVM, upraszczający integrację z JavaScript i systemem plików.
  • Rust – posiada wbudowany target wasm32-unknown-unknown i bibliotekę wasm-bindgen do 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