What languages can be compiled to WebAssembly (Wasm)? [closed]

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


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

  • C / C++ - has very good (production ready) support via EmScripten, or other minimal LLVM-based toolchains

  • Rust - WebAssembly is an officially supported target, with a highly active community around it.

  • Go - has now supports WebAssembly as an official, yet experimental, target

  • C# - has experimental support via Blazor, however this currently requires embedding a .NET runtime into Wasm. Blazor was officially adopted by Microsoft as an experimental technology, with a recent preview release.

  • D - the "betterC" subset of D can be compiled to WebAssembly through LDC (LLVM compiler).

  • TypeScript - via AssemblyScript, highly experimental, but gaining momentum.

  • Java - via TeaVM or Bytecoder

  • Haxe - just announced support

  • Kotlin - Kotlin/Native 0.4 gained experimental support of WebAssembly and via TeaVM

  • Python - Pyodide is a port of Python to WebAssembly that includes the core packages of the scientific Python stack (Numpy, Pandas, matplotlib).

  • PHP - Experimental, but with a working prototype

  • Perl - WebPerl is a port of the Perl binary to WebAssembly, allowing you to run Perl scripts on the web.

  • Scala - using the Emscripten compiler, and TeaVM

  • Ruby - via the run.rb project

  • Swift - using SwiftWasm

There are commercial solutions also:

  • RemObjects - Which has announced support for C#, Java, Swift and Oxygene

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.


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.