Quali lingue possono essere compilate in WebAssembly (Wasm)?


116

Quali lingue possono essere compilate in WebAssembly (Wasm)?

Credo che in questo momento C, C ++ e Rust (sperimentale) possano essere compilati in WebAssembly, con il backend del compilatore llvm, con linguaggi come Java, Swift e C # attualmente non supportati, ma possibili candidati per lo sviluppo futuro.

Non credo che JavaScript possa essere compilato su Wasm. https://github.com/WebAssembly/design/issues/219


1
Proprio come una nota per chiunque legga questo, ho recentemente usato C e C ++ per WASM tramite emscripten e funziona molto bene.
CoffeeTableEspresso

Risposte:


121

Il supporto di WebAssembly è in continua evoluzione. Al momento è supportato dalle seguenti lingue:

Esistono anche soluzioni commerciali:

Per quanto riguarda JavaScript, è improbabile che ottenga supporto poiché WebAssembly è un linguaggio assembly tipizzato staticamente.

Ci sono anche vari linguaggi più oscuri / hobbisti che supportano WebAssembly. Ulteriori dettagli possono essere trovati nella più esauriente lista di lingue di Awesome WebAssembly .


1
Implementazioni commerciali C # / Java / Swift: blogs.remobjects.com/2018/01/12/… . Inoltre: github.com/appcypher/awesome-wasm-langs
Andreas Rossberg

Buon punto - ho aggiunto RemObjects come categoria a sé stante in quanto è multilingue e commerciale
ColinE

1
Ma Python è digitato dinamicamente!
Richard Eng

17

Vedi https://github.com/mbasso/awesome-wasm#compilers - per ora è solo C / C ++, altri sono sperimentali, ma la quantità della parte "sperimentale" cresce.

Attualmente WebAssembly supporta solo la memoria lineare piatta. È adatto per C / C ++ / Rust e molti altri linguaggi, ma i linguaggi moderni più popolari richiedono il garbage collector per essere eseguito. Questa è la "funzionalità post-MVP" di WebAssembly (vedere https://github.com/WebAssembly/design/issues/1079 ). Per ora l'unica opzione è implementare il garbage collector all'interno del wasm con del codice personalizzato.


2
Vale la pena aggiungere che asm.js può essere facilmente compilato in wasm e asm.js è javascript. Detto questo, la compilazione di javascript è / sarebbe molto più difficile perché generalmente mancano tante informazioni contestuali immediatamente disponibili.
Culex

11

TeaVM può essere utilizzato per trasferire il bytecode JVM in WebAssembly. Puoi controllare la home page del progetto su https://github.com/konsoletyper/teavm .

TeaVM al suo interno può trasferire il bytecode JVM in JS e WebAssembly. Il supporto di WebAssembly è in una fase iniziale, ma sono disponibili demo per confrontare le prestazioni di una semplice simulazione JBox2D con GWT, TeaVM (output JS) e TeaVM (output WASM), che sono piuttosto impressionanti.

Tieni presente che WebAssembly attualmente non ha accesso diretto al DOM o ad altre API JavaScript. Anche nell'attuale MVP non c'è supporto per i tipi di dati opachi e nemmeno il GC. Tuttavia, è possibile fare up / downcall da JS a WASM e viceversa utilizzando alcuni trucchi JS, come si vede nelle demo menzionate.


8

Questo repo

Contiene un elenco di lingue che attualmente si compilano o hanno le loro VM in WebAssembly (wasm)

Caratteristiche:

  • Utilizza gli emoji per mostrare quanto è matura ogni lingua attualmente
  • Fornisce collegamenti ai nomi e alle opzioni del progetto di ciascuna lingua

3
"Usa gli emoji per mostrare quanto è matura ogni lingua attualmente" leggilo a te stesso un paio di volte ... è un'affermazione piuttosto profonda.
ipatch

Sì, spiegazioni semplici e intuitive abbinate a espressioni sciocche.
jasonleonhard
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.