Jakie języki można skompilować do WebAssembly (Wasm)?

116

Jakie języki można skompilować do WebAssembly (Wasm)?

Uważam, że obecnie C, C ++ i Rust (eksperymentalne) można skompilować do WebAssembly, z zapleczem kompilatora llvm, przy czym języki takie jak Java, Swift i C # nie są obecnie obsługiwane, ale mogą być kandydatami do przyszłego rozwoju.

Nie wierzę, że JavaScript można skompilować do Wasm. https://github.com/WebAssembly/design/issues/219

Jordan Stewart
źródło
1
Uwaga dla każdego, kto to czyta, ostatnio użyłem C i C ++ do WASM przez emscripten i działa to bardzo ładnie.
CoffeeTableEspresso

Odpowiedzi:

121

Obsługa WebAssembly stale się rozwija. Obecnie jest obsługiwany w następujących językach:

Istnieją również rozwiązania komercyjne:

Jeśli chodzi o JavaScript, jest mało prawdopodobne, aby uzyskał wsparcie, ponieważ WebAssembly jest statycznym językiem asemblera.

Istnieją również różne, mniej znane / hobbystyczne języki, które obsługują WebAssembly. Więcej szczegółów można znaleźć na bardziej wyczerpującej liście Awesome WebAssembly Languages .

ColinE
źródło
1
Komercyjne implementacje C # / Java / Swift: blogs.remobjects.com/2018/01/12/… . Także: github.com/appcypher/awesome-wasm-langs
Andreas Rossberg
Słuszna uwaga - dodałem RemObjects jako własną kategorię, ponieważ jest wielojęzyczny i komercyjny
ColinE
1
Ale Python jest wpisywany dynamicznie!
Richard Eng
17

Zobacz https://github.com/mbasso/awesome-wasm#compilers - na razie to tylko C / C ++, inne są eksperymentalne, ale ilość części „eksperymentalnej” rośnie.

Obecnie WebAssembly obsługuje tylko płaską pamięć liniową. Jest to odpowiednie dla C / C ++ / Rust i wielu innych języków, ale większość popularnych współczesnych języków wymaga do działania garbage collectora. To „funkcja post-MVP” w WebAssembly (patrz https://github.com/WebAssembly/design/issues/1079 ). Na razie jedyną opcją jest zaimplementowanie garbage collectora wewnątrz wasm z jakimś niestandardowym kodem.

nzeemin
źródło
2
Warto dodać, że asm.js można łatwo skompilować do wasm, a asm.js to javascript. To powiedziawszy, kompilacja javascript jest / byłaby znacznie trudniejsza, ponieważ generalnie brakuje w nim tak wielu natychmiast dostępnych informacji kontekstowych.
Culex
11

TeaVM może służyć do transpozycji kodu bajtowego JVM do WebAssembly. Możesz sprawdzić stronę główną projektu pod adresem https://github.com/konsoletyper/teavm .

TeaVM w swej istocie może transponować kod bajtowy JVM do JS i WebAssembly. Obsługa WebAssembly jest na wczesnym etapie, ale dostępne są wersje demonstracyjne umożliwiające porównanie wydajności prostej symulacji JBox2D z GWT, TeaVM (wyjście JS) i TeaVM (wyjście WASM), które są dość imponujące.

Należy pamiętać, że WebAssembly obecnie nie ma bezpośredniego dostępu do DOM ani innych interfejsów API JavaScript. Również w obecnym MVP nie ma wsparcia dla nieprzezroczystych typów danych ani nawet GC. Jednak możliwe jest wykonywanie połączeń w górę / w dół z JS do WASM iz powrotem przy użyciu pewnych sztuczek JS, jak widać we wspomnianych demach.

Mirko Sertic
źródło
8

To repozytorium

Zawiera listę języków, które obecnie kompilują się lub mają swoje maszyny wirtualne w WebAssembly (wasm)

Cechy:

  • Używa emotikonów, aby pokazać, jak dojrzały jest obecnie każdy język
  • Zawiera łącza do nazw projektów i opcji w każdym języku
jasonleonhard
źródło
3
„Używa emotikonów, aby pokazać, jak dojrzały jest obecnie każdy język”, przeczytaj to sobie kilka razy ... to dość głębokie stwierdzenie.
ipatch
Tak, proste intuicyjne wyjaśnienia połączone z głupimi wyrażeniami.
jasonleonhard