Konsorcjum W3C ogłosiło gotowość specyfikacji standaryzującej kod pośredni WebAssembly 3.0 oraz związane z nim API, które umożliwia tworzenie wysokowydajnych aplikacji przenośnych między przeglądarkami i platformami sprzętowymi. WebAssembly zapewnia niezależny od przeglądarki uniwersalny kod pośredni niskiego poziomu do uruchamiania aplikacji skompilowanych z różnych języków programowania.
Technologia WebAssembly może być wykorzystywana do wykonywania w przeglądarce zadań wymagających wysokiej wydajności, takich jak kodowanie wideo, przetwarzanie dźwięku, manipulacje grafiką i 3D, rozwój gier, operacje kryptograficzne oraz obliczenia matematyczne poprzez organizację wykonywania w przeglądarce kodu napisanego w językach kompilowanych, takich jak C/C++. Dzięki wykorzystaniu JIT, WebAssembly może osiągnąć poziom wydajności zbliżony do kodu natywnego.
Do głównych zadań WebAssembly należy zapewnienie przenośności, przewidywalności zachowania oraz tożsamości wykonania kodu na różnych platformach. WebAssembly nie ogranicza się tylko do przeglądarek, ale jest także promowane jako uniwersalna platforma do bezpiecznego wykonywania kodu w dowolnych infrastrukturach, systemach operacyjnych i urządzeniach.
Dostępne są następujące specyfikacje:
- WebAssembly Core — opisuje niskopoziomową maszynę wirtualną do wykonywania kodu pośredniego WebAssembly. Związane z WebAssembly zasoby dostarczane są w formacie „.wasm”, podobnym do plików „.class” w Javie, zawierającym dane statyczne i segmenty kodu do pracy z tymi danymi.
- WebAssembly JavaScript API — udostępnia API do integracji z JavaScript. Umożliwia pobieranie wartości i przekazywanie parametrów do funkcji WebAssembly. Wykonanie WebAssembly jest zgodne z modelem bezpieczeństwa JavaScript, a wszystkie interakcje z systemem głównym odbywają się analogicznie do wykonania kodu JavaScript.
- WebAssembly Web API — definiuje programinterfejs oparty na mechanizmie Promise do żądania i wykonywania zasobów „.wasm”. Format zasobów WebAssembly jest zoptymalizowany pod kątem szybkiego rozpoczęcia wykonania, bez czekania na pełne załadowanie pliku, co pozwala zwiększyć responsywność aplikacji webowych.
- WASI API — definiuje modułowy interfejs systemowy do uruchamiania WebAssembly poza przeglądarkami i zapewnia dostęp do zasobów takich jak pliki, połączenia sieciowe, generator liczb pseudolosowych oraz zegary systemowe.
Zauważono, że w nowej wersji standardu znacznie poprawiono wsparcie dla kompilacji do WebAssembly języków wysokiego poziomu. Na przykład, zaimplementowano możliwość kompilacji projektów w językach Java, OCaml, Scala, Kotlin, Scheme i Dart do WebAssembly. Główne zmiany w WebAssembly 3.0 w porównaniu do drugiej wersji standardu:
- Wdrożono wsparcie dla 64-bitowej przestrzeni adresowej. Do adresowania pamięci może być teraz używany typ i64, a nie tylko i32, co rozszerza dostępne dla aplikacji przestrzenie adresowe z 4 GB do 16 EB (przy wykonaniu w przeglądarce wprowadzono ograniczenie do 16 GB).
- Zwiększono możliwość jednoczesnego użycia w jednym module WebAssembly kilku obiektów pamięci oraz pracy w różnych przestrzeniach adresowych. Między innymi możliwe jest kopiowanie danych pomiędzy różnymi egzemplarzami obiektów pamięci, umieszczonymi w różnych przestrzeniach adresowych.
- Dodano wsparcie dla zbierania śmieci. Oprócz wcześniej dostępnej pamięci liniowej zaproponowano oddzielny typ magazynu, automatycznie zarządzany przez zbieracza śmieci. Kompilator może teraz używać oddzielnych struktur danych, tablic i zmiennych, za które przydzielanie pamięci i zarządzanie cyklem życia odpowiada WebAssembly.
- Dodano wsparcie dla typowanych referencji, które mogą opisywać dokładną strukturę wartości, na którą wskazuje referencja, co pozwala uniknąć dodatkowych sprawdzeń w czasie wykonania. Wsparcie dla podtypów, rekurencji typów oraz możliwość bezpiecznego użycia referencji do funkcji, które nie wymagają sprawdzania typów i granic w czasie wykonania.
- Dodano wsparcie dla wywołań ogonowych (Tail call), w których bieżąca funkcja natychmiast kończy wykonanie po wywołaniu innej funkcji, nie zużywając miejsca na stosie.
- Dodano wsparcie dla obsługi wyjątków.
- Dodano wsparcie dla "rozluźnionych" (relaxed) instrukcji wektorowych SIMD, które pozwalają osiągnąć wyższą wydajność poprzez rezygnację ze ścisłego przestrzegania semantyki na wszystkich platformach sprzętowych.
- Dodano wsparcie dla deterministycznego profilu wykonania, który definiuje niezależne od bieżącej platformy zachowanie dla instrukcji, których wyniki mogą się różnić na różnych platformach (operacje na liczbach zmiennoprzecinkowych, zwracanie wartości NaN, osłabione instrukcje wektorowe). Wybierając ten profil, Wasm zapewnia deterministyczne zachowanie, reprodukowalność i przenośność.
- Dodano składnię do tworzenia własnych adnotacji, które pozwalają dołączyć dodatkowe informacje do kodu WebAssembly. Wcześniej wsparcie dla sekcji użytkownika, umożliwiających przechowywanie dowolnych informacji, istniało w binarnym formacie WebAssembly, ale brakowało w tekście WebAssembly. Teraz można dodawać te informacje w czytelnej i edytowalnej formie.
- W interfejsie API JavaScript dodano wbudowane funkcje do pracy z łańcuchami znaków. Wcześniej łańcuchy JavaScript można było przekazywać do WebAssembly tylko jako zewnętrzne odnośniki, a teraz można sięgać bezpośrednio do łańcuchów i manipulować nimi wewnątrz WebAssembly.
Źródło: opennet.ru
