Definition

WebAssembly (Wasm)

Was ist WebAssembly (Wasm)?

WebAssembly (Wasm) ist ein binäres Befehlsformat zum Kompilieren und Ausführen von Code in einem Webbrowser. Wasm ermöglicht eine weitaus schnellere Leistung für komplexe und anspruchsvolle Webanwendungen im Vergleich zu gängigen Webprogrammiersprachen wie JavaScript.

In Wasm kompilierter oder übersetzter Code ist eine eng verpackte Binärdatei, die auf einem Client-Computer mit nahezu natürlicher Geschwindigkeit ausgeführt werden kann. Dies ähnelt der traditionellen Assemblersprache, die eine der schnellsten verfügbaren Softwareleistungen bietet, da der Code bereits in einer Low-Level-Form vorliegt, die der Prozessor des Computers nativ ausführen kann.

Wie funktioniert WebAssembly?

Wasm ist das Ergebnis der Kompilierung von herkömmlichem Code in eine spezielle Wasm-Binärdatei. Die Wasm-Binärdatei wird dann in die JavaScript-Engine importiert, wo sie als ausführbare Datei instanziiert werden kann.

Dieser Prozess umfasst in der Regel folgende vier Schritte:

  1. Schreiben. Entwickler können an das Schreiben von Code für Wasm wie an jedes andere Softwareprojekt herangehen und dabei etablierte Programmiersprachen, Softwareentwicklungs-Workflows sowie Codeverwaltungs- und Qualitätsstandards verwenden.
  2. Kompilieren. Wasm ist selbst keine Sprache, sondern vielmehr das Produkt der Kompilierung und Konvertierung von in jeder Programmiersprache geschriebenem Code in ausführbaren Maschinencode. Mit vielen modernen Softwareentwicklungswerkzeugen können Benutzer Code in eine Wasm-Binärdatei kompilieren, im Gegensatz zu einer gewöhnlichen EXE-Datei. Emscripten zum Beispiel ist ein beliebter Wasm-Compiler eines Drittanbieters.
  3. Importieren. Eine Wasm-Binärdatei ist erst dann ausführbar, wenn sie in den Webbrowser geladen wird. Wenn eine Wasm-Binärdatei in die JavaScript-Engine des Webbrowsers importiert wird, kann die Browser-Engine die Datei dekodieren, kompilieren und in Maschinencode übersetzen, den der Client-Computer dann ausführen kann.
  4. Instanz. Die JavaScript-Engine erstellt eine isolierte virtuelle Instanz – genau wie bei JavaScript-Dateien – in der die importierte Wasm-Datei instanziiert und ausgeführt werden kann.

In einem typischen Szenario kann ein Entwickler beispielsweise eine Funktion in C/C++ erstellen und sie mit einem Tool wie Emscripten in Wasm kompilieren, das eine WASM-Binärdatei und HTML/JS-Unterstützungscode erzeugt. Von dort aus wird die Wasm-Datei an einen Webclient gesendet, der die Wasm-API von JavaScript verwendet, um die Binärdatei zu kompilieren und ein Wasm-Modul zu erstellen, das die JavaScript-Anweisungen instanziieren können. Die Funktion WebAssembly.instantiateStreaming() kann ebenfalls die Wasm-Datei laden und das Wasm-Modul kompilieren und instanzieren.

Um Wasm zu verwenden, muss der Browser sowohl JavaScript als auch Wasm unterstützen. Fast alle großen Webbrowser – einschließlich Google Chrome, Microsoft Edge, Firefox, Opera, Safari und Samsung Internet – bieten derzeit vollständige Wasm-Unterstützung.

Der Internet Explorer unterstützt Wasm nicht. Um Wasm-Dateien im Internet Explorer auszuführen, können Entwickler Tools wie Emscripten verwenden, um den Code in asm.js zu kompilieren, eine hoch optimiertes, niedrigstufiges Subset von JavaScript.

Unterstützung der WebAssembly-Sprache

Wasm ist keine Programmiersprache und soll browserbasierte Programmiersprachen wie JavaScript nicht ersetzen, sondern ergänzen. Entwickler können Code für Wasm in vielen verschiedenen Programmiersprachen schreiben. Dies ermöglicht es Entwicklern, Anwendungen in der Sprache ihrer Wahl zu schreiben und den Code dann in Wasm zu verpacken, damit der Webbrowser ihn verarbeiten und ausführen kann.

JavaScript ist bereits eine ausgereifte und gut optimierte Ausführungsumgebung. Entwickler können immer noch unzählige grundlegende Funktionen in JavaScript implementieren. Während JavaScript jedoch für die Ausführung von Code in lokalen Webbrowsern konzipiert ist, bietet Wasm eine Kompilierungs- und Ausführungsumgebung für schnellen, kompakten Binärcode. So können JavaScript- und Wasm-Code nebeneinander existieren und gleichzeitig ausgeführt werden.

Sprachen wie Rust, C/C++ und Kotlin/Native verfügen über direkte Compiler, die den Quellcode direkt in Wasm übersetzen. Entwickler, die in anderen Sprachen wie Java, Lua und .Net arbeiten, können Tools von Drittanbietern verwenden, um Code in Wasm zu konvertieren. Der Wasm-Interpreter kann auch in Python und Ruby geschriebenen Code übersetzen.

Die WebAssembly-Umgebung
Abbildung 1: WebAssembly unterstützt verschiedene Programmiersprachen und lässt sich in allen gängigen Plattformen einsetzen.

WebAssembly-Anwendungsfälle

Wasm eignet sich am besten für Anwendungsfälle mit folgenden Anforderungen:

  • Hohe Leistung. Wasm ist nützlich für Webbrowser, die prozessorintensive Aufgaben ausführen, zum Beispiel mathematische Berechnungen, Spiele, Grafikanwendungen sowie Bild- und Videoverarbeitung.
  • Einheitlicher Code. Wasm macht das Umschreiben von Legacy-Code in JavaScript-Funktionen überflüssig. Dies ist eine nützliche Funktion für Webbrowser, die Legacy-Code ausführen und gleichzeitig die Kompatibilität zwischen verschiedenen Browsern wahren müssen.
  • Portabilität. In Szenarien, in denen Portabilität wichtig ist, kann dasselbe Wasm-Modul auf jedem kompatiblen Webbrowser laufen und die native Hardware des Computers nutzen.

Die Entwickler haben Wasm bereits in einer Vielzahl von realen Anwendungsfällen eingesetzt:

  • Bearbeitung von Inhalten, zum Beispiel Audio-, Bild- und Videobearbeitung
  • leistungsstarke Videospiele, die in Webbrowsern laufen
  • wissenschaftliche Simulationen, Visualisierungen und andere rechenintensive Aufgaben
  • Plattformemulation, zum Beispiel das Ausführen spezialisierter Umgebungen innerhalb eines Browsers
  • Verschlüsselung und andere Sicherheitsaufgaben
  • Remote-Desktop-Umgebungen
  • Tools für Entwickler

Vor- und Nachteile von WebAssembly

Wasm bietet Entwicklern eine Reihe von Vorteilen, hat aber auch einige potenzielle Nachteile.

Vorteile von WebAssembly

Ein wesentlicher Vorteil von Wasm ist seine Geschwindigkeit und Effizienz. Wasm erstellt Maschinensprachcode, der so nah wie möglich an der nativen Hardware des Computers ausgeführt wird, was zu einer besseren Softwareleistung und einem geringeren Speicherbedarf führt. Dieser Code ist außerdem wartungsfreundlich: Auch wenn die Kompilierung nach Wasm zu Low-Level-Maschinensprache führt, wird auch eine Ausgabe im Textformat erzeugt, um das Debuggen von Wasm-Code zu erleichtern.

Wasm bietet außerdem eine breite Browser- und Sprachunterstützung. Wasm wird fast durchgängig von allen wichtigen modernen Webbrowsern unterstützt und ist sprachunabhängig. Das bedeutet, dass Entwickler Code in ihrer bevorzugten Programmiersprache wie C/C++, Rust oder Go schreiben können, solange ihre Entwicklungswerkzeuge den Code in ein Wasm-Modul kompilieren können. Ebenso unterstützt jeder Browser Wasm auf die gleiche Weise, so dass Entwickler das gleiche Wasm-Modul in jedem unterstützten Browser ohne Änderungen verwenden können.

Nachteile von WebAssembly

Ein bemerkenswerter Nachteil von Wasm ist das Fehlen einer Garbage Collection. Da Wasm nicht über eine native Speicherverwaltung verfügt, ist es auf den zugrunde liegenden Code in der ursprünglichen Programmiersprache angewiesen, um Speicherverwaltungsfunktionen bereitzustellen.

Obwohl JavaScript und Wasm interoperabel sind, verläuft dieser Austausch nicht immer reibungslos und nahtlos. In der Regel schränken Entwickler die Interaktion zwischen JavaScript und Wasm ein, indem sie JavaScript für einige Aufgaben und Wasm für andere verwenden. Zum Beispiel verwenden JavaScript und Wasm zwei unterschiedliche Speichermodelle, was zu einer ineffizienten Kommunikation führen kann. Wasm hat auch keinen Zugriff auf das Document Object Model (DOM), das erstellt wird, wenn ein Webbrowser eine Webseite lädt. Daher müssen Entwickler JavaScript oder Tools von Drittanbietern verwenden, um auf das DOM zuzugreifen.

Da Wasm auf JavaScript und dessen Sandbox-Umgebung aufbaut, erbt Wasm die Sicherheitsschwachstellen von JavaScript. Dazu gehören eine eingeschränkte Sichtbarkeit der Speichernutzung, fehlende Integritätsprüfungen und Schwierigkeiten beim Debuggen von Low-Level-Maschinencode. Entwickler sollten bei der Sicherheit von Wasm die gleichen Vorsichtsmaßnahmen ergreifen wie bei JavaScript.

Die Zukunft von WebAssembly

Wasm ist eine relativ neue Technologie, und sein Standard wird vom World Wide Web Consortium (W3C) ständig weiterentwickelt. Daher wird sich Wasm mit zunehmender Akzeptanz und wachsenden Anwendungsfällen weiterentwickeln.

In naher Zukunft werden die Entwickler von Wasm wahrscheinlich einige der bemerkenswertesten Nachteile angehen, wie zum Beispiel die Unterstützung für Garbage Collection und den Zugriff auf das DOM, um die Leistung und Stabilität von Wasm zu verbessern. Die W3C-Ausschüsse werden auch eine Verbesserung der Interoperabilität zwischen Wasm und JavaScript angehen, um eine bessere Kommunikation zwischen den beiden zu ermöglichen.

Die Nutzung von Wasm weitet sich auch von Webbrowsern, die clientseitigen Code ausführen, auf die serverseitige Programmausführung aus und bietet damit Alternativen für Unternehmens- und Cloud-Computing-Container. Darüber hinaus ermöglicht die universelle Portabilität von Wasm-Code-Modulen, die aus einer Standardprogrammiersprache kompiliert wurden, Entwicklern die Erstellung universeller Erweiterungen oder Plug-ins für Unternehmensanwendungen.

Diese Definition wurde zuletzt im Dezember 2023 aktualisiert

Erfahren Sie mehr über Softwareentwicklung