Zaprezentowano wydanie projektu Wasmer 5.0, rozwijającego runtime do wykonywania modułów WebAssembly, który można wykorzystać do tworzenia uniwersalnych aplikacji, które mogą działać na różnych systemach operacyjnych. Wasmer może być również stosowany do izolowanego wykonywania nieufnych bloków kodu w ramach zwykłych aplikacji. Kod projektu napisany jest w języku Rust i rozpowszechniany jest na licencji MIT.
Możliwość uruchamiania jednej aplikacji na różnych platformach została zrealizowana poprzez kompilację do niskopoziomowego kodu pośredniego WebAssembly, który może być uruchamiany na każdej OS lub wbudowany w programy w innych językach programowania. Programy stanowią lekkie kontenery, w których wykonywany jest pseudokod WebAssembly. Te kontenery są niezależne od systemu operacyjnego i mogą zawierać kod napisany w dowolnym języku programowania.
Do wykonywania kodu pośredniego WebAssembly lub jego translacji do kodu maszynowego docelowej platformy oferowane są różne backendy:
- Backend oparty na kompilatorze Singlepass, optymalny do zastosowań w blockchainach.
- Backend oparty na generatorze kodu Cranelift, optymalny do procesu rozwoju.
- Backend oparty na kompilatorze LLVM, optymalny do zastosowań w produkcji.
- Backend do uruchamiania w przeglądarce internetowej.
- Backend oparty na silniku JavaScript JavascriptCore, optymalny do platformy macOS.
- Backend oparty na silniku JavaScript V8, optymalny dla aplikacji na platformy iOS i Android.
- Backend oparty na interpreterze Wasmi, optymalny dla blockchainów i projektów Rust, które nie korzystają z standardowej biblioteki (nostd).
- Backend oparty na runtime WAMR, optymalny dla platformy iOS.
Aplikacje są izolowane od głównego systemu w środowisku sandbox i mają dostęp tylko do zadeklarowanej funkcjonalności. Do izolacji stosowany jest mechanizm oparty na zarządzaniu uprawnieniami — aby aplikacja mogła działać z każdym z zasobów (plikami, katalogami, gniazdami, wywołaniami systemowymi itp.), muszą jej być przyznane odpowiednie uprawnienia. Zarządzanie dostępem i interakcja z systemem realizowane są za pomocą API WASI (WebAssembly System Interface), które dostarcza interfejsy programistyczne do pracy z plikami, gniazdami i innymi funkcjami systemowymi.
Platforma pozwala osiągnąć wydajność wykonywania aplikacji zbliżoną do wykonania rodzimych kompilacji. Dzięki Native Object Engine dla modułu WebAssembly można wygenerować kod maszynowy, do uruchomienia którego wymagana jest minimalna infrastruktura, ale zachowane są wszystkie możliwości izolacji sandbox. Możliwa jest dostawa prekompilowanych programów z wbudowanym Wasmer. Aby tworzyć rozszerzenia i dodatki dostępne są Rust API i Wasm-C-API.
Aby uruchomić kontener WebAssembly, wystarczy zainstalować w systemie runtime Wasmer, który jest dostarczany bez zewnętrznych zależności ("curl https://get.wasmer.io -sSfL | sh"), a następnie uruchomić odpowiedni 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 w formie biblioteki, którą można wykorzystać do wbudowywania kodu WebAssembly w programy w językach Rust, C/C++, C#, D, Python, JavaScript, Go, PHP, Ruby, Elixir i Java.
Główne nowości Wasmer 5.0:
- Zrealizowano możliwość korzystania z interpreterów WebAssembly.
- Dodano eksperymentalny backend oparty na lekkim interpreterze Wasmi, umożliwiający wykonywanie kodu pośredniego WebAssembly w środowiskach o ograniczonych zasobach.
- Dodano eksperymentalny backend oparty na runtime WebAssembly WAMR (WebAssembly Micro Runtime), zoptymalizowany do minimalnego zużycia zasobów i nadający się do zastosowania na urządzeniach z niewielką ilością pamięci RAM.
- Dodano eksperymentalny backend oparty na silniku JavaScript v8, używanym w przeglądarkach opartych na kodzie źródłowym Chromium. Główną zaletą korzystania z backendu opartego na V8 jest możliwość wykorzystania wbudowanego w ten silnik debuggera i narzędzi dla web deweloperów, a także dostępność w V8 rozszerzonej funkcjonalności WebAssembly, takiej jak obsługa wyjątków i zbieranie nieużywanych zasobów.
- Do backendu wykorzystującego LLVM dodano eksperymentalne wsparcie dla architektury Loongarch64.
- Dodano wsparcie dla platformy iOS, dostępne przy użyciu backendów WAMR, Wasmi i V8.
- Zaprzestano wsparcia dla kompilatora Emscripten.
- Zaktualizowano zależności, w tym LLVM 18, generator kodu Cranelift 27 i framework rkyv 0.8.
- Przeprowadzono optymalizację wydajności. Na przykład, podczas wykonywania operacji deserializacji modułów zaobserwowano wzrost wydajności nawet o 50%.







Źródło: opennet.ru







