Bahasa apa yang dapat dikompilasi ke WebAssembly (Wasm)?

116

Bahasa apa yang dapat dikompilasi ke WebAssembly (Wasm)?

Saya yakin saat ini C, C ++, dan Rust (eksperimental) dapat dikompilasi ke WebAssembly, dengan backend compiler llvm, dengan bahasa seperti Java, Swift, dan C # saat ini tidak didukung, tetapi menjadi kandidat yang mungkin untuk pengembangan di masa mendatang.

Saya tidak percaya JavaScript dapat dikompilasi ke Wasm. https://github.com/WebAssembly/design/issues/219

Jordan Stewart
sumber
1
Sama seperti catatan bagi siapa pun yang membaca ini, saya baru-baru ini menggunakan C dan C ++ ke WASM melalui emscripten dan berfungsi dengan sangat baik.
CoffeeTableEspresso

Jawaban:

121

Dukungan WebAssembly terus berkembang. Saat ini didukung oleh bahasa berikut:

Ada juga solusi komersial:

Mengenai JavaScript, tidak mungkin untuk mendapatkan dukungan karena WebAssembly adalah bahasa assembly yang diketik secara statis.

Ada juga berbagai bahasa yang lebih tidak jelas / hobi yang mendukung WebAssembly. Rincian lebih lanjut dapat ditemukan di daftar Bahasa WebAssembly yang lebih lengkap .

ColinE
sumber
1
Penerapan C # / Java / Swift komersial : blogs.remobjects.com/2018/01/12/… . Juga: github.com/appcypher/awesome-wasm-langs
Andreas Rossberg
Poin bagus - Saya telah menambahkan RemObjects sebagai kategorinya sendiri karena multi-bahasa dan komersial
ColinE
1
Tapi Python diketik secara dinamis!
Richard Eng
17

Lihat https://github.com/mbasso/awesome-wasm#compilers - untuk saat ini hanya C / C ++, yang lain masih eksperimental, tetapi jumlah bagian "eksperimental" bertambah.

Saat ini WebAssembly hanya mendukung memori linier datar. Itu cocok untuk C / C ++ / Rust dan banyak bahasa lainnya, tetapi sebagian besar bahasa modern yang populer membutuhkan pengumpul sampah untuk dijalankan. Itu adalah "fitur pasca-MVP" dari WebAssembly (lihat https://github.com/WebAssembly/design/issues/1079 ). Untuk saat ini, satu-satunya pilihan adalah menerapkan pengumpul sampah di dalam wasm dengan beberapa kode khusus.

nzeemin.dll
sumber
2
Perlu ditambahkan bahwa asm.js dapat dengan mudah dikompilasi menjadi wasm dan asm.js adalah javascript. Meskipun demikian, mengompilasi javascript akan jauh lebih sulit karena umumnya tidak memiliki informasi kontekstual yang segera tersedia.
Culex
11

TeaVM dapat digunakan untuk memindahkan bytecode JVM ke WebAssembly. Anda dapat memeriksa beranda proyek di https://github.com/konsoletyper/teavm .

TeaVM pada intinya dapat memindahkan bytecode JVM ke JS dan WebAssembly. Dukungan WebAssembly masih dalam tahap awal, tetapi tersedia demo untuk membandingkan kinerja simulasi JBox2D sederhana dengan GWT, TeaVM (keluaran JS) dan TeaVM (keluaran WASM), yang cukup mengesankan.

Harap dicatat bahwa WebAssembly saat ini tidak memiliki akses langsung ke DOM atau JavaScript API lainnya. Juga dalam MVP saat ini, tidak ada dukungan untuk tipe data buram atau bahkan GC. Namun, dimungkinkan untuk melakukan up / downcall dari JS ke WASM dan kembali lagi menggunakan beberapa trik JS, seperti yang terlihat pada demo yang disebutkan.

Mirko Sertic
sumber
8

Repo ini

Berisi daftar bahasa yang saat ini dikompilasi ke atau memiliki VM-nya di WebAssembly (wasm)

Fitur:

  • Menggunakan emoji untuk menunjukkan seberapa dewasa setiap bahasa saat ini
  • Menyediakan link ke setiap nama dan opsi proyek bahasa
jasonleonhard
sumber
3
"Menggunakan emoji untuk menunjukkan seberapa dewasa setiap bahasa saat ini" bacalah satu itu untuk diri Anda sendiri beberapa kali ... itu pernyataan yang cukup dalam.
ipatch
Yup, penjelasan intuitifnya sederhana ditambah dengan ekspresi konyol.
jasonleonhard