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.