Odbędzie się drugie istotne wydanie projektu Wasmer, rozwijającego runtime do uruchamiania modułów WebAssembly, który można wykorzystać do tworzenia uniwersalnych aplikacji zdolnych do działania w różnych systemach operacyjnych, a także do izolowanego wykonywania nieufnego kodu. Kod projektu jest napisany w języku Rust i rozprowadzany na licencji MIT.
Przenośność zapewniana jest poprzez kompilację kodu aplikacji do niskopoziomowego kodu pośredniego WebAssembly, który może działać w dowolnych systemach operacyjnych lub być wbudowywany w programy napisane w innych językach programowania. Programy są lekkimi kontenerami, w których wykonywany jest pseudokod WebAssembly. Te kontenery nie są związane z systemem operacyjnym i mogą zawierać kod napisany w dowolnym języku programowania. Do kompilacji do WebAssembly można wykorzystać narzędzia Emscripten. Aby przetłumaczyć WebAssembly na kod maszynowy bieżącej platformy, wspierane jest podłączanie różnych backendów kompilacji (Singlepass, Cranelift, LLVM) i silników (wykorzystanie JIT lub generowanie kodu maszynowego).
Управление доступом и взаимодействие с системой обеспечивается при помощи API WASI (WebAssembly System Interface), предоставляющем программные интерфейсы для работы с файлами, сокетами и другими функциями, предоставляемыми операционной системой. Приложения изолированы от основной системы в sandbox-окружении и имеют доступ только к заявленной функциональности (механизм безопасности на основе управления возможностями — для действий с каждым из ресурсов (файлы, каталоги, сокеты, системные вызовы и т.п.) приложению должны быть даны соответствующие полномочия).
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.
Platforma pozwala osiągnąć wydajność wykonywania aplikacji bliską wykonaniu natywnych kompilacji. Za pomocą Native Object Engine dla modułu WebAssembly można wygenerować kod maszynowy („wasmer compile --native” do generowania wstępnie skompilowanych plików obiektowych .so, .dylib i .dll), do uruchomienia którego wymagany jest minimalny runtime, ale zachowane są wszystkie możliwości izolacji sandbox. Istnieje możliwość dostarczenia wstępnie skompilowanych programów z wbudowanym Wasmerem. Do tworzenia nakładek i rozszerzeń oferowane są interfejsy API Rust i Wasm-C-API.
Znacząca zmiana numeru wersji Wasmer związana jest z wprowadzeniem zmian naruszających zgodność w wewnętrznym API, które, jak zapewniają deweloperzy, nie wpłyną w żaden sposób na 99% użytkowników platformy. Do zmian naruszających zgodność zalicza się także przekształcenie formatu serializowanych modułów Wasm (moduły serializowane w Wasmer 1.0 nie będą mogły być używane w Wasmer 2.0). Inne zmiany:
- Wsparcie dla instrukcji SIMD (Single Instruction, Multiple Data), które pozwalają na równoległe przetwarzanie operacji na danych. Z obszarów, w których zastosowanie SIMD może znacznie zwiększyć wydajność, wymienia się uczenie maszynowe, kodowanie i dekodowanie wideo, przetwarzanie obrazów, symulację procesów fizycznych i manipulacje grafiką.
- Wsparcie dla typów odwołaniowych, umożliwiających modułom Wasm dostęp do informacji w innych modułach lub w podstawowym środowisku.
- Przeprowadzono znaczne optymalizacje wydajności. Prędkość działania runtime LLVM z liczbami zmiennoprzecinkowymi wzrosła o około 50%. Znacznie przyspieszono wywoływanie funkcji dzięki zmniejszeniu sytuacji wymagających dostępu do rdzenia. Wydajność generatora kodu Cranelift wzrosła o 40%. Skrócono czas deserializacji danych.


- Для более точного отражения сути изменены названия движков: JIT → Universal, Native → Dylib (Dynamic Library), Object File → StaticLib (Static Library).
Źródło: opennet.ru


