Mozilla очень серьезно относится к идее использования JavaScript в качестве современного языка ассемблера для кода браузера. Asm.js — это спецификация высокопроизводительного языка ассемблера JavaScript, а OdinMonkey — это движок, который запускает его очень быстро.
Компилятору не обязательно ориентироваться на машинный код низкого уровня. Например, компилятор Java создает байтовый код, который затем запускается с помощью виртуальной машины. JavaScript настолько распространен, что имеет смысл использовать его в качестве цели для компиляторов других языков, чтобы с их помощью можно было писать веб-приложения. Самый известный пример — это, вероятно, CoffeeScript, который компилируется в стандартный JavaScript. Однако CoffeeScript уже довольно близок к JavaScript, и компиляция — довольно простая задача.
Сложнее скомпилировать C ++ в JavaScript, что и делают компиляторы, такие как Emscripten или Mandreel. В настоящий момент эти компиляторы пытаются преобразовать C ++ в JavaScript, чтобы результат работал достаточно быстро. Гораздо лучшая идея — определить подмножество JavaScript, которое является полным в том смысле, что вы можете делать все, что вам нужно, используя его, но такое, которое можно реализовать эффективно.
В этом вся суть asm.js. Это подробная спецификация подмножества JavaScript. Обратите внимание: хотя это означает, что это не новый язык, есть новые функции, которые будут игнорироваться стандартным движком JavaScript. Например, в языке есть только строго типизированные целые числа, числа с плавающей запятой, арифметика, вызовы функций и доступ к куче. Это достигается с помощью аннотаций в форме комментариев и ограниченного набора операций, которые работают только с типом данных — например, логические операторы преобразуют числовые значения в int32.
Тот факт, что asm.js является подмножеством JavaScript, означает, что вы можете взять программу asm.js и запустить ее в стандартном немодифицированном браузере или движке JavaScript. Однако, чтобы получить реальную пользу от его использования, вам нужно, чтобы он запускался с использованием оптимизирующего движка JavaScript. Это вторая половина проекта. Mozilla работает над OdinMonkey, движком JavaScript, который распознает, когда в него загружена программа asm.js, и может применять автоматические оптимизации.
Целью OdinMonkey является запуск скомпилированного кода C ++ из Emscripten не хуже, чем вдвое меньшей скорости. Текущие тесты, кажется, доказывают, что это возможно. Вы также можете попробовать его, скомпилировав с помощью emscripten с переключателем ASM_JS = 1, а затем запустив его с помощью специальной сборки Firefox.
Нажмите, чтобы увеличить версию
Итак, объединяем идеи: компилируйте компиляторы из C ++ и других языков в asm.js и используйте оптимизированные движки JavaScript для запуска кода с почти нативной скоростью. Если в браузере нет оптимизированного движка, код все равно будет работать, потому что это просто JavaScript.
Еще неизвестно, воспользуются ли другие движки JavaScript asm.js. Альтернативой, конечно же, являются NaCL и PNaCL от Google, но, опять же, только один производитель браузеров поддерживает их. Придется подождать, пока они будут бороться.