Quais linguagens podem ser compiladas para WebAssembly (Wasm)?

116

Quais linguagens podem ser compiladas para WebAssembly (Wasm)?

Eu acredito que agora C, C ++ e Rust (experimental) podem ser compilados para WebAssembly, com o back-end do compilador llvm, com linguagens como Java, Swift e C # não sendo suportadas atualmente, mas sendo possíveis candidatas para desenvolvimento futuro.

Não acredito que o JavaScript possa ser compilado para Wasm. https://github.com/WebAssembly/design/issues/219

Jordan Stewart
fonte
1
Apenas como uma observação para quem está lendo isso, recentemente usei C e C ++ para WASM via emscripten e funciona muito bem.
CoffeeTableEspresso

Respostas:

121

O suporte do WebAssembly está sempre evoluindo. No momento, ele é compatível com os seguintes idiomas:

Existem também soluções comerciais:

Em relação ao JavaScript, é improvável que obtenha suporte, pois WebAssembly é uma linguagem assembly com tipo estático.

Existem também várias linguagens mais obscuras / amadoras que suportam WebAssembly. Mais detalhes podem ser encontrados na lista mais completa de Idiomas do Awesome WebAssembly .

ColinE
fonte
1
Implementações comerciais de C # / Java / Swift: blogs.remobjects.com/2018/01/12/… . Também: github.com/appcypher/awesome-wasm-langs
Andreas Rossberg
Bom ponto - Eu adicionei RemObjects como uma categoria própria, pois é multilíngue e comercial
ColinE
1
Mas Python é tipado dinamicamente!
Richard Eng
17

Veja https://github.com/mbasso/awesome-wasm#compilers - por enquanto é apenas C / C ++, outros são experimentais, mas a quantidade da parte "experimental" cresce.

Atualmente, o WebAssembly suporta apenas memória linear plana. Isso é adequado para C / C ++ / Rust e muitas outras linguagens, mas a maioria das linguagens modernas populares precisa do coletor de lixo para funcionar. Esse é o "recurso pós-MVP" do WebAssembly (consulte https://github.com/WebAssembly/design/issues/1079 ). Por enquanto, a única opção é implementar o coletor de lixo dentro do wasm com algum código personalizado.

Nzeemin
fonte
2
Vale a pena acrescentar que asm.js pode ser facilmente compilado para wasm e asm.js é javascript. Dito isso, compilar javascript é / seria muito mais difícil porque geralmente carece de tanta informação contextual imediatamente disponível.
Culex
11

TeaVM pode ser usado para transpilar bytecode JVM para WebAssembly. Você pode verificar a página inicial do projeto em https://github.com/konsoletyper/teavm .

TeaVM em seu núcleo pode transpilar o bytecode JVM para JS e WebAssembly. O suporte WebAssembly está em um estágio inicial, mas existem demos disponíveis para comparar o desempenho de uma simulação JBox2D simples com GWT, TeaVM (saída JS) e TeaVM (saída WASM), que são bastante impressionantes.

Observe que WebAssembly atualmente não tem acesso direto ao DOM ou outras APIs JavaScript. Também no MVP atual não há suporte para tipos de dados opacos ou mesmo o GC. No entanto, é possível fazer up / downcalls de JS para WASM e vice-versa usando alguns truques de JS, como visto nas demos mencionadas.

Mirko Sertic
fonte
8

Este repo

Contém uma lista de linguagens que atualmente compilam ou têm suas VMs em WebAssembly (wasm)

Recursos:

  • Usa emojis para mostrar o quão maduro cada idioma está atualmente
  • Fornece links para nomes e opções de projeto de cada idioma
jasonleonhard
fonte
3
"Usa emojis para mostrar o quão maduro cada idioma está atualmente" leia isso para si mesmo algumas vezes ... é uma declaração bem profunda.
ipatch
Sim, explicações intuitivas simples combinadas com expressões idiotas.
jasonleonhard