Какие языки можно скомпилировать в WebAssembly (или wasm)?
Какие языки могут быть скомпилированы для веб-сборки (или wasm)?
Я считаю, что сейчас C, С++ и ржавчина (экспериментальная) могут быть скомпилированы в веб-сборку с использованием компилятора llvm с такими языками, как Java, Swift и С#, которые в настоящее время не поддерживаются, а являются возможными кандидатами на будущую разработку.
Я не верю, что javascript может быть скомпилирован в wasm.
https://github.com/WebAssembly/design/issues/219
Ответы
Ответ 1
Поддержка WebAssembly постоянно развивается. Прямо сейчас это поддерживается следующими языками:
- C/C++ - имеет очень хорошую (готовую к работе) поддержку через EmScripten или другие минимальные наборы инструментов на основе LLVM
- Rust - WebAssembly - официально поддерживаемая цель, вокруг которой активно работает сообщество.
- Go - теперь поддерживает WebAssembly в качестве официальной, но экспериментальной цели
- С# - имеет экспериментальную поддержку через Blazor, однако для этого в настоящее время требуется встраивание среды выполнения .NET в Wasm. Blazor был официально принят Microsoft как экспериментальная технология с недавним предварительным выпуском.
-
D - подмножество "betterC" в D может быть скомпилировано в WebAssembly через LDC (компилятор LLVM).
-
TypeScript - через AssemblyScript, очень экспериментальный, но набирает обороты.
- Java - через TeaVM или Bytecoder
- Haxe - только что объявили о поддержке
- Kotlin - Kotlin/Native 0.4 получил экспериментальную поддержку WebAssembly и через TeaVM
- Python - Pyodide - это порт Python для WebAssembly, включающий основные пакеты научного стека Python (Numpy, Pandas, matplotlib).
- PHP - экспериментальный, но с работающим прототипом
- Perl - WebPerl - это порт двоичного файла Perl для WebAssembly, позволяющий запускать сценарии Perl в Интернете.
- Scala - использование компилятора Emscripten
- Ruby - через проект run.rb
- Swift - использует SwiftWasm, который в данный момент находится в разработке
Есть также коммерческие решения:
Что касается JavaScript, он вряд ли получит поддержку, поскольку WebAssembly - это статически типизированный язык ассемблера.
Существуют также более неясные/увлеченные языки, которые поддерживают WebAssembly. Более подробную информацию можно найти в более исчерпывающем списке языков Awesome WebAssembly.
Ответ 2
См. https://github.com/mbasso/awesome-wasm#compilers - пока это только C/С++, другие экспериментальные, но количество "экспериментальной" части возрастает.
В настоящее время WebAssembly поддерживает только плоскую линейную память. Это подходит для C/С++/Rust и многих других языков, но большинству популярных современных языков нужен сборщик мусора для запуска. Эта функция "после MVP" WebAssembly (см. https://github.com/WebAssembly/design/issues/1079). На данный момент единственным вариантом является реализация сборщика мусора внутри арены с некоторым пользовательским кодом.
Ответ 3
TeaVM может использоваться для пересылки байт-кода JVM в WebAssembly. Вы можете проверить домашнюю страницу проекта на https://github.com/konsoletyper/teavm.
TeaVM по своему ядру может передавать байт-код JVM в JS и WebAssembly. Поддержка WebAssembly находится на ранней стадии, но есть демонстрации для сравнения производительности простого JBox2D-моделирования с GWT, TeaVM (выход JS) и TeaVM (выход WASM), которые весьма впечатляют.
Обратите внимание, что WebAssembly в настоящее время не имеет прямого доступа к DOM или другим API-интерфейсам JavaScript. Также в текущем MVP нет поддержки непрозрачных типов данных или даже GC. Тем не менее, можно сделать up/downcalls от JS до WASM и вернуться снова, используя некоторые трюки JS, как видно из упомянутых демонстраций.
Ответ 4
Содержит список языков, которые в настоящее время компилируются или имеют свои виртуальные машины в WebAssembly (wasm)
Особенности:
- Использует смайлики, чтобы показать, насколько зрелым является каждый язык
- Предоставляет ссылки на названия и параметры проекта для каждого языка.