- PVSM.RU - https://www.pvsm.ru -

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Автор: Mithgol

Источник [12]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/javascript/28586

Ссылки в тексте:

[1] clang: http://clang.llvm.org/

[2] первой реализацией: https://bugzilla.mozilla.org/show_bug.cgi?id=840282

[3] план разработки: https://wiki.mozilla.org/Javascript%3aSpiderMonkey%3aOdinMonkey

[4] Emscripten: http://emscripten.org

[5] Mandreel: http://mandreel.com

[6] NaCl: https://developers.google.com/native-client/

[7] PNaCl: http://www.chromium.org/nativeclient/pnacl/building-and-testing-portable-native-client

[8] Пролог-директива: http://asmjs.org/spec/latest/#introduction

[9] source maps: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit

[10] API структурированных двоичных данных ES6: http://wiki.ecmascript.org/doku.php?id=harmony:binary_data

[11] модуля: http://asmjs.org/spec/latest/#modules

[12] Источник: http://habrahabr.ru/post/171561/