Podręcznik

11. Wydajność aplikacji internetowych

11.3. WebAssembly

Jedną z rodzących się technik przyśpieszana aplikacji wymagających skomplikowanych obliczeń po stronie klienckiej jest WebAssembly [41]. Jest to binarny zapis instrukcji dla stosowej maszyny wykonawczej zaprojektowany z myślą o małym rozmiarze, szybkim ładowaniu i możliwości uzyskania natywnej szybkości wykonywania na wielu platformach. Posiada swoją własną postać tekstową, ale głównym zadaniem jest bycie celem kompilacji z innych języków programowania jak C++[43], Rust [42], Python [45], Go [44]. Daje to możliwość programowania aplikacji webowych lub ich komponentów w innych językach niż JavaScript przy zachowaniu doskonałej wydajności. Aplikacje skompilowane do modułu WebAssembly mogą być wykonywane nie tylko przez przeglądarki, ale także w backendzie przez samodzielne maszyny wykonawcze jak WasmEdge [46], Wasmer [47]. Środowisko uruchomieniowe WebAssembly w przeglądarkach umożliwia współpracę pomiędzy JavaScript-em a modułami WebAssembly poprzez mechanizm importu i eksportu funkcji z modułu WebAssembly. WebAssembly nie ma bezpośredniego dostępu do modelu obiektowego dokumentu (DOM) i odpowiednie operacje wykonywane są poprzez wywoływanie funkcji JavaScript. Jednakże środowiska poszczególnych języków dostarczają warstwę abstrakcji ułatwiającą dostęp do API przeglądarki ukrywając niezbędne przejście do warstwy JavaScript [43].

Z punktu widzenia wydajności, WebAssembly najlepiej sprawdza się tam, gdzie interakcja ze środowiskiem zewnętrznym poprzez API przeglądarki jest ograniczona – w obliczeniach numerycznych, w tym jako backend dla sieci neuronowych [48]. Ciekawym, wartym wspomnienia zastosowaniem WebAssembly jest tworzenie środowisk dla języków interpretowanych – na przykład Pyodide [49] dla języka Python czy też Blazor [50] dla .NET.