WebAssembly: znaczenie, zalety, przypadki użycia i więcej

Opublikowany: 2022-10-12

WebAssembly lub Wasm to format kodu binarnego do tworzenia programów, które można wykonywać na dowolnej architekturze komputera.

System składa się z maszyny wirtualnej i kompilatora, który tłumaczy kod komputerowy z języków programowania, takich jak C lub C++, na czytelny dla człowieka format .wat i binarny .wasm.

Pierwotnym celem WebAssembly było umożliwienie programistom tworzenia wysokowydajnych aplikacji dla stron internetowych poprzez umożliwienie niemal natywnej szybkości wykonywania w przeglądarce. Ale technologia wydaje się teraz ewoluować poza przeglądarki i do chmury.

Ten przewodnik pokazuje wszystko, co musisz wiedzieć o tej rozwijającej się technologii, jej mocnych i słabych stronach, a także jej przyszłym potencjale.

Spis treści

Co to jest WebAssembly?

WebAssembly to format kodu binarnego, który działa na maszynie wirtualnej i do którego można kompilować różne języki. Został zaprojektowany jako przenośny i może działać w przeglądarce internetowej lub jako aplikacja serwerowa.

Wydany po raz pierwszy w 2017 r. WebAssembly jest rekomendacją W3C od 2019 r. i jest utrzymywany przez wielu współpracowników, w tym Mozillę, Google, Microsoft, Red Hat i wielu innych.

Pierwotnym celem było opracowanie prawie natywnej szybkości wykonywania, takiej jak w aplikacjach C/C++ w przeglądarce. Ma być również bezpiecznym, otwartym standardem, debugowalnym i pozbawionym wersji standardem internetowym, który jest zgodny wstecz i zgodny z JavaScript.

Jak działa WebAssembly?

WebAssembly został zaprojektowany jako silnik wykonawczy, taki jak Java lub JavaScript, który można osadzić w środowisku przeglądarki lub serwera w celu uruchamiania kodu komputerowego skompilowanego w formacie binarnym .wasm lub tekstowym .wat.

Aby napisać kod do wykonania WebAssembly, deweloper pisze program w dowolnym z wielu obsługiwanych języków. Następnie skompiluj go za pomocą kompilatora WebAssembly AOT (z wyprzedzeniem) lub JIT (w samą porę).

Ten kod może wykonywać większość pracy w środowisku wykonawczym, ale nie może uzyskać dostępu ani modyfikować obiektów DOM przeglądarki. Każda taka interakcja musi przejść przez JavaScript.

Jak stworzyć przykładową aplikację WebAssembly

Stworzenie prostej aplikacji Wasm dla przeglądarki internetowej jest możliwe w zaledwie kilku krokach, jak widać poniżej:

  1. Pobierz i zainstaluj pakiet SDK Emscripten.
  2. Napisz przykładowy kod helloworld.c lub zrób to w C++/Rust, jeśli wolisz.
  3. Uruchom emcc helloworld.c -s WASM=1 -s helloworld.html w terminalu, aby skompilować kod do WebAssembly za pomocą Emscripten. Utworzy potrzebne pliki binarne Wasm, HTML i JavaScript (kod kleju).
  4. Wyświetlaj stronę helloworld.html za pomocą przeglądarki internetowej.

Zalety WebAssembly

Istnieje wiele powodów, dla których warto przyjąć WebAssembly i związane z nim technologie, są to między innymi:

  • Wydajność prawie natywna — WebAssembly ma tak niskopoziomowy projekt, że oferuje wydajność podobną do języków niskiego poziomu, takich jak C i C++.
  • Bezpieczeństwo — system został zaprojektowany tak, aby był bezpieczny poprzez odizolowanie go w środowisku wirtualnym z ograniczonym dostępem do systemu.
  • Otwarty standard – Wiele organizacji i osób prywatnych uczestniczy w WebAssembly i jest to oficjalna rekomendacja W3C.
  • Lekkie — WebAssembly kompiluje się do kodu binarnego do wykonania na maszynie wirtualnej. Ten kod jest przenośny i nie wymaga ani nie jest dostarczany z plikami systemowymi.
  • Obsługa wielu języków — ponad 50 języków można skompilować w WebAssembly.
  • Niezależna od platformy — maszyna wirtualna WebAssembly jest zaprojektowana dla każdej architektury, aby prezentować to samo środowisko wykonawcze. Jedyne, co musi zrobić programista, to napisać kod dla WebAssembly.

