Похоже, Mozilla намеревается заставить Firefox запускать JavaScript со скоростью, близкой к нативной. Последние новости заключаются в том, что OdinMonkey в настоящее время находится в Firefox Aurora и приближается к финальной версии Firefox 22. Чтобы показать, насколько он хорош, игровой движок Unreal 3 был продемонстрирован на GDC.
Большинство людей согласятся, что браузер — это новый рабочий стол. Программы, которые раньше работали под Windows или Linux, теперь нацелены на браузер. Что, похоже, не согласовано, так это то, как обеспечить производительность, необходимую таким приложениям. Microsoft, похоже, думает, что все, что ей нужно сделать, это оптимизировать движок JavaScript и что такие приложения, вероятно, должны работать под Windows. Google считает, что решение состоит в том, чтобы разрешить запускать нативные приложения в браузере с использованием NaCL.
Mozilla, с другой стороны, имеет очень умный и тонкий подход к проблеме. Asm.js — это подмножество стандартного JavaScript, которое допускает статическую типизацию и которое можно оптимизировать гораздо больше, чем обычный JavaScript. OdinMonkey — это движок JavaScript, который очень быстро запускает код Asm.js — как утверждается, хуже в два раза — из нативного кода.
С OdinMonkey на борту Firefox может быстро запускать любой код Asm.js. Любой браузер, в котором нет OdinMonkey или аналогичного оптимизированного движка, может просто запустить код с обычной скоростью JavaScript. Следовательно, этот подход на 100% совместим и не требует модификаций, таких как NaCL.
Вы можете писать свои программы на Asm.js, но идея состоит в том, что вы будете использовать другие языки, которые компилируются в Asm.js. Это открывает возможность преобразования существующих настольных приложений для запуска в браузере. Например, Emscripten — это компилятор, который преобразует промежуточный язык битового кода LLVM либо в JavaScript, либо в подмножество asm.js. Существует ряд компиляторов, нацеленных на LLVM, например, llvm-gcc или clang. Итак, если у вас есть программа на C / C ++, все, что вам нужно сделать, это скомпилировать ее в LLVM, а затем использовать Emscripten для преобразования в Asm.js.
Конечно, все не так просто, поскольку код необходимо изменить, чтобы изменить способ использования ресурсов и фреймворков, например рисовать на холсте, а не на растровом изображении.
Чтобы доказать, что это возможно, игры Mozilla и Epic портировали игровой движок Unreal 3 всего за 4 дня. Учитывая, что Unreal 3 имеет более 1 миллиона строк кода, мы должны предположить, что большая часть его осталась неизменной. Код работает со скоростью, близкой к «родной», и, как говорят, дает «родное» ощущение игры, запущенной в браузере.
Mozilla предполагает, что это указывает путь к портированию и реализации игр с нуля, но есть некоторые проблемы. В частности, есть время для загрузки обширных ресурсов, необходимых для реалистичной трехмерной игры — текстур, звуков, карт, моделей и так далее.
Есть несколько интересных вещей, которые следует учитывать в отношении того, где мы находимся. Google продвигается вперед с NaCL и расширенной версией PNaCL, в которой также используется промежуточный язык LLVM, позволяющий запускать код в браузере на собственных скоростях. Единственная разница между этим подходом и подходом Mozilla заключается в том, что в случае Google LLVM компилируется JIT в машинный код, а не в asm.js.
И Chrome, и Firefox поддерживают достаточно современную инфраструктуру HTML5, чтобы быть достаточно совместимыми, чтобы можно было ожидать, что программа LLVM может работать под обоими после подходящей компиляции.
Возможно, именно LLVM — это язык, который станет общей целью для высокопроизводительных веб-приложений.
Это, конечно, оставляет IE в стороне, но поскольку он не поддерживает OpenGL, он не имеет трехмерной графики и поэтому выглядит все более бессмысленным в качестве платформы для такого рода веб-приложений. Ходят слухи, что IE11 может поддерживать OpenGL, но они не подтвердились.
Mozilla обещает, что вы сможете изучить код Unreal 3 и запустить демонстрацию. Подробности можно найти на hacks.mozilla.org, но в настоящее время нет ничего доступного.