
Около двенадцати часов назад Джон Резиг
нащебетал в Твиттер, что на конференции
Google I/O было объявлено об улучшении
поддержки Asm.js в движке V8 и во браузере Google Chrome.
Так как про Asm.js упоминали
на Хабрахабре (1, 2), то достоинства его могли стать известны многим читателям. Тем приятнее им предвкушать теперь в самом скором времени появление этих достоинств не только во браузере Firefox (где они впервые были внедрены Фондом Мозиллы), но и в движке V8 (а значит — и в построенном на его основе
движке Node.js!), и во браузере Google Chrome.
Но для тех читателей, которые до сих пор пропускали эту новинку мимо себя, я также вкратце напомню суть.
Asm.js — это особое подмножество языка JavaScript: ограничившись им в своём скрипте, автор скрипта обеспечивает возможность оптимизации интерпретируемого кода не только в момент исполнения
(just-in-time, JIT), но даже и заблаговременно
(ahead-of-time, AOT), то есть такому джаваскрипту становится возможно один раз однозначно заранее поставить в соответствие некоторый машинный код. Эффект этот достигается ценою заметных усилий по самоограничению. (В частности, при помощи
операции «|0» и других подобных специальных приёмов тип значения каждого входного параментра функции, равно как и выходного значения, оказывается однозначно заданным и неизменным.) Зато его итогом становится небывалый рост скорости исполнения джаваскрипта — теперь по скорости он уступает скомпилированной программе (на Си
или Си++) не более чем в два раза.
Основное направление практического применения Asm.js лежит даже не в области ручного программирования (при котором сознательное соблюдение ограничений Asm.js может оказаться неприемлемо тягостным для программиста), а в области полностью автоматической транскомпиляции (перевода на язык JavaScript с других языков программирования) целого ряда достаточно сложных программ и библиотек, которые становятся благодаря этому не менее кросс-платформенными, чем сам JavaScript. В качестве средства такой транскомпиляции наиболее известен
Emscripten, а отчасти также
и Mandreel.
Мы стоим на пороге такого будущего, в котором очень многие программы из числа работающих с командною строкою (не требующих GUI) можно будет немедленно сделать кросс-платформенными
(Node.js обеспечит их исполнение на Windows, Mac OS X и Linux), для чего достаточно будет скомпилировать их в JavaScript (при помощи LLVM и затем Emscripten) вместо машинного кода — и вдвое пожертвовать скоростью исполнения их.
Впрочем,
впечатляющие примеры на странице Emscripten наглядно показывают, что переносу поддаются и некоторые такие графические приложения, которые способны работать
через EGL вместо конкретного графического API (OpenGL, или OpenGL ES, или OpenVG). Правда, таким приложениям Node.js не будет достаточно — потребуется перенос их в Паутину, то есть исполнение приложений во браузерах. Firefox и присоединившийся к нему в поддержке Asm.js браузер Google Chrome станут исполнять их с вышеозначенною небывалою быстротою. Но нетрудно предвидеть, что и все остальные браузеры (IE, Opera, Safari и так далее) также смогут исполнять их невозбранно (потому что
Asm.js — это подмножество обыкновенного JavaScript); единственная разница будет в скорости исполнения.