Welche Sprachen können zu WebAssembly (Wasm) kompiliert werden?

116

Welche Sprachen können zu WebAssembly (Wasm) kompiliert werden?

Ich glaube, dass C, C ++ und Rust (experimentell) derzeit mit dem llvm-Compiler-Backend zu WebAssembly kompiliert werden können, wobei Sprachen wie Java, Swift und C # derzeit nicht unterstützt werden, aber mögliche Kandidaten für zukünftige Entwicklungen sind.

Ich glaube nicht, dass JavaScript zu Wasm kompiliert werden kann. https://github.com/WebAssembly/design/issues/219

Jordan Stewart
quelle
1
Nur als Hinweis für jeden, der dies liest, habe ich kürzlich C und C ++ für WASM über emscripten verwendet und es funktioniert sehr gut.
CoffeeTableEspresso

Antworten:

120

Die Unterstützung für WebAssembly wird ständig weiterentwickelt. Derzeit wird es von folgenden Sprachen unterstützt:

Es gibt auch kommerzielle Lösungen:

In Bezug auf JavaScript ist es unwahrscheinlich, dass Unterstützung erhalten wird, da WebAssembly eine statisch typisierte Assemblersprache ist.

Es gibt auch verschiedene obskurere / Hobby-Sprachen, die WebAssembly unterstützen. Weitere Details finden Sie in der ausführlicheren Liste der Awesome WebAssembly Languages .

ColinE
quelle
1
Kommerzielle C # / Java / Swift-Implementierungen: blogs.remobjects.com/2018/01/12/… . Auch: github.com/appcypher/awesome-wasm-langs
Andreas Rossberg
Guter Punkt - Ich habe RemObjects als eigene Kategorie hinzugefügt, da es mehrsprachig und kommerziell ist
ColinE
1
Aber Python wird dynamisch getippt!
Richard Eng
17

Siehe https://github.com/mbasso/awesome-wasm#compilers - im Moment ist es nur C / C ++, andere sind experimentell, aber die Menge des "experimentellen" Teils wächst.

Derzeit unterstützt WebAssembly nur einen flachen linearen Speicher. Das ist für C / C ++ / Rust und viele andere Sprachen geeignet, aber die meisten modernen Sprachen benötigen Garbage Collector, um ausgeführt zu werden. Dies ist die "Post-MVP-Funktion" von WebAssembly (siehe https://github.com/WebAssembly/design/issues/1079 ). Derzeit besteht die einzige Möglichkeit darin, den Garbage Collector mit einem benutzerdefinierten Code im Wasm zu implementieren.

Nzeemin
quelle
2
Es ist hinzuzufügen , dass asm.js leicht zu wasm und asm.js kompiliert werden ist Javascript. Das Kompilieren von Javascript ist / wäre jedoch viel schwieriger, da es im Allgemeinen nicht so viele sofort verfügbare Kontextinformationen gibt.
Culex
11

TeaVM kann verwendet werden, um JVM-Bytecode in WebAssembly zu transpilieren. Sie können die Projekthomepage unter https://github.com/konsoletyper/teavm überprüfen .

TeaVM kann im Kern JVM-Bytecode in JS und WebAssembly transpilieren. Die Unterstützung von WebAssembly befindet sich noch in einem frühen Stadium. Es stehen jedoch Demos zur Verfügung, mit denen die Leistung einer einfachen JBox2D-Simulation mit GWT, TeaVM (JS-Ausgabe) und TeaVM (WASM-Ausgabe) verglichen werden kann.

Bitte beachten Sie, dass WebAssembly derzeit keinen direkten Zugriff auf das DOM oder andere JavaScript-APIs hat. Auch im aktuellen MVP gibt es keine Unterstützung für undurchsichtige Datentypen oder sogar den GC. Es ist jedoch möglich, mithilfe einiger JS-Tricks Up- / Downcalls von JS zu WASM und wieder zurück durchzuführen, wie in den genannten Demos gezeigt.

Mirko Sertic
quelle
8

Dieses Repo

Enthält eine Liste der Sprachen, die derzeit in WebAssembly (wasm) kompiliert werden oder deren VMs vorhanden sind.

Eigenschaften:

  • Verwendet Emojis, um zu zeigen, wie ausgereift jede Sprache derzeit ist
  • Bietet Links zu den Projektnamen und -optionen der einzelnen Sprachen
jasonleonhard
quelle
3
"Verwendet Emojis, um zu zeigen, wie ausgereift jede Sprache derzeit ist", lesen Sie sich diese ein paar Mal vor ... es ist eine ziemlich tiefe Aussage.
IPatch
Ja, einfache intuitive Erklärungen gepaart mit albernen Ausdrücken.
Jasonleonhard