What languages can be compiled to WebAssembly (Wasm)?
LlvmProgramming LanguagesWebassemblyLlvm 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:
-
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.
-
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.
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.