WebAssembly(Wasm)にコンパイルできる言語は何ですか?
現在、C、C++、Rust(実験的)がllvmコンパイラのバックエンドでWebAssemblyにコンパイルできると思います。Java、Swift、C#などの言語は現在サポートしていませんが、今後の開発の候補になると思います。
JavaScriptはWasmにコンパイルできないと思っています。 https://github.com/WebAssembly/design/issues/219
WebAssemblyのサポートは常に進化しています。現在、以下の言語でサポートされています。
C / C++** - EmScripten または他の 最小限の LLVM ベースのツールチェーン を介して非常に良い(生産準備)サポートがあります。
Rust** - WebAssembly は公式にサポートされているターゲットであり、その周辺には 非常に活発なコミュニティ が存在します。
Go** - Now supports WebAssembly が公式の、しかし実験的なターゲットとしてサポートされている。
C#** - Blazorによる実験的なサポートがありますが、現在、Wasmに.NETランタイムを埋め込む必要があります。Blazor は実験的な技術として Microsoft によって公式に採用され、recent preview release が公開されています。
D** - D の "betterC" サブセットは、LDC4 (LLVM コンパイラ) を通して WebAssembly にコンパイルすることができます。
TypeScript** - AssemblyScript経由、非常に実験的だが、勢いがある。
Haxe** - サポートが発表されたばかり 。
Kotlin** - WebAssembly の Kotlin/Native 0.4 実験的サポートを獲得、および TeaVM 経由。
Python** - PyodideはWebAssemblyへのPythonの移植で、科学的Pythonスタックのコアパッケージ(Numpy、Pandas、matplotlib)を含んでいます。
PHP - 実験的ですが、ワーキングプロトタイプがあります。
Perl** - WebPerl は Perl バイナリを WebAssembly に移植したもので、Web 上で Perl スクリプトを実行できるようにしたものです。
Scala - Emscriptenコンパイラを使用します。
ルビー** - run.rbプロジェクト経由
Swift** - 現在開発中のSwiftWasmを使用。
また、商用ソリューションもあります。
JavaScriptについては、WebAssemblyが静的型付けアセンブリ言語であるため、サポートされる可能性は低いと思われます。
また、WebAssemblyをサポートする、より無名で趣味的な言語もいろいろあります。詳細は、より包括的な Awesome WebAssembly Languages のリストで見ることができます。
https://github.com/mbasso/awesome-wasm#compilers -- 今はC/C++だけで、他は実験的なものですが、quot;experimental"の部分が大きくなっています。
現在、WebAssemblyはフラットリニアメモリだけをサポートしています。これはC/C++/Rustや他の多くの言語には適していますが、最近の一般的な言語ではガベージコレクタがないと動きません。これはWebAssemblyのポストMVP機能(https://github.com/WebAssembly/design/issues/1079)です。今のところ、唯一の選択肢は、いくつかのカスタムコードでwasmの内部にガベージコレクタを実装することです。
TeaVMは、JVMバイトコードをWebAssemblyにトランスパイルするために使用することができます。プロジェクトのホームページは https://github.com/konsoletyper/teavm でチェックアウトできます。
TeaVMは、JVMバイトコードをJSおよびWebAssemblyにトランスパイルすることができます。WebAssemblyのサポートは初期段階ですが、簡単なJBox2DシミュレーションをGWT、TeaVM(JS出力)、TeaVM(WASM出力)で比較するデモがあり、かなり印象的です。
なお、WebAssemblyは現在、DOMや他のJavaScript APIに直接アクセスすることはできません。また、現在のMVPでは、不透明なデータ型やGCさえもサポートされていません。しかし、前述のデモにあるように、JSのトリックを使ってJSからWASMへのアップ/ダウンコールを行ったり来たりすることは可能です。