2015-07-19 4 views
57

Я читал о asm.js и веб-узла недавно:В чем разница между asm.js и веб-сборкой?

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 (веб-сборка), являющимся двоичным, каковы различия между 2?
  3. Что это значит для других языков сценариев, работающих в браузере? Возьмите python, например, будет ли это
    • Код python, скомпилированный в wasm? или
    • интерпретатор python (Cpython), скомпилированный в wasm и интерпретирующий python?

ответ

25

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

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

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

Пока нет. wasm должен быть обратно совместимым, compilable to asm (который снова является исполняемым как обычный JS). В дальнейшем он может быть расширен с more features, так как поддержка для него растет.

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

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

+0

Пара отмечает. Первая часть вашего ответа кажется немного неоднозначной; похоже, вы говорите, что asm.js скомпилирует AOT в «более эффективный байт-код». Фактически, реализациям не нужно настраивать байт-код, и на самом деле многие из них нацелены на собственный [ISA] (https://en.wikipedia.org/wiki/Instruction_set) напрямую и AOT (что действительно является точкой, действительно) , Вы также говорите «скомпилировано для asm и js». Возможно, вы захотите уточнить, что вы хотели сказать «родная сборка» или что-то еще. Или, может быть, вы имели в виду «asm.js и js», но это не слишком полезно, поскольку один из них является подмножеством другого. – tne

+0

@tne: Спасибо за отзыв, я надеюсь, что смогу решить проблемы - не стесняйтесь (предлагайте) отредактировать себя, я был бы признателен. Правильно, я был немного слабым в «более эффективном байт-коде», поскольку я не был знаком с точной архитектурой компиляции, ведь ISA - это всего лишь еще один «байтовый код», который интерпретируется процессором. Пожалуйста, простите неточную терминологию :-) – Bergi

17

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

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

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

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

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

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

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

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

33

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.

+1

Пропустить парсинг? Там медленнее. В обозримом будущем аппаратная поддержка отключена от карты. Вы имеете в виду, что синтаксический анализ стал узким местом с asm.js и исправлениями wasm, которые с эффективным двоичным форматом. Ваше обоснование для asm.js/wasm кажется немного минималистичным, но все в порядке. Подставки для указания байт-кода! = AST. – tne