Ograniczenia WebAssembly

  • Prace w toku – standard jest wciąż w fazie rozwoju, dlatego wiele funkcji i ulepszeń ma dopiero nadejść.
  • Brak wyrzucania elementów bezużytecznych — WebAssembly nadal nie ma wyrzucania elementów bezużytecznych, chociaż może niedługo zostać zaimplementowane.
  • Brak dostępu do DOM – Nie możesz uzyskać dostępu do DOM przeglądarki internetowej bezpośrednio z WebAssembly, musisz przejść przez JavaScript.

WebAssembly a Java

Java jest swego rodzaju najwcześniejszą implementacją WebAssembly. Został zaprojektowany jako język jednokrotnego zapisu, który można uruchomić w dowolnym miejscu, ale po drodze rozwinął wiele problemów.

Podobnie jak w Javie, WebAssembly używa RE (Runtime Environment) do wykonania swojego kodu, ale w przeciwieństwie do Javy, WebAssembly możesz pisać w wybranym przez siebie języku.

WebAssembly a JavaScript

WebAssembly wykonuje się w przeglądarce lub innym środowisku hosta, podobnie jak JavaScript. Jednak tam, gdzie JavaScript jest dostarczany do środowiska wykonawczego w formacie tekstowym i jest kompilowany na czas, WebAssembly ma zarówno format tekstowy, jak i binarny.

W przeglądarkach internetowych JavaScript ma dostęp do DOM, podczas gdy WebAssembly nie. Jednak jeśli chodzi o szybkość wykonywania, WebAssembly bije na głowę JavaScript, z jego niemal natywną szybkością wykonywania kodu.

Szybkość to miejsce, w którym błyszczy WebAssembly i dlatego jest idealny do tak wielu zastosowań. Możesz załadować WebAssembly do przeglądarki za pomocą JavaScript, a dwa kody mogą działać razem i udostępniać zasoby.

WebAssembly vs Docker vs Kubernetes

Docker i Kubernetes to dwie popularne technologie wspomagające przetwarzanie w chmurze. Docker to technologia kontenerów, która umożliwia programistom spakowanie aplikacji ze wszystkimi jej zależnościami systemowymi w jednym pakiecie. Ułatwia to wdrożenie aplikacji w dowolnym środowisku chmury w sekundę lub mniej.

Z drugiej strony Kubernetes to system typu open source do zarządzania i wdrażania aplikacji kontenerowych, takich jak Docker, CRI-O, containerd i dowolna implementacja Kubernetes CRI (Container Runtime Interface). Kubernetes ułatwia również skalowanie wdrożeń w chmurze na wielu serwerach lub maszynach wirtualnych.

Z tego punktu widzenia WebAssembly jest bardziej podobny do Dockera i może być uruchamiany jako konteneryzowana aplikacja w chmurze przy użyciu Kubernetes. Oferuje również wiele zalet w stosunku do Dockera, ale prawdopodobnie go nie zastąpi.

Poza przeglądarką

Na początku były serwery WWW. Musiałeś przeznaczyć pełną maszynę jako serwer. Następnie istniały maszyny wirtualne lub maszyny wirtualne, które pozwalały serwerowi działać tylko na jednym lub więcej wątkach procesora. Mimo to musiałeś mieć dedykowaną maszynę wirtualną.

Przetwarzanie w chmurze umożliwiło uruchamianie i uruchamianie serwerów tylko wtedy, gdy jest to potrzebne poprzez konteneryzację aplikacji. Doprowadziło to do obniżenia kosztów, ponieważ płaciłeś tylko za to, z czego korzystasz – nigdy więcej dedykowanych maszyn. Ale jest jeszcze kilka problemów.

Po pierwsze, pliki dockera mogą mieć kilka gigabajtów, co oznacza niewielkie opóźnienie w uruchamianiu i innych problemach z zarządzaniem. Jednak podobny plik Wasm może mieć tylko kilka MB, ponieważ jest to wstępnie skompilowany plik binarny. Daje to znacznie szybszy czas uruchamiania niż Docker, idealny do niektórych aplikacji, w których czas ma krytyczne znaczenie.

Po drugie, projekt WebAssembly oznacza, że ​​programista nie musi zarządzać i przydzielać zasobów systemowych, może po prostu przejść do sedna, używając wybranego przez siebie języka programowania.

