В чем разница между asm.js и WebAssembly?

101

Недавно я читал об asm.js и WebAssembly:

http://ejohn.org/blog/asmjs-javascript-compile-target/

https://brendaneich.com/2015/06/from-asm-js-to-webassembly/

Я все еще не понимаю несколько вещей:

  1. Компилируется ли код asm.js и выполняется ли он вовремя? Скомпилировано во что?
  2. Помимо того, что asm.js является текстом, а wasm (веб-сборка) является двоичным, в чем разница между двумя?
  3. Что это означает для других языков сценариев, работающих в браузере? Возьмем, к примеру, питон, он будет
    • код Python, скомпилированный в wasm? или
    • Интерпретатор Python (Cpython), скомпилированный в wasm и интерпретирующий Python?
NeoWang
источник

Ответы:

47

Компилируется ли код asm.js и выполняется ли он вовремя? Скомпилировано во что?

asm.js - это обычный код javascript, который, как всегда, компилируется в байт-код интерпретатором JS. Однако интерпретатор с поддержкой asm должен выполнять предварительную компиляцию и, возможно, генерировать более эффективное представление кода из-за статической типизации. Подробнее см. Http://asmjs.org/ .

в чем разница между asm и wasm (кроме текста и двоичного кода)?

Пока нет. wasm должен быть обратно совместимым, компилируемым в asm (который снова исполняется как обычный JS). Однако в будущем он может быть расширен дополнительными функциями по мере роста его поддержки.

Что это означает для других языков сценариев, работающих в браузере?

Последнее, скорее, как Python еще требует интерпретации. Языки сценариев, которым не нужен интерпретатор, конечно, можно напрямую скомпилировать в (w) asm, при условии, что существует компилятор (цепочка), который поддерживает его в качестве цели.

Берги
источник
1
Пара заметок. Первая часть вашего ответа кажется немного двусмысленной; похоже, вы говорите, что asm.js скомпилирует AOT в «более эффективный байт-код». Фактически, реализации не должны нацеливаться на байт-код, и на самом деле многие нацелены непосредственно на собственный ISA и AOT (что на самом деле является своего рода точкой). Вы также говорите «компилируется в asm и js». Возможно, вы захотите пояснить, что вы хотели сказать «родная сборка» или что-то в этом роде. Или, может быть, вы имели в виду «asm.js и js», но это не слишком полезно, поскольку один является подмножеством другого.
tne
1
@tne: Спасибо за отзыв, я надеюсь, что смогу решить проблему - не стесняйтесь (предлагать) редактировать самостоятельно, я буду признателен. Правильно, я немного расслабился по поводу «более эффективного байт-кода», поскольку я не был знаком с точной архитектурой компиляции, в конце концов, ISA - это просто еще один «байт-код», который интерпретируется процессором. Прошу прощения за неточную терминологию :-)
Берги
53

asm.js - это подмножество JS с «высоко оптимизируемыми» инструкциями. По сути, вы можете объявить тип (int, float), и движок js (в браузерах, но также и в node.js) будет выполнять инструкции быстрее. Это дает преимущества, если ваше приложение выполняет много вычислений или графиков при использовании вместе с WebGL.

веб-сборка - это двоичный формат для JS, всего JS, а не только asm.js. Это не байт-код, это двоичная кодировка AST, которую вычисляет парсер. У этого есть 2 больших преимущества:

  • движок JS может пропустить этап синтаксического анализа
  • он намного компактнее, чем исходный код JS

Мы уже можем писать код для браузеров, отличный от JS: EMSCripten может компилировать код C ++ в коде JS. Уже доступны другие транскомпиляторы для компиляции вашего кода в JS. Используя asm.js, этот код может работать быстрее, когда он выполняет вычисления. При использовании веб-сборки этот код будет более компактным, и браузер сможет обрабатывать его быстрее (потому что он сможет пропустить синтаксический анализ). У вас не будет загружаться новый плагин, такой как DirectX, JavaApplets, Flash или Silverlight, потому что все будет работать в песочнице JS.

Кристиан Ви
источник
5
Пропустить парсинг? Помедленнее, там. Поддержка оборудования в обозримом будущем не планируется. Вы имеете в виду, что синтаксический анализ стал узким местом для asm.js, и wasm исправляет это с помощью эффективного двоичного формата. Ваше обоснование asm.js / wasm кажется немного минималистичным, но это нормально. Реквизит для указания байт-кода! = AST.
tne
5
@Cristian, WASM не является двоичным форматом для JS. Он будет использовать те же веб-API, что и JS, но он гораздо более переносим и универсален, чем JS. Единственные двоичные форматы для JS или байт-кодов реализованы в браузерах, например в Firefox здесь: developer.mozilla.org/en-US/docs/Mozilla/Projects/SpiderMonkey/…
LearningFast
20

Компилируется ли код asm.js и выполняется ли он вовремя? Скомпилировано во что?

В разных браузерах код asm.js компилируется по-разному. По состоянию на август 2015 г .:

  • Firefox компилирует asm.js в машинный код (и кэширует машинный код для будущих загрузок того же asm.js) [ 1 ].
  • В Windows 10 в качестве экспериментального флага Edge также будет выполнять некоторую опережающую проверку и компиляцию asm.js [ 2 ].
  • Chrome специально распознает директиву «use asm» в начале asm.js для более тщательного анализа и анализа кода и настройки эвристики компиляции.
  • Safari не обрабатывает asm.js.

Помимо того, что asm.js является текстом, а wasm (веб-сборка) является двоичным, в чем разница между двумя?

asm.js - это просто JavaScript и, следовательно, должен вести себя в точном соответствии со спецификацией JavaScript. В качестве нового стандарта WebAssembly может исправить некоторые критические случаи, когда поведение JavaScript не является идеальным (с точки зрения производительности или компиляции) [ 3 ]. В будущем [ 4 ] WebAssembly сможет добавлять функции, которые иначе было бы трудно выразить в JavaScript.

Что это означает для других языков сценариев, работающих в браузере? Возьмем, к примеру, питон, он будет

  • код Python, скомпилированный в wasm? или
  • Интерпретатор Python (Cpython), скомпилированный в wasm и интерпретирующий Python?

В версии 1 самый простой способ запустить Python в браузере - это скомпилировать интерпретатор Python в wasm, как вы сказали. Это означает, например, что сборщик мусора Python работает в коде wasm и вручную управляет линейной памятью wasm. Уже были экспериментальные проекты по добавлению бэкэнда asm.js в PyPy [ 5 ] (который может работать так же хорошо для wasm). В настоящее время он сталкивается с ограничениями asm.js, которые могут быть устранены с помощью будущей функции динамического связывания wasm. Идя дальше, wasm стремится обеспечить как интеграцию сборщика мусора, так и поддержку JIT-компиляции, что позволит обеспечить более эффективную и естественную интеграцию с веб-платформой.

Люк
источник