De tweede belangrijke release van het Wasmer-project heeft plaatsgevonden, dat een runtime ontwikkelt voor het uitvoeren van WebAssembly-modules. Dit kan worden gebruikt voor het creƫren van universele applicaties die op verschillende besturingssystemen kunnen draaien, alsook voor het isoleren van de uitvoering van niet-vertrouwde code. De code van het project is geschreven in Rust en wordt verspreid onder de MIT-licentie.
De draagbaarheid wordt gegarandeerd door de compilatie van de applicatiecode naar low-level WebAssembly-intermediaire code, die op elk besturingssysteem kan draaien of kan worden ingebouwd in programma's geschreven in andere programmeertalen. De programma's zijn lichte containers waarin pseudocode van WebAssembly wordt uitgevoerd. Deze containers zijn niet gebonden aan een besturingssysteem en kunnen code bevatten die oorspronkelijk in elke programmeertaal is geschreven. Voor compilatie naar WebAssembly kan de Emscripten-toolkit worden gebruikt. Voor de translatie van WebAssembly naar machinecode voor het huidige platform wordt de ondersteuning van verschillende compilatie-backends (Singlepass, Cranelift, LLVM) en engines (JIT-invoegen of generatie van machinecode) ondersteund.
Toegangsbeheer en interactie met het systeem worden verzekerd via de WASI (WebAssembly System Interface) API, die programmeerinterfaces biedt voor het werken met bestanden, sockets en andere functies die door het besturingssysteem worden aangeboden. Applicaties zijn geĆÆsoleerd van het onderliggende systeem in een sandbox-omgeving en hebben alleen toegang tot de opgegeven functionaliteit (een beveiligingsmechanisme gebaseerd op het onbevoegd beheer ā voor acties met elk van de middelen (bestanden, mappen, sockets, systeemoproepen, enz.) moet de applicatie de juiste bevoegdheden worden verleend).
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.
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.
De significante versie-update van Wasmer is het gevolg van de introductie van incompatibele wijzigingen in de interne API, die volgens de ontwikkelaars geen invloed zullen hebben op 99% van de gebruikers van het platform. Onder de incompatibele wijzigingen is er ook een verandering in het formaat van de geserialiseerde Wasm-modules (modules die zijn geserialiseerd in Wasmer 1.0 kunnen niet worden gebruikt in Wasmer 2.0). Andere wijzigingen:
- Ondersteuning voor SIMD-instructies (Single Instruction, Multiple Data), die het mogelijk maken om klantbewerkingen op gegevens te paralleliseren. Domeinen waarin SIMD de prestaties aanzienlijk kan verbeteren, zijn onder meer machine learning, video-encoding en decoding, beeldverwerking, simulatie van fysieke processen en grafische manipulaties.
- Ondersteuning voor referentietypes, waarmee Wasm-modules informatie in andere modules of in de basisomgeving kunnen benaderen.
- Er is aanzienlijke prestatie-optimalisatie doorgevoerd. De snelheid van de LLVM-runtime met drijvende-komma-getallen is met ongeveer 50% verhoogd. De aanroep van functies is aanzienlijk versneld door het aantal situaties die een beroep op de kernel vereisen te verminderen. De prestaties van de Cranelift-codegenerator zijn met 40% toegenomen. De tijd voor deserialisatie van gegevens is verminderd.


- Om de essentie nauwkeuriger weer te geven, zijn de namen van de engines gewijzigd: JIT ā Universeel, Native ā Dylib (Dynamische Bibliotheek), Objectbestand ā StaticLib (Statische Bibliotheek).
Bron: opennet.ru


