На каких языках можно скомпилировать WebAssembly (Wasm)?


116

На каких языках можно скомпилировать WebAssembly (Wasm)?

Я считаю, что прямо сейчас C, C ++ и Rust (экспериментальные) могут быть скомпилированы в WebAssembly с бэкэндом компилятора llvm, с такими языками, как Java, Swift и C #, которые в настоящее время не поддерживаются, но являются возможными кандидатами для будущей разработки.

Я не верю, что JavaScript можно скомпилировать в Wasm. https://github.com/WebAssembly/design/issues/219


1
В качестве примечания для всех, кто это читает, я недавно использовал C и C ++ для WASM через emscripten, и это работает очень хорошо.
CoffeeTableEspresso

Ответы:


121

Поддержка WebAssembly постоянно развивается. Сейчас он поддерживается на следующих языках:

Также существуют коммерческие решения:

Что касается JavaScript, то вряд ли он получит поддержку, поскольку WebAssembly - это статически типизированный язык ассемблера.

Существуют также различные более малоизвестные / любительские языки, поддерживающие WebAssembly. Более подробную информацию можно найти в более исчерпывающем списке языков Awesome WebAssembly .


1
Коммерческие реализации C # / Java / Swift: blogs.remobjects.com/2018/01/12/… . Также: github.com/appcypher/awesome-wasm-langs
Андреас Россберг,

Хороший момент - я добавил RemObjects как отдельную категорию, так как он многоязычный и коммерческий
ColinE

1
Но Python динамически типизирован!
Ричард Энг

17

См. Https://github.com/mbasso/awesome-wasm#compilers - пока только C / C ++, другие экспериментальные, но количество «экспериментальной» части растет.

В настоящее время WebAssembly поддерживает только плоскую линейную память. Это подходит для C / C ++ / Rust и многих других языков, но для работы большинства популярных современных языков требуется сборщик мусора. Это «пост-MVP-функция» WebAssembly (см. Https://github.com/WebAssembly/design/issues/1079 ). На данный момент единственный вариант - реализовать сборщик мусора внутри wasm с помощью некоторого настраиваемого кода.


2
Стоит добавить, что asm.js можно легко скомпилировать в wasm, а asm.js - это javascript. Тем не менее, компиляция javascript намного сложнее / будет намного сложнее, потому что обычно ему не хватает как можно больше доступной контекстной информации.
Culex

11

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. Тем не менее, можно выполнять вызовы вверх / вниз с JS на WASM и обратно, используя некоторые уловки JS, как показано в упомянутых демонстрациях.


8

Это репо

Содержит список языков, которые в настоящее время компилируются или имеют свои виртуальные машины в WebAssembly (wasm)

Особенности:

  • Использует смайлики, чтобы показать, насколько развит каждый язык в настоящее время
  • Предоставляет ссылки на названия и варианты проектов на каждом языке.

3
«Использует смайлики, чтобы показать, насколько развит каждый язык в настоящее время», - прочтите это про себя пару раз ... это довольно глубокое утверждение.
ipatch

Ага, простые интуитивно понятные объяснения в сочетании с глупыми выражениями.
jasonleonhard 09
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.