Was ist WebAssembly? Die Webplattform der nächsten Generation erklärt

Seit zwei Jahrzehnten steht nur eine Programmiersprache zur nativen Verwendung in einem Webbrowser zur Verfügung: JavaScript. Der langsame Tod von Binär-Plug-Ins von Drittanbietern hat andere Sprachen wie Java und Flashs ActionScript als erstklassige Bürger für die Webentwicklung ausgeschlossen. Andere Web-Sprachen wie CoffeeScript werden lediglich zu JavaScript kompiliert.

Aber jetzt haben wir eine neue Möglichkeit: WebAssembly, kurz WASM. WebAssembly ist ein kleines, schnelles Binärformat, das nahezu native Leistung für Webanwendungen verspricht. Außerdem ist WebAssembly als Kompilierungsziel für jede Sprache konzipiert, wobei JavaScript nur eines davon ist. Da jeder große Browser jetzt WebAssembly unterstützt, ist es an der Zeit, ernsthaft darüber nachzudenken, clientseitige Apps für das Web zu schreiben, die als WebAssembly kompiliert werden können.

Es ist erwähnenswert, dass WebAssembly-Apps JavaScript-Apps nicht ersetzen sollen - zumindest noch nicht. Stellen Sie sich WebAssembly stattdessen als Begleiter von JavaScript vor. Wo JavaScript flexibel ist, dynamisch typisiert und über lesbaren Quellcode bereitgestellt wird, ist WebAssembly schnell, stark typisiert und wird über ein kompaktes Binärformat bereitgestellt.

Entwickler sollten WebAssembly für leistungsintensive Anwendungsfälle wie Spiele, Musik-Streaming, Videobearbeitung und CAD-Anwendungen in Betracht ziehen.

So funktioniert WebAssembly

Die vom W3C entwickelte WebAssembly ist nach den Worten ihrer Entwickler ein „Kompilierungsziel“. Entwickler schreiben WebAssembly nicht direkt. Sie schreiben in der Sprache ihrer Wahl, die dann in den WebAssembly-Bytecode kompiliert wird. Der Bytecode wird dann auf dem Client ausgeführt - normalerweise in einem Webbrowser -, wo er in nativen Maschinencode übersetzt und mit hoher Geschwindigkeit ausgeführt wird.

WebAssembly-Code soll schneller geladen, analysiert und ausgeführt werden als JavaScript. Wenn WebAssembly von einem Webbrowser verwendet wird, besteht immer noch der Aufwand, das WASM-Modul herunterzuladen und einzurichten, aber alle anderen Dinge, die gleich sind, werden schneller ausgeführt. WebAssembly bietet auch ein Sandbox-Ausführungsmodell, das auf denselben Sicherheitsmodellen basiert, die derzeit für JavaScript existieren.

Derzeit ist das Ausführen von WebAssembly in Webbrowsern der häufigste Anwendungsfall. WebAssembly soll jedoch mehr als eine webbasierte Lösung sein. Wenn sich die WebAssembly-Spezifikation formt und mehr Funktionen darin landen, kann sie möglicherweise in mobilen Apps, Desktop-Apps, Servern und anderen Ausführungsumgebungen nützlich sein.

Anwendungsfälle für WebAssembly

Der grundlegendste Anwendungsfall für WebAssembly ist das Schreiben von In-Browser-Software. Die in WebAssembly kompilierten Komponenten können in einer beliebigen Anzahl von Sprachen geschrieben werden. Die endgültige WebAssembly-Nutzlast wird dann über JavaScript an den Client übermittelt.

WebAssembly wurde unter Berücksichtigung einer Reihe leistungsintensiver, browserbasierter Anwendungsfälle entwickelt: Spiele, Musik-Streaming, Videobearbeitung, CAD, Verschlüsselung und Bilderkennung, um nur einige zu nennen.

Im Allgemeinen ist es aufschlussreich, sich bei der Bestimmung Ihres speziellen WebAssembly-Anwendungsfalls auf diese drei Bereiche zu konzentrieren:

  • Hochleistungscode, der bereits in einer Zielsprache vorhanden ist. Wenn Sie beispielsweise bereits eine Hochgeschwindigkeits-Mathematikfunktion in C geschrieben haben und diese in eine Webanwendung integrieren möchten, können Sie sie als WebAssembly-Modul bereitstellen. Die weniger leistungskritischen, benutzerbezogenen Teile der App können in JavaScript verbleiben.
  • Hochleistungscode, der von Grund auf neu geschrieben werden muss, wenn JavaScript nicht ideal ist. Zuvor könnte man asm.js verwendet haben, um solchen Code zu schreiben. Sie können dies weiterhin tun, aber WebAssembly wird als bessere langfristige Lösung positioniert.
  • Portieren einer Desktop-Anwendung in eine Webumgebung. Viele der Technologiedemos für asm.js und WebAssembly fallen in diese Kategorie. WebAssembly kann ein Substrat für Apps bereitstellen, die ehrgeiziger sind als nur eine über HTML dargestellte GUI. (Siehe die Demos zu WebDSP, Zen Garden und Tanks.) Dies ist jedoch keine triviale Übung, da alle Arten, wie die Desktopanwendung mit dem Benutzer zusammenarbeitet, WebAssembly / HTML / JavaScript-Entsprechungen zugeordnet werden müssen.

