Projekt Wasmer wydał drugą główną wersję, rozwijającą środowisko wykonawcze do wykonywania modułów WebAssembly, które można wykorzystać do tworzenia uniwersalnych aplikacji, które mogą działać na różnych systemach operacyjnych, a także do uruchamiania niezaufanego kodu w izolacji. Kod projektu napisany jest w języku Rust i jest rozpowszechniany na licencji MIT.
Przenośność osiąga się poprzez kompilację kodu aplikacji do niskopoziomowego kodu pośredniego WebAssembly, który można uruchomić w dowolnym systemie operacyjnym lub osadzić w programach w innych językach programowania. Programy są lekkimi kontenerami, w których uruchamiany jest pseudokod WebAssembly. Kontenery te nie są powiązane z systemem operacyjnym i mogą zawierać kod oryginalnie napisany w dowolnym języku programowania. Do kompilacji do WebAssembly można użyć zestawu narzędzi Emscripten. Aby przetłumaczyć WebAssembly na kod maszynowy bieżącej platformy, obsługuje połączenie różnych backendów kompilacji (Singlepass, Cranelift, LLVM) i silników (przy użyciu JIT lub generowania kodu maszynowego).
Kontrola dostępu i interakcja z systemem odbywa się za pomocą API WASI (WebAssembly System Interface), które udostępnia interfejsy programistyczne do pracy z plikami, gniazdami i innymi funkcjami udostępnianymi przez system operacyjny. Aplikacje są odizolowane od głównego systemu w środowisku sandbox i mają dostęp tylko do zadeklarowanej funkcjonalności (mechanizm bezpieczeństwa oparty na zarządzaniu możliwościami - dla akcji z każdym z zasobów (pliki, katalogi, gniazda, wywołania systemowe itp.), wniosek musi posiadać odpowiednie uprawnienia).
Aby uruchomić kontener WebAssembly, wystarczy zainstalować Wasmer w systemie wykonawczym, który jest dostarczany bez zewnętrznych zależności („curl https://get.wasmer.io -sSfL | sh”) i uruchomić niezbędny plik („wasmer test.wasm” ). Programy są dystrybuowane w postaci zwykłych modułów WebAssembly, którymi można zarządzać za pomocą menedżera pakietów WAPM. Wasmer jest również dostępny jako biblioteka, której można używać do osadzania kodu WebAssembly w programach Rust, C/C++, C#, D, Python, JavaScript, Go, PHP, Ruby, Elixir i Java.
Platforma pozwala na osiągnięcie wydajności wykonywania aplikacji zbliżonej do natywnych zespołów. Używając Native Object Engine dla modułu WebAssembly, możesz wygenerować kod maszynowy („wasmer Compare -native” w celu wygenerowania prekompilowanych plików obiektowych .so, .dylib i .dll), który wymaga minimalnego czasu działania, ale zachowuje całą izolację piaskownicy cechy. Istnieje możliwość dostarczenia prekompilowanych programów z wbudowanym Wasmerem. Do tworzenia dodatków i rozszerzeń oferowane są Rust API i Wasm-C-API.
Znacząca zmiana numeru wersji Wasmera wiąże się z wprowadzeniem niekompatybilnych zmian w wewnętrznym API, które zdaniem twórców nie dotkną 99% użytkowników platformy. Wśród zmian psujących kompatybilność jest także zmiana formatu serializowanych modułów Wasm (moduły serializowane w Wasmer 1.0 nie będą mogły być użyte w Wasmer 2.0). Inne zmiany:
- Obsługa instrukcji SIMD (Single Manual, Multiple Data), umożliwiająca równoległość operacji na danych. Obszary, w których zastosowanie SIMD może znacznie poprawić wydajność, obejmują uczenie maszynowe, kodowanie i dekodowanie wideo, przetwarzanie obrazu, symulację procesów fizycznych i manipulację grafiką.
- Obsługa typów referencyjnych, umożliwiająca modułom Wasm dostęp do informacji w innych modułach lub w środowisku bazowym.
- Dokonano znaczących optymalizacji wydajności. Szybkość działania LLVM z liczbami zmiennoprzecinkowymi została zwiększona o około 50%. Wywołania funkcji zostały znacznie przyspieszone poprzez ograniczenie sytuacji wymagających dostępu do jądra. Wydajność generatora kodu Cranelift została zwiększona o 40%. Skrócony czas deserializacji danych.
- Aby dokładniej oddać istotę, zmieniono nazwy silników: JIT → Universal, Native → Dylib (Dynamic Library), Object File → StaticLib (Static Library).
Źródło: opennet.ru