Te funkcje sprawiają, że WebAssembly jest idealny do uruchamiania mikrousług w chmurze, chociaż aplikacje Docker są nadal preferowane w przypadku aplikacji, które wymagają większej kontroli nad środowiskiem operacyjnym i systemem plików.

Aby uzyskać więcej informacji, projekty takie jak WasmCloud i WasmEdge rozwijają WebAssembly w realną platformę obliczeniową.

Przypadki użycia Wasm

Istnieje wiele przypadków użycia WebAssembly, biorąc pod uwagę jego szczególny charakter. Można je podzielić na trzy główne grupy; konfiguracje w przeglądarce, poza przeglądarką i hybrydowe.

Typ w przeglądarce jest oczywisty, a poza przeglądarką odnosi się głównie do wdrożeń serwerów, IoT i chmury, podczas gdy hybryda odnosi się do ich połączenia.

Poniżej przedstawiamy przypadki użycia, w których Wasm może się wyróżniać:

  • Już istniejący kod o wysokiej wydajności — Stary, ale wspaniały kod, który można po prostu przenieść do WebAssembly.
  • Nowy kod o wysokiej wydajności – te, które musisz zaprojektować i wdrożyć od podstaw.
  • Przenoszenie aplikacji komputerowych do sieci — może to otworzyć nowy rodzaj internetowych rozwiązań komputerowych, takich jak internetowa edycja wideo.
  • Przetwarzanie w chmurze — działaj razem z platformami Docker i Kubernetes, aby uzyskać nowe możliwości.

Poniżej przedstawiamy konkretne aplikacje i scenariusze, w których Wasm może się wyróżniać:

  • Edycja wideo i obrazów
  • Design gry
  • Aplikacje AI
  • Aplikacje wirtualnej i rozszerzonej rzeczywistości
  • Aplikacje muzyczne
  • Aplikacje P2P
  • Aplikacje po stronie serwera
  • Obliczenia chmur/klastrów
  • Projektowanie wspomagane komputerowo
  • Symulacja platformy OS
  • Szyfrowanie
  • Lokalny serwer WWW
  • Aplikacje pulpitu zdalnego
  • Wizualizacje naukowe
  • Hybrydowe aplikacje natywne na smartfony
  • Na urządzeniach IoT

Lista obsługiwanych języków i frameworków

Ponad 50 języków kompiluje się do WebAssembly, a oto niektóre z najpopularniejszych:

  • C
  • C++
  • R
  • Rubin
  • Szybki
  • Iść
  • Kotlin
  • Rdza
  • PHP
  • Blazor — platforma dla deweloperów platformy .NET.
  • JwebAssembly — kompilator kodu bajtowego Java i powiązanych języków, takich jak JRuby, Jython, Groovy, Scala i Kotlin.
  • Yew – Framework Rust do tworzenia wielowątkowych aplikacji internetowych przy użyciu WebAssembly.
  • AssemblyScript — język zaprojektowany specjalnie do tworzenia kodu WebAssembly.
  • Ziarno – mocno typowany język funkcjonalny.
  • Motoko

Więcej języków znajdziesz tutaj.

Lista środowisk wykonawczych i narzędzi WebAssembly

  • Wszystkie główne przeglądarki obsługują Wasm
  • Pyodide – środowisko uruchomieniowe Pythona w przeglądarce ze stosem naukowym Pythona, w tym Pandas, NumPy, SciPy.
  • Wamira
  • wagi – dla mikroserwisów i aplikacji internetowych
  • Wasi – Modułowy interfejs systemowy
  • WasmTime — szybkie i bezpieczne środowisko uruchomieniowe WebAssembly.
  • Wasmer
  • Lucet
  • wasmCloud – środowisko w chmurze
  • Krustlet – Kubernetes kublete do uruchamiania Wasm, napisany w Rust.
  • WasmEdge — środowisko uruchomieniowe w chmurze i brzegowe

Wniosek

Doszliśmy do końca naszej podróży do WebAssembly i tego, co oznacza dla komputerów. I jak widać, niesie ze sobą wiele obietnic.

Jest to jednak wciąż praca w toku, ale w ciągłym rozwoju. A jeśli jesteś zainteresowany, więcej informacji znajdziesz tutaj, tutaj i tutaj.