¿Qué lenguajes se pueden compilar en WebAssembly (Wasm)?

116

¿Qué lenguajes se pueden compilar en WebAssembly (Wasm)?

Creo que en este momento C, C ++ y Rust (experimental) se pueden compilar en WebAssembly, con el backend del compilador llvm, con lenguajes como Java, Swift y C # que no se admiten actualmente, pero son posibles candidatos para el desarrollo futuro.

No creo que JavaScript se pueda compilar en Wasm. https://github.com/WebAssembly/design/issues/219

Jordan Stewart
fuente
1
Solo como una nota para cualquiera que lea esto, recientemente usé C y C ++ para WASM a través de emscripten y funciona muy bien.
CoffeeTableEspresso

Respuestas:

121

El soporte de WebAssembly está en constante evolución. En este momento es compatible con los siguientes idiomas:

También existen soluciones comerciales:

Con respecto a JavaScript, es poco probable que obtenga soporte ya que WebAssembly es un lenguaje ensamblador de tipado estático.

También hay varios lenguajes más oscuros / aficionados que admiten WebAssembly. Se pueden encontrar más detalles en la lista más exhaustiva de Awesome WebAssembly Languages .

ColinE
fuente
1
Implementaciones comerciales de C # / Java / Swift: blogs.remobjects.com/2018/01/12/… . También: github.com/appcypher/awesome-wasm-langs
Andreas Rossberg
Buen punto - ¡Tengo RemObjects como una categoría de su propio ya que es multi-idioma y comercial
Coline
1
¡Pero Python se escribe dinámicamente!
Richard Eng
17

Ver https://github.com/mbasso/awesome-wasm#compilers - por ahora es solo C / C ++, otros son experimentales, pero la cantidad de la parte "experimental" crece.

Actualmente, WebAssembly solo admite memoria lineal plana. Eso es adecuado para C / C ++ / Rust y muchos otros lenguajes, pero los lenguajes modernos más populares necesitan un recolector de basura para ejecutarse. Esa es la "función posterior a MVP" de WebAssembly (consulte https://github.com/WebAssembly/design/issues/1079 ). Por ahora, la única opción es implementar un recolector de basura dentro del wasm con un código personalizado.

nzeemin
fuente
2
Vale la pena agregar que asm.js se puede compilar fácilmente en wasm y asm.js es javascript. Dicho esto, compilar javascript es / sería mucho más difícil porque generalmente carece de tanta información contextual inmediatamente disponible.
Culex
11

TeaVM se puede utilizar para transpilar el código de bytes de JVM a WebAssembly. Puede consultar la página de inicio del proyecto en https://github.com/konsoletyper/teavm .

TeaVM en su núcleo puede transpilar código de bytes JVM a JS y WebAssembly. El soporte de WebAssembly se encuentra en una etapa temprana, pero hay demostraciones disponibles para comparar el rendimiento de una simulación JBox2D simple con GWT, TeaVM (salida JS) y TeaVM (salida WASM), que son bastante impresionantes.

Tenga en cuenta que WebAssembly actualmente no tiene acceso directo al DOM u otras API de JavaScript. Además, en el MVP actual no hay soporte para tipos de datos opacos o incluso el GC. Sin embargo, es posible realizar llamadas ascendentes / descendentes de JS a WASM y viceversa utilizando algunos trucos de JS, como se ve en las demostraciones mencionadas.

Mirko Sertic
fuente
8

Este repositorio

Contiene una lista de lenguajes que actualmente compilan o tienen sus VM en WebAssembly (wasm)

caracteristicas:

  • Utiliza emojis para mostrar qué tan maduro es cada idioma actualmente
  • Proporciona enlaces a los nombres y opciones de los proyectos de cada idioma.
Jasonleonhard
fuente
3
"Usa emojis para mostrar cuán maduro es cada idioma actualmente" léelo para ti mismo un par de veces ... es una declaración bastante profunda.
ipatch
Sí, explicaciones sencillas e intuitivas junto con expresiones tontas.
jasonleonhard