Недавно я читал об asm.js и WebAssembly:
http://ejohn.org/blog/asmjs-javascript-compile-target/
https://brendaneich.com/2015/06/from-asm-js-to-webassembly/
Я все еще не понимаю несколько вещей:
- Компилируется ли код asm.js и выполняется ли он вовремя? Скомпилировано во что?
- Помимо того, что asm.js является текстом, а wasm (веб-сборка) является двоичным, в чем разница между двумя?
- Что это означает для других языков сценариев, работающих в браузере? Возьмем, к примеру, питон, он будет
- код Python, скомпилированный в wasm? или
- Интерпретатор Python (Cpython), скомпилированный в wasm и интерпретирующий Python?
источник
asm.js - это подмножество JS с «высоко оптимизируемыми» инструкциями. По сути, вы можете объявить тип (int, float), и движок js (в браузерах, но также и в node.js) будет выполнять инструкции быстрее. Это дает преимущества, если ваше приложение выполняет много вычислений или графиков при использовании вместе с WebGL.
веб-сборка - это двоичный формат для JS, всего JS, а не только asm.js. Это не байт-код, это двоичная кодировка AST, которую вычисляет парсер. У этого есть 2 больших преимущества:
Мы уже можем писать код для браузеров, отличный от JS: EMSCripten может компилировать код C ++ в коде JS. Уже доступны другие транскомпиляторы для компиляции вашего кода в JS. Используя asm.js, этот код может работать быстрее, когда он выполняет вычисления. При использовании веб-сборки этот код будет более компактным, и браузер сможет обрабатывать его быстрее (потому что он сможет пропустить синтаксический анализ). У вас не будет загружаться новый плагин, такой как DirectX, JavaApplets, Flash или Silverlight, потому что все будет работать в песочнице JS.
источник
В разных браузерах код asm.js компилируется по-разному. По состоянию на август 2015 г .:
asm.js - это просто JavaScript и, следовательно, должен вести себя в точном соответствии со спецификацией JavaScript. В качестве нового стандарта WebAssembly может исправить некоторые критические случаи, когда поведение JavaScript не является идеальным (с точки зрения производительности или компиляции) [ 3 ]. В будущем [ 4 ] WebAssembly сможет добавлять функции, которые иначе было бы трудно выразить в JavaScript.
В версии 1 самый простой способ запустить Python в браузере - это скомпилировать интерпретатор Python в wasm, как вы сказали. Это означает, например, что сборщик мусора Python работает в коде wasm и вручную управляет линейной памятью wasm. Уже были экспериментальные проекты по добавлению бэкэнда asm.js в PyPy [ 5 ] (который может работать так же хорошо для wasm). В настоящее время он сталкивается с ограничениями asm.js, которые могут быть устранены с помощью будущей функции динамического связывания wasm. Идя дальше, wasm стремится обеспечить как интеграцию сборщика мусора, так и поддержку JIT-компиляции, что позволит обеспечить более эффективную и естественную интеграцию с веб-платформой.
источник