Что такое ASM.js и что это значит для всех?

27

Я начинаю слышать раскаты об этом проекте под названием asm.js . В настоящее время их веб-сайт ужасен и запутан. Вот что я знаю из моих исследований в Интернете.

  • Это подмножество JavaScript, которое можно оптимизировать. Я предполагаю, потому что это избегает более динамичных частей языка.
  • Производительность кода, скомпилированного в ASM.js, работает примерно вдвое быстрее, чем C (не легкая).
  • Предполагается, что компиляторы сделают свой целевой язык ASM.js.
  • Firefox будет поставляться с оптимизацией ASM.js.
  • Команды Mozilla и Unreal портировали Unreal Engine в сеть с ним, и он работает в сборке Firefox на почти родной скорости.

Там , кажется, не будет какой - либо информации бетоны на веб - о том , что это действительно является или полезности или конечной цели. Может быть, я могу скомпилировать свои серверные кодовые базы и запустить его в браузере на скоростях, близких к исходным? Каковы последствия для разработчиков?

Джаррод Крапива
источник

Ответы:

21

Вы уже описали, что это такое . Дело в том, что это низкоуровневый язык, который работает во всех браузерах, довольно быстрый в большинстве и очень быстрый в некоторых. То, что вы делаете из этого, так же открыто, как и любой другой язык программирования.

Сценарий использования Mozilla, по-видимому, наиболее заинтересован в следующем: уже есть способы компиляции языков с бэкэндами LLVM (особенно C и C ++) в JavaScript через Emscripten. asm.js очень близок к тому, что Emscripten уже испускает, поэтому это позволяет коду Emscripten (который уже впечатляюще быстр в современных JIT-компиляторах JavaScript) стать еще быстрее, продвигая цель переноса существующих баз кода в сеть. Опять же, для чего именно вы используете это ваше решение. Портирование игр - один из вариантов использования (в котором Mozilla, по-видимому, активно участвует), но на C и C ++ написано бесчисленное множество вещей, довольно много из которых могут пригодиться для чьего-либо веб-сайта. Некоторые из них, которые я видел, бросались (плюс некоторые из моих собственных разработок), без каких-либо гарантий относительно осуществимости:

  • Портирование алгоритмов общего назначения (например, zlib, libjpeg, openssl, реализации FFT) для расширения возможностей JavaScript / веб-сайтов для выполнения большего, без необходимости создания нового веб-стандарта и в зависимости от отдельных браузеров для его реализации.
  • Портирование интерпретаторов, так что в браузере могут работать языки, отличные от JavaScript, с меньшими издержками и минимальными усилиями по переносу.
  • Использование asm.js в качестве бэкэнда для большего количества компиляторов, особенно тех, которые плохо отображаются на JavaScript и не нуждаются в большинстве его функций и накладных расходов. Примером может служить язык, предназначенный для быстрой числовой работы без выделения памяти.
  • Использование asm.js для создания JIT в JavaScript. Он может реализовывать любой язык вообще - например, ActionScript .
  • В том же духе портирование существующих JIT-компиляторов для запуска в браузере (см. Перенос интерпретаторов с фактически нулевыми накладными расходами по сравнению с JS). Это, вероятно, возможно только тогда, когда JIT-компиляторы генерируются автоматически, как в PyPy.

источник
2
Вот еще одно хорошее объяснение: ejohn.org/blog/asmjs-javascript-compile-target
Джаррод Неттлс
1
Вот подтверждение концепции для переноса JIT в asm.js. Это уникальная точка продажи, большинство новых платформ не поддерживают JIT.
Тобу
Есть ли где-нибудь объяснение того, как asm.js поддерживает компиляцию JIT? Не могу найти информацию об этом. Больше всего интересует, как обрабатываются последствия для безопасности.
Роман Старков
@romkyns JIT-компиляция asm.js в машинный код браузерами или JIT-компиляция в asm.js (программой JavaScript)? Для первых, по крайней мере в Firefox, средства генерации машинного кода JIT-компиляторов pure-JS используются повторно. Поскольку asm.js может вызывать только JS, выполнять арифметику и считывать / записывать массив кучи с проверками индекса в диапазоне, безопасность примерно такая же, как и безопасность выполнения JS. В последнем случае вы просто генерируете исходный код asm.js и позволяете браузеру выполнять его, и никаких дополнительных последствий для безопасности, помимо того, что я упоминал ранее, не возникает.
(Я имел ввиду последнее) Оо конечно; как-то я представлял JIT-компиляторы, испускающие машинный код. Благодарю за разъяснение!
Роман Старков
4

Представьте себе ASM.js как большой двоичный ArrayBuffer, называемый кучей и набором модулей JavaScript, которые начинаются с директивы пролога "use asm";и выполняют быстрые низкоуровневые операции с необработанными двоичными данными, аналогично языкам ассемблера. Эти модули могут быть написаны вручную или лучше скомпилированы из кода LLVM такими скриптами, как Emscripten. Их производительность может быть повышена благодаря движку Mozilla OdinMonkey, но они обратно совместимы с большинством современных интерпретаторов ECMAScript.

ASM.js не ограничивается играми, вы даже можете запускать целые приложения Qt в своем браузере, как эти !

niutech
источник