llvm - tutorial - webassembly example
¿Qué idiomas se pueden compilar en WebAssembly(o wasm)? (4)
¿Qué idiomas se pueden compilar para el ensamblaje web (o wasm)?
Creo que en este momento C, C ++ y rust (experimental) se pueden compilar en el ensamblaje web, con el backend del compilador llvm, con lenguajes como Java, swift y C # que actualmente no son compatibles, pero que son posibles candidatos para el desarrollo futuro.
No creo que javascript pueda compilarse en wasm. https://github.com/WebAssembly/design/issues/219
Este repositorio
Contiene una lista de idiomas que actualmente compilan o tienen sus máquinas virtuales en WebAssembly (wasm)
caracteristicas:
- Utiliza emojis para mostrar qué tan maduro es actualmente cada idioma
- Proporciona enlaces a los nombres y opciones de proyectos de cada idioma.
El soporte de WebAssembly está en constante evolución. En este momento es compatible con los siguientes idiomas:
- C / C ++ : tiene muy buen soporte (listo para producción) a través de EmScripten u otras cadenas de herramientas mínimas basadas en LLVM
- Rust : WebAssembly es un objetivo oficialmente compatible, con una comunidad altamente activa a su alrededor.
- Go : ahora admite WebAssembly como un objetivo oficial pero experimental
- C # : tiene soporte experimental a través de Blazor , sin embargo, esto actualmente requiere incrustar un tiempo de ejecución .NET en Wasm. Blazor fue adoptado oficialmente por Microsoft como una tecnología experimental, con una versión preliminar reciente .
-
D : el subconjunto "betterC" de D puede compilarse en WebAssembly a través de LDC (compilador LLVM).
-
TypeScript : a través de AssemblyScript , altamente experimental, pero ganando impulso.
- Java : a través de TeaVM o Bytecoder
- Haxe - recién anunciado soporte
- Kotlin - Kotlin / Native 0.4 obtuvo soporte experimental de WebAssembly y a través de TeaVM
- Python : Pyodide es un puerto de Python a WebAssembly que incluye los paquetes principales de la pila científica de Python (Numpy, Pandas, matplotlib).
- PHP : experimental, pero con un prototipo funcional
- Perl : WebPerl es un puerto del binario de Perl para WebAssembly, que le permite ejecutar scripts de Perl en la web.
- Scala - usando el compilador Emscripten
- Ruby - a través del proyecto run.rb
- Swift : usando SwiftWasm , que se encuentra actualmente en desarrollo
Existen soluciones comerciales también:
- RemObjects : que ha anunciado soporte para C #, Java, Swift y Oxygene
Con respecto a JavaScript, es poco probable que obtenga soporte ya que WebAssembly es un lenguaje ensamblador estáticamente tipado.
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 .
TeaVM se puede utilizar para transpilar el bytecode 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 bytecode JVM a JS y WebAssembly. El soporte de WebAssembly se encuentra en una etapa inicial, 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. También en el MVP actual no hay soporte para tipos de datos opacos o incluso el GC. Sin embargo, es posible realizar llamadas ascendentes / descendentes desde JS a WASM y viceversa utilizando algunos trucos de JS, como se ve en las demostraciones mencionadas.
Vea 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 admite solo 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 "característica posterior al 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 algún código personalizado.