Разработчики проекта Mozilla объявили об интеграции в ночные сборки Firefox оптимизирующего модуля OdinMonkey c реализацией поддержки Asm.js — низкоуровневого подмножества языка JavaScript, позволяющего существенно увеличить производительность приложений, автоматически преобразованных в JavaScript с языков C/C++ при помощи таких инструментов, как Emscripten и Mandreel. Ожидается, что поддержка Asm.js будет включена в выпуск Firefox 22, запланированный на 26 июня.
Из отличительных черт Asm.js можно отметить поддержку строгой типизации, при которой переменные на протяжении своего жизненного цикла имеют заранее известный и не изменяемый тип. Наличие информации о типах позволяет использовать не только JIT, но и предварительную AOT-компиляцию, выполняемую для всего кода до начала его выполнения и генерирующую более простой и эффективный машинный код. При этом, в отличие от JIT-компиляции, Asm.js обеспечивает предсказуемую производительность и не зависит от сборщика мусора. В итоге, код с известной информацией о типах выполняется всего в два раза медленнее нативного приложения, написанного на C/C++. В то время как без Asm.js скомпилированное с использованием Emscripten приложение выполняется медленнее в 5 раз.
Достоинством Asm.js также является то, что он отлично интегрируется с существующими JavaScript-движками, не требуя подключения новой виртуальной машины или JIT-компилятора — достаточно внести небольшие оптимизацию в текущий движок JavaScript. В частности, для SpiderMonkey подготовлен оптимизирующий модуль OdinMonkey, реализующий дополнительные техники оптимизации для Asm.js.
Подмножество JavaScript, предлагаемое в Asm.js, полностью совместимо с обычным JavaScript и может выполняться в любых браузерах, так как вся дополнительная информация определяется в форме аннотаций (например, «x = x|0; // x : int»). Совместимость полностью сохраняется — если браузер не поддерживает Asm.js, то код выполняется как обычный JavaScript, а если поддерживает — включается дополнительный оптимизирующий модуль, учитывающий добавленные в код аннотации.
Поддержка Asm.js уже обеспечена в Emscripten и активируется при сборке с установкой флага «ASM_JS=1». Пока код Asm.js нацелен на автоматическую генерацию, но в будущем, планируется обеспечить поддержку генерации Asm.js-кода на основе исходных текстов, написанных на более удобных для разработчиков низкоуровневых диалектах JavaScript, таких как LLJS (Low-Level JavaScript), что позволит использовать Asm.js не только для кода, транслируемого с C/C++, но и для проектов, изначально развиваемых на JavaScript.