Die dritte bedeutende Veröffentlichung des Wasmer-Projekts wurde vorgestellt, das eine Laufzeitumgebung für die Ausführung von WebAssembly-Modulen entwickelt. Diese kann verwendet werden, um universelle Anwendungen zu erstellen, die auf verschiedenen Betriebssystemen ausgeführt werden können, sowie für die isolierte Ausführung von untrusted Code. Der Code des Projekts ist in Rust geschrieben und steht unter der MIT-Lizenz.
Die Möglichkeit, eine Anwendung auf verschiedenen Plattformen auszuführen, wird durch die Kompilierung des Codes in einen low-level WebAssembly-Zwischencode gewährleistet, der auf jedem Betriebssystem laufen oder in Programme anderer Programmiersprachen integriert werden kann. Programme selbst sind leichtgewichtige Container, in denen WebAssembly-Pseudocode ausgeführt wird. Diese Container sind nicht an ein bestimmtes Betriebssystem gebunden und können Code enthalten, der ursprünglich in jeder Programmiersprache geschrieben wurde. Zur Kompilierung in WebAssembly kann das Emscripten-Toolkit verwendet werden. Für die Übersetzung von WebAssembly in den Maschinen-Code der aktuellen Plattform kann eine Verbindung zu verschiedenen Kompilierungs-Backends (Singlepass, Cranelift, LLVM) und Engines (Einsatz von JIT oder Generierung von Maschinen-Code) unterstützt werden.
Anwendungen sind von dem Hauptsystem in einer Sandbox-Umgebung isoliert und haben nur Zugriff auf die angegebene Funktionalität (ein sicherheitsmechanismus, der auf dem Capability-Management basiert — für Aktionen mit jedem der Ressourcen (Dateien, Verzeichnisse, Sockets, Systemaufrufe usw.) müssen dem Anwendung die entsprechenden Berechtigungen erteilt werden). Der Zugriff und die Interaktion mit dem System erfolgen über die API WASI (WebAssembly System Interface), die Programmierschnittstellen für den Umgang mit Dateien, Sockets und anderen Funktionen, die vom Betriebssystem bereitgestellt werden, zur Verfügung stellt.
Die Plattform ermöglicht eine Anwendungsleistung, die nahezu der Ausführung nativer Builds entspricht. Mit der Native Object Engine für das WebAssembly-Modul kann maschineller Code generiert werden („wasmer compile —native“ zum Erzeugen vorcompilierter Objektdateien .so, .dylib und .dll), dessen Ausführung einen minimalen Runtime erfordert, dabei aber alle Möglichkeiten der Sandbox-Isolierung erhält. Die Bereitstellung von vorcompilierten Programmen mit integriertem Wasmer ist möglich. Rust API und Wasm-C-API stehen zur Verfügung, um Add-ons und Erweiterungen zu erstellen.
Um einen WebAssembly-Container zu starten, genügt es, das Runtime Wasmer im System zu installieren, das ohne externe Abhängigkeiten geliefert wird ("curl https://get.wasmer.io -sSfL | sh") , und die benötigte Datei auszuführen ("wasmer test.wasm"). Programme werden als reguläre WebAssembly-Module verteilt, die mit dem Paketmanager WAPM verwaltet werden können. Wasmer ist auch als Bibliothek erhältlich, die zur Integration von WebAssembly-Code in Programme in den Sprachen Rust, C/C++, C#, D, Python, JavaScript, Go, PHP, Ruby, Elixir und Java verwendet werden kann.
Die wichtigsten Änderungen in Wasmer 3.0:
- Es wurde die Möglichkeit zur Erstellung nativer ausführbarer Dateien für beliebige Plattformen hinzugefügt. Das Befehl «wasmer create-exe» wurde vollständig überarbeitet, sodass es nun ermöglicht wird, eine Datei mit WebAssembly-Zwischencode in selbständige ausführbare Dateien für die Plattformen Linux, Windows und macOS umzuwandeln, die ohne die Installation von Wasmer betrieben werden können.
- Es wurde die Ausführung von WAPM-Paketen, die im Verzeichnis wapm.io abgelegt sind, über den Befehl «wasmer run» ermöglicht. Zum Beispiel wird die Ausführung von «wasmer run python/python» dazu führen, dass das Paket python aus dem Repository wapm.io geladen und gestartet wird.
- Die Wasmer Rust API wurde komplett überarbeitet, um die Handhabung von Speicher zu verbessern und eine sichere Speicherung von Wasm-Objekten in der Store-Struktur zu ermöglichen. Eine neue Struktur, MemoryView, wurde eingeführt, die das Lesen und Schreiben von Daten im linearen Speicherbereich erlaubt.
- Ein Set von Komponenten für wasmer-js wurde implementiert, um Wasmer im Webbrowser auszuführen und aus JavaScript mit ihm zu interagieren, unter Verwendung der Bibliothek wasm-bindgen. In Bezug auf Funktionen entspricht wasmer-js den Komponenten von wasmer-sys, die für die Ausführung von Wasmer in gängigen Betriebssystemen konzipiert sind.
- Die Engines wurden vereinfacht. Anstelle separater Engines für JIT, dynamisches und statisches Linking (Universal, Dylib, StaticLib) gibt es jetzt eine gemeinsame Engine, bei der das Laden und Speichern von Code über Parameter Level verwaltet wird.
- Für die Deserialisierung von Artefakten wird das Framework rkyv verwendet, das im Zero-Copy-Modus arbeitet, d.h. es erfordert keine zusätzliche Speicherauslagerung und führt die Deserialisierung nur mit dem ursprünglich bereitgestellten Puffer durch. Der Einsatz von rkyv hat die Startgeschwindigkeit erheblich verbessert.
- Der verbesserte Singlepass-Compiler unterstützt jetzt Funktionen mit mehreren Argumenten (Multi-Value), steigert die Zuverlässigkeit und ermöglicht die Verarbeitung von Ausnahmerahmen.
- Die API-Implementierung von WASI (WebAssembly System Interface) wurde verbessert. Probleme mit der WASI-Schnittstelle zur Dateisystemverarbeitung wurden behoben. Interne Typen wurden mit WAI (WebAssembly Interfaces) überarbeitet, was in Zukunft eine Reihe neuer Möglichkeiten eröffnen wird.
Quelle: opennet.ru
