Pull to refresh

Часто задаваемые вопросы про asm.js

Reading time 4 min
Views 42K
Original author: Фонд Мозиллы
asm.js — необыкновенно оптимизируемое, низкоуровневое подмножество JavaScript. asmjs.org

asm.js — новый язык?


Нет, это просто подмножество JavaScript. Программа на asm.js одинаково поведёт себя и в существующих движках JavaScript, и в движке с предварительной (ahead-of-time, AOT) компиляцией, способном распознавать и оптимизировать asm.js; различаться будет её скорость, разумеется!

Какой выигрыш в производительности можно ожидать от asm.js?


Сейчас ещё рано утверждать. Однако наши предварительные измерения производительности программ, скомпилированных из Си в asm.js, показывают не более чем двукратное замедление по сравнению с компилированными в машинный код посредством clang. Мы опубликуем дальнейшие измерения, когда насобираем их.

Как я могу следить за ходом реализации?


Мозилла работает над первой реализацией оптимизирующего компилятора asm.js для SpiderMonkey. В вики Фонда Мозиллы также опубликован план разработки дальнейших выпусков и оптимизаций. Если авторы других движков JavaScript опубликуют собственные планы реализации компиляторов asm.js, мы их здесь упомянем.

Почему бы вам не разработать синтаксис байткода вместо необычного диалекта джаваскрипта?


Для компиляторов наподобие Emscripten или Mandreel синтаксис байткодового языка попросту не особенно значим. Притом большинство байткодов и вообще машинных языков имеют двоичный формат, не читаемый людьми. Однако мы можем создать на уровне asm.js более человеко-читаемый синтаксис, который будет и удобным в дизассемблировании, и пригодным для чтения и записи людьми.

То обстоятельство, что asm.js — это JavaScript, не обернётся ли непредсказуемым выполнением кода?


Предварительная (ahead-of-time, AOT) компиляция asm.js может генерировать код, выполнение которого весьма предсказуемо, потому что валидный код asm.js ограничен крайне небольшим подмножеством JavaScript, состоящим только из строго типизированных целых чисел, чисел с плавающей точкою, арифметических операций, вызовов функций и обращения к куче.

Почему бы тогда не NaCl или PNaCl вместо этого? Вы просто упорствуете насчёт JavaScript?


Принципиальным достоинством asm.js по сравнению с новыми технологиями вроде NaCl и PNaCl является то, что asm.js работает сегодня: существующие движки JavaScript ужé неплохо оптимизируют код, написанный в таком стиле. Что означает, что разработчики могут выпускать код на asm.js сегодня, а со временем его работа будет ускоряться. Другою важною пользою является заметно бóльшая простота реализации, для которой потребуется совсем немного дополнительных механизмов поверх существующих движков JavaScript — и не понадобится слой совместимости API.

Почему бы тогда вместо этого не продолжать оптимизацию JIT-компиляторов JavaScript?


А и нет нужды останавливать её! Однако поведение JIT-компиляторов менее предсказуемо, будучи основано на сложных эвристиках. Модель asm.js более подобна модели Си или Си++, избавляя язык от динамической типизации, от обёрнутых значений, от сборки мусора.

Разве не неэффективно — прогонять код через интерпретатор JavaScript, а затем через компилятор?


Пролог-директива позволяет движку JavaScript немедленно распознать код asm.js на этапе компиляции и немедленно переводить его на язык ассемблера. Такой код вообще не попадает в интерпретатор.

Какая обратная связь предусматривается для разработчиков на тот случай, если их код не проходит валидацию?


Пролог-директива указывает на намерение разработчика считать последующий код валидным asm.js. Если код не проходит валидацию, то об ошибке движок может сообщить разработчику, например, в отладочной консоли, или другими средствами.

Как разработчики могут отлаживать код asm.js?


В целом эта проблема ещё не решена по отношению к языкам, компилируемым для WWW. Карты исходного кода (source maps) могут помочь делу, но браузерам предстоит ещё много работы по улучшению процессов отладки компилированного кода.

Может ли asm.js служить виртуальною машиною для управляемых языков, наподобие JVM или CLR?


В настоящее время код asm.js не имеет прямого доступа к данным, подвергаемым сборке мусора: программа на asm.js может обращаться ко внешним данным лишь косвенно, по числовым идентификаторам их. В будущих версиях мы намерены внедрить сборку мусора и структурированные данные на основе API структурированных двоичных данных ES6, что повысит привлекательность asm.js в качестве средства выполнения управляемых языков.

Совместим ли asm.js с вызовами eval и Function? Можно ли динамически запускать компилятор asm.js?


Безусловно! Компиляция модуля asm.js происходит во время обработки его исходного кода. Если вы запустите эту обработку, вызвав eval или Function, то полýчите динамическую компиляцию.

Сколь велики издержки, вызываемые временем компиляции asm.js?


Валидация и компиляция происходят довольно быстро, но всё же это приводит к некоторым издержкам, хотя и только по отношению к коду asm.js: если код JavaScript не содержит пролога-директивы asm.js, то не подвергается никакой дополнительной обработке. Если вы желаете избегнуть задержки, связанной с немедленной валидацией и компиляцией кода asm.js, то можете позже использовать eval или Function и отложить компиляцию до того времени.

Может ли asm.js благотворно повлиять на время запуска приложений?


Мы планируем предложить дополнительные API, которые обеспечат веборазработчикам возможность компиляции asm.js в фоне, а также сохранение результатов компиляции в оффлайновое хранилище, что ускорит последующие начальные запуски приложения.
Tags:
Hubs:
+6
Comments 21
Comments Comments 21

Articles