Wenn Sie über eine vorhandene JavaScript-App verfügen, die keine Leistungsschwierigkeiten aufweist, sollten Sie diese in dieser Phase der Entwicklung von WebAssembly in Ruhe lassen. Wenn Sie diese App jedoch benötigen, um schneller zu arbeiten, kann WebAssembly hilfreich sein.

Unterstützung der WebAssembly-Sprache 

WebAssembly soll nicht direkt geschrieben werden. Wie der Name schon sagt, handelt es sich eher um eine Assemblersprache, die die Maschine verwenden muss, als um eine benutzerfreundliche Programmiersprache auf hoher Ebene. WebAssembly ist näher an der Intermediate Representation (IR), die von der LLVM-Sprachcompiler-Infrastruktur generiert wird, als an C oder Java.

Daher umfassen die meisten Szenarien für die Arbeit mit WebAssembly das Schreiben von Code in einer höheren Sprache und die Umwandlung in WebAssembly. Dies kann auf drei grundlegende Arten erfolgen:

  • Direkte Zusammenstellung. Die Quelle wird über die sprachspezifische Compiler-Toolchain in WebAssembly übersetzt. Rust, C / C ++, Kotlin / Native und D haben jetzt alle native Möglichkeiten, WASM von Compilern zu emittieren, die diese Sprachen unterstützen.
  • Tools von Drittanbietern. Die Sprache hat keine native WASM-Unterstützung in ihrer Toolchain, aber ein Drittanbieter-Dienstprogramm kann zum Konvertieren in WASM verwendet werden. Java, Lua und die .Net-Sprachfamilie haben alle eine solche Unterstützung.
  • WebAssembly-basierter Interpreter. Hier wird die Sprache selbst nicht in WebAssembly übersetzt. Vielmehr führt ein in WebAssembly geschriebener Interpreter für die Sprache in der Sprache geschriebenen Code aus. Dies ist der umständlichste Ansatz, da der Interpreter möglicherweise mehrere Megabyte Code enthält, der vorhandene Code in der Sprache jedoch nahezu unverändert ausgeführt werden kann. Python und Ruby haben beide Dolmetscher in WASM übersetzt.

WebAssembly-Funktionen

WebAssembly befindet sich noch im Anfangsstadium. Die WebAssembly-Toolchain und -Implementierung bleiben dem Proof-of-Concept näher als der Produktionstechnologie. Die Custodians von WebAssembly haben sich jedoch zum Ziel gesetzt, WebAssembly durch eine Reihe von Initiativen nützlicher zu machen:

Grundelemente der Speicherbereinigung

WebAssembly unterstützt keine Sprachen direkt, die Speichermodelle verwenden. Sprachen wie Lua oder Python können nur durch Einschränken von Funktionssätzen oder durch Einbetten der gesamten Laufzeit als ausführbare WebAssembly-Datei unterstützt werden. Es wird jedoch daran gearbeitet, Speichermodelle mit Speicherbereinigung unabhängig von der Sprache oder Implementierung zu unterstützen.

Einfädeln

Die native Unterstützung für das Threading ist in Sprachen wie Rust und C ++ üblich. Das Fehlen von Threading-Unterstützung in WebAssembly bedeutet, dass ganze Klassen von WebAssembly-Software nicht in diesen Sprachen geschrieben werden können. Der Vorschlag, WebAssembly Threading hinzuzufügen, verwendet das C ++ - Threading-Modell als eine seiner Inspirationen.

Massenspeicheroperationen und SIMD

Massenspeicheroperationen und SIMD-Parallelität (Single Instruction, Multiple Data) sind ein Muss für Anwendungen, die Datenmengen stapeln und eine native CPU-Beschleunigung benötigen, um nicht zu ersticken, wie maschinelles Lernen oder wissenschaftliche Apps. Es liegen Vorschläge vor, diese Funktionen über neue Operatoren zu WebAssembly hinzuzufügen.

Hochrangige Sprachkonstrukte

Viele andere Funktionen, die für WebAssembly in Betracht gezogen werden, werden direkt Konstrukten auf hoher Ebene in anderen Sprachen zugeordnet.

  • Ausnahmen können in WebAssembly emuliert, aber nicht nativ über den Befehlssatz von WebAssembly implementiert werden. Der vorgeschlagene Plan für Ausnahmen umfasst Ausnahmeprimitive, die mit dem C ++ - Ausnahmemodell kompatibel sind und die wiederum von anderen in WebAssembly kompilierten Sprachen verwendet werden können.
  • Referenztypen  erleichtern die Weitergabe von Objekten, die als Verweise auf die Hostumgebung verwendet werden. Dies würde die Implementierung der Garbage Collection und einer Reihe anderer Funktionen auf hoher Ebene in WebAssembly vereinfachen.
  • Tail Calls , ein Designmuster, das in vielen Sprachen verwendet wird.
  • Funktionen, die mehrere Werte zurückgeben , z. B. über Tupel in Python oder C #.
  • Vorzeichenerweiterungsoperatoren , eine nützliche mathematische Operation auf niedriger Ebene. (LLVM unterstützt diese ebenfalls.)

Debugging- und Profiling-Tools

Eines der größten Probleme mit transpiliertem JavaScript war die Schwierigkeit des Debuggens und Profilierens, da keine Korrelation zwischen dem transpilierten Code und der Quelle möglich war. Bei WebAssembly haben wir ein ähnliches Problem, das auf ähnliche Weise behoben wird (Unterstützung der Quellzuordnung). Siehe den Projekthinweis zur geplanten Werkzeugunterstützung.