What languages can be compiled to WebAssembly (Wasm)?

LlvmProgramming LanguagesWebassembly

Llvm Problem Overview


What languages can be compiled to WebAssembly (Wasm)?

I believe right now C, C++, and Rust (experimental) can be compiled to WebAssembly, with the llvm compiler backend, with languages like Java, Swift, and C# not currently being supported, but being possible candidates for future development.

I don't believe JavaScript can be compiled to Wasm. https://github.com/WebAssembly/design/issues/219

Llvm Solutions


Solution 1 - Llvm

WebAssembly support is ever evolving. Right now it is supported by the following languages:

There are commercial solutions also:

Regarding JavaScript, it is unlikely to gain support as WebAssembly is a statically typed assembly language.

There are also various more obscure / hobbyist languages that support WebAssembly. Further details can be found on the more exhaustive Awesome WebAssembly Languages list.

Solution 2 - Llvm

See https://github.com/mbasso/awesome-wasm#compilers -- for now it's only C/C++, others are experimental, but amount of the "experimental" part grows.

Currently WebAssembly supports just flat linear memory. That's suitable for C/C++/Rust and a lot of other languages, but most popular modern languages need garbage collector to run. That's "post-MVP feature" of WebAssembly (see https://github.com/WebAssembly/design/issues/1079). For now the only option is to implement garbage collector inside the wasm with some custom code.

Solution 3 - Llvm

This repo

Contains a list of languages that currently compile to or have their VMs in WebAssembly(wasm)

Features:

  • Uses emojis to show how mature each language is currently
  • Provides links to each languages project names and options

Solution 4 - Llvm

TeaVM can be used to transpile JVM bytecode to WebAssembly. You can checkout the project homepage at https://github.com/konsoletyper/teavm.

TeaVM at its core can transpile JVM bytecode to JS and WebAssembly. WebAssembly support is in an early stage, but there are demos available to compare performance of a simple JBox2D simulation with GWT, TeaVM(JS output) and TeaVM(WASM output), which are quite impressive.

Please note that WebAssembly currently has no direct access to the DOM or other JavaScript APIs. Also in the current MVP there is no support for opaque datatypes or even the GC. However, it is possible to do up/downcalls from JS to WASM and back again using some JS trickery, as seen in the mentioned demos.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionJordan StewartView Question on Stackoverflow
Solution 1 - LlvmColinEView Answer on Stackoverflow
Solution 2 - LlvmnzeeminView Answer on Stackoverflow
Solution 3 - LlvmjasonleonhardView Answer on Stackoverflow
Solution 4 - LlvmMirko SerticView Answer on Stackoverflow