Quels langages peuvent être compilés en WebAssembly (Wasm)?

116

Quels langages peuvent être compilés en WebAssembly (Wasm)?

Je pense qu'à l'heure actuelle, C, C ++ et Rust (expérimental) peuvent être compilés vers WebAssembly, avec le backend du compilateur llvm, avec des langages comme Java, Swift et C # qui ne sont pas actuellement pris en charge, mais sont des candidats possibles pour un développement futur.

Je ne pense pas que JavaScript puisse être compilé sur Wasm. https://github.com/WebAssembly/design/issues/219

Jordan Stewart
la source
1
Juste une note à tous ceux qui lisent ceci, j'ai récemment utilisé C et C ++ pour WASM via emscripten et cela fonctionne très bien.
CoffeeTableEspresso

Réponses:

121

Le support WebAssembly est en constante évolution. À l'heure actuelle, il est pris en charge par les langues suivantes:

Il existe également des solutions commerciales:

En ce qui concerne JavaScript, il est peu probable qu'il soit pris en charge car WebAssembly est un langage d'assemblage de type statique.

Il existe également divers langages plus obscurs / amateurs qui prennent en charge WebAssembly. Plus de détails peuvent être trouvés sur la liste plus exhaustive des Awesome WebAssembly Languages .

Coline
la source
1
Implémentations commerciales C # / Java / Swift: blogs.remobjects.com/2018/01/12/… . Aussi: github.com/appcypher/awesome-wasm-langs
Andreas Rossberg
Bon point - J'ai ajouté RemObjects comme une catégorie à part car il est multilingue et commercial
ColinE
1
Mais Python est typé dynamiquement!
Richard Eng
17

Voir https://github.com/mbasso/awesome-wasm#compilers - pour l'instant ce n'est que C / C ++, d'autres sont expérimentaux, mais la quantité de la partie "expérimentale" augmente.

Actuellement, WebAssembly ne prend en charge que la mémoire linéaire plate. Cela convient à C / C ++ / Rust et à de nombreux autres langages, mais la plupart des langages modernes populaires ont besoin d'un garbage collector pour fonctionner. C'est la «fonctionnalité post-MVP» de WebAssembly (voir https://github.com/WebAssembly/design/issues/1079 ). Pour l'instant, la seule option est d'implémenter le garbage collector à l'intérieur du wasm avec du code personnalisé.

nzeemin
la source
2
Il vaut la peine d'ajouter que asm.js peut être facilement compilé en wasm et asm.js est javascript. Cela dit, compiler javascript est / serait beaucoup plus difficile car il manque généralement autant d'informations contextuelles immédiatement disponibles.
Culex
11

TeaVM peut être utilisé pour transpiler le bytecode JVM en WebAssembly. Vous pouvez consulter la page d'accueil du projet à l' adresse https://github.com/konsoletyper/teavm .

TeaVM à sa base peut transpiler le bytecode JVM en JS et WebAssembly. La prise en charge de WebAssembly est à un stade précoce, mais il existe des démos disponibles pour comparer les performances d'une simple simulation JBox2D avec GWT, TeaVM (sortie JS) et TeaVM (sortie WASM), qui sont assez impressionnantes.

Veuillez noter que WebAssembly n'a actuellement aucun accès direct au DOM ou à d'autres API JavaScript. De plus, dans le MVP actuel, il n'y a pas de support pour les types de données opaques ou même le GC. Cependant, il est possible de faire des appels ascendants / descendants de JS vers WASM et inversement en utilisant une astuce JS, comme le montrent les démos mentionnées.

Mirko Sertic
la source
8

Ce repo

Contient une liste des langages qui compilent actuellement ou ont leurs VM dans WebAssembly (wasm)

Fonctionnalités:

  • Utilise des emojis pour montrer la maturité actuelle de chaque langue
  • Fournit des liens vers les noms et options de chaque projet de langue
Jasonleonhard
la source
3
"Utilise des emojis pour montrer à quel point chaque langue est actuellement" lisez-la pour vous-même quelques fois ... c'est une déclaration assez profonde.
ipatch le
Oui, des explications intuitives simples associées à des expressions idiotes.
jasonleonhard