De derde belangrijke release van het Wasmer-project is gepresenteerd, dat een runtime ontwikkelt voor het uitvoeren van WebAssembly-modules, die kunnen worden gebruikt voor het creëren van universele applicaties die op verschillende besturingssystemen kunnen draaien, evenals voor de geïsoleerde uitvoering van onbetrouwbare code. De code van het project is geschreven in Rust en is beschikbaar onder de MIT-licentie.
De mogelijkheid om één applicatie op verschillende platforms uit te voeren, wordt mogelijk gemaakt door de compilatie van de code naar low-level tussenliggende code van WebAssembly, die kan draaien op elk besturingssysteem of kan worden ingebed in programma's geschreven in andere programmeertalen. Programma's zijn lichte containers waarin pseudocode van WebAssembly draait. Deze containers zijn niet gebonden aan een besturingssysteem en kunnen code bevatten die oorspronkelijk in elke programmeertaal is geschreven. Voor de compilatie naar WebAssembly kan de Emscripten-toolchain worden gebruikt. Voor de transformatie van WebAssembly naar de machinecode van het huidige platform wordt ondersteuning geboden voor verschillende backend-compilators (Singlepass, Cranelift, LLVM) en engines (gebruik van JIT of generatie van machinecode).
Applicaties zijn geïsoleerd van het hoofdsyteem in een sandbox-omgeving en hebben alleen toegang tot de opgegeven functionaliteit (een beveiligingsmechanisme op basis van autoriteitsbeheer — voor acties met elke bron (bestanden, mappen, sockets, systeemaanroepen, enz.) moeten de overeenkomstige bevoegdheden aan de applicatie worden verleend). Toegangsbeheer en interactie met het systeem wordt mogelijk gemaakt via de WASI (WebAssembly System Interface) API, die programmatische interfaces biedt voor het werken met bestanden, sockets en andere functies die door het besturingssysteem worden ondersteund.
Het platform maakt het mogelijk om de uitvoeringsprestaties van applicaties te bereiken die dicht bij die van native builds liggen. Met de Native Object Engine voor het WebAssembly-module kan machinecode worden gegenereerd (‘wasmer compile —native’ voor het genereren van pre-gecompileerde objectbestanden .so, .dylib en .dll), waarvoor een minimale runtime vereist is, maar die alle mogelijkheden van sandbox-isolatie behoudt. Het is mogelijk om pre-gecompileerde programma's met ingebouwde Wasmer te leveren. Voor het creëren van uitbreidingen en aanvullende functies worden Rust API's en Wasm-C-API aangeboden.
Om een WebAssembly-container te starten, is het genoeg om de Wasmer-runtime in het systeem te installeren, die zonder externe afhankelijkheden wordt geleverd ("curl https://get.wasmer.io -sSfL | sh"), en het vereiste bestand te starten ("wasmer test.wasm"). Programma's worden verspreid als gewone WebAssembly-modules, waarvoor je de pakketbeheerder WAPM kunt gebruiken. Wasmer is ook beschikbaar in de vorm van een bibliotheek, die kan worden gebruikt voor het integreren van WebAssembly-code in programma's geschreven in de talen Rust, C/C++, C#, D, Python, JavaScript, Go, PHP, Ruby, Elixir en Java.
Belangrijkste wijzigingen in Wasmer 3.0:
- De mogelijkheid om native uitvoerbare bestanden voor verschillende platforms te maken is toegevoegd. Het commando „wasmer create-exe” is volledig herwerkt, waarmee een bestand met tussencode van WebAssembly kan worden omgevormd naar zelfstandige uitvoerbare bestanden voor de platforms Linux, Windows en macOS, die kunnen werken zonder dat Wasmer zelf moet worden geïnstalleerd.
- De mogelijkheid om WAPM-pakketten, gehost op de map wapm.io, uit te voeren met het commando „wasmer run” is aangeboden. Bijvoorbeeld, het uitvoeren van „wasmer run python/python” zal het pakket python uit de wapm.io-repository downloaden en uitvoeren.
- De Wasmer Rust API is volledig herwerkt, waarbij de manier van werken met geheugen is gewijzigd en de mogelijkheid is geboden om Wasm-objecten veilig in de Store-structuur op te slaan. Een nieuwe structuur MemoryView is voorgesteld, die het mogelijk maakt om gegevens te lezen en te schrijven in een lineair geheugengebied.
- Een set van wasmer-js-componenten is geïmplementeerd voor het uitvoeren van Wasmer in web-browsers en interactie ermee vanuit JavaScript, met behulp van de wasm-bindgen-bibliotheek. Wat betreft functionaliteit komt wasmer-js overeen met de wasmer-sys-componenten, die zijn ontworpen voor het uitvoeren van Wasmer in reguliere besturingssystemen.
- De engines zijn vereenvoudigd. In plaats van afzonderlijke engines voor JIT, dynamische en statische binding (Universal, Dylib, StaticLib) wordt nu één algemene engine aangeboden, waarbij het laden en opslaan van code wordt beheerd via een parameterinstelling.
- Voor de deserialisatie van artefacten is het rkyv-framework ingezet, dat werkt in zero-copy-modus, d.w.z. zonder extra geheugenallocatie en alleen deserialisatie uitvoert met de oorspronkelijk geleverde buffer. Het gebruik van rkyv heeft de opstarttijd aanzienlijk versneld.
- De singlepass-compiler is verbeterd, met ondersteuning voor functies met meerdere argumenten (multi-value), verhoogde betrouwbaarheid en ondersteuning voor exception-handling frames.
- De implementatie van de WASI API (WebAssembly System Interface) is verbeterd. Problemen in de WASI-API voor bestandsbeheer zijn opgelost. Interne types zijn herzien met behulp van WAI (WebAssembly Interfaces), wat in de toekomst een reeks nieuwe mogelijkheden zal mogelijk maken.
Bron: opennet.ru
