WebAssembly mit Rust in Webbrowsern

WebAssembly ist ein offener Standard eines Bytecode-Formats für virtuelle Maschinen, die sowohl in aktuellen Webbrowsern, als auch freistehenden Laufzeitumgebungen zur Verfügung stehen.

Nicht alle Features von WebAssembly werden allerdings von allen Webbrowsern unterstützt.

Programmiersprachen

WebAssembly-Bytecode wird von Compilern verschiedener Programmiersprachen produziert – darunter auch Rust. Client-seitige Web-Programmierung in diesen Sprachen ist somit möglich.

Software, die bereits in diesen Programmiersprachen geschrieben ist, kann ebenfalls in Webbrowsern genutzt werden. Mittels Emscripten stehen z.B. LaTeX, Python, SQLite oder sogar Qt zur Verfügung.

Performance

WebAssembly an sich hat eine bessere Performance als JavaScript – bei geringerer Schwankungsbreite:

Aber: in Webbrowsern erfolgt die Interaktion mit dem DOM und allen anderen Web APIs über einen JavaScript-Shim. Auch Eventhandler-Callbacks müssen diesen passieren. UTF-8-Strings müssen dabei in JavaScripts UTF-16-Strings transkodiert werden – und umgekehrt. Zugriffe auf den DOM können grundsätzlich nur aus dem JavaScript-Haupt-Thread erfolgen.

Die Grenze zwischen JavaScript und WebAssembly stellt somit einen Flaschenhals dar. Ihn zu durchschreiten, kann 10-1000 % langsamer sein, als der entsprechende reine JavaScript-Aufruf.

Es gibt Möglichkeiten, diesen Flaschenhals zu weiten:

Benchmarks

Programmierung

Tools und Crates:

Da fetch() asynchron ist, ist vielfach Asynchrones Rust notwendig. spawn_local() ist eine Möglichkeit, eine asynchrone Funktion (Future) aus einer synchronen Funktion heraus aufzurufen. Die Future muss allerdings die Lifetime 'static haben.


Alle Angaben ohne Gewähr • HomeKontakt