Emscripten и ASM.js
Nov. 14th, 2014 11:00 pmНу что ж, друзья мои, по крайней мере в Firefox'e для числодробилок в браузере нет языка лучше, чем С++. Но только там, правда.
Задействовал сегодня Emscripten :: С++ -{clang/LLVM}-> ASM.js.
Чтобы его поставить уж было расчехлил свой линукс, но оказалось, что проще всего его поставить как раз в винде: установка в один клик, и все сразу работает из коробки. Использовать С++ код из JS оказалось весьма просто, когда разберешься что к чему. Ключевой момент: ASM.js работает в пределах одного единственного массива фиксированной длины. Просто так передать ему пару других массивов из JS не выйдет, нужно выделять для них память в этой вот куче ASM.js, копировать туда, потом оттудова читать результат. В Firefox'e компиляцией ASM.js кода занимается отдельный специализированный ahead of time конпелятор, в то время как остальные браузеры относятся к нему как к обычному JS.
В итоге на тесте с декодированием картинки на моем ноуте текущая ситуация такая (время декодирования в миллисекундах и размер кода):
Погонять ASM.js. Все тесты.
Успел даже на малюсеньком тесте столкнуться с разницей браузеров в исполнении/неисполнении JS: что работало в Хроме, падало в Firefox'e: он видите ли не дает responseType у XHR устанавливать до вызова open(). А сгенеренный Haxe'ом код не взлетел в IE: не могу, говорит, скастить HTMLInputElement в HTMLInputElement (хвала динамической типизации, где сравнение типов может делать что угодно кроме того, что надо!).
Итого, если ориентироваться на Firefox, то рулит С++ и ASM.js, в Хроме рулит чистый JS (который фактически и получается из Haxe), а если нужно, чтобы был компактный код, который стабильно и шустро работает везде, то по-прежнему рулит Flash. Ну а если еще про айфоны всякие вспомнить, то... проще плюнуть и никогда больше к этому проклятому болоту, фронтэнду, не приближаться.
Задействовал сегодня Emscripten :: С++ -{clang/LLVM}-> ASM.js.
Чтобы его поставить уж было расчехлил свой линукс, но оказалось, что проще всего его поставить как раз в винде: установка в один клик, и все сразу работает из коробки. Использовать С++ код из JS оказалось весьма просто, когда разберешься что к чему. Ключевой момент: ASM.js работает в пределах одного единственного массива фиксированной длины. Просто так передать ему пару других массивов из JS не выйдет, нужно выделять для них память в этой вот куче ASM.js, копировать туда, потом оттудова читать результат. В Firefox'e компиляцией ASM.js кода занимается отдельный специализированный ahead of time конпелятор, в то время как остальные браузеры относятся к нему как к обычному JS.
В итоге на тесте с декодированием картинки на моем ноуте текущая ситуация такая (время декодирования в миллисекундах и размер кода):
Chrome 38: Firefox 33: IE 11: Size: Flash 57 58 58 6 KB Dart to JS 60 70 95 135 KB C++ to ASM.js 54 43 149 212 KB Haxe to JS 52 49 fail 12 KB
Погонять ASM.js. Все тесты.
Успел даже на малюсеньком тесте столкнуться с разницей браузеров в исполнении/неисполнении JS: что работало в Хроме, падало в Firefox'e: он видите ли не дает responseType у XHR устанавливать до вызова open(). А сгенеренный Haxe'ом код не взлетел в IE: не могу, говорит, скастить HTMLInputElement в HTMLInputElement (хвала динамической типизации, где сравнение типов может делать что угодно кроме того, что надо!).
Итого, если ориентироваться на Firefox, то рулит С++ и ASM.js, в Хроме рулит чистый JS (который фактически и получается из Haxe), а если нужно, чтобы был компактный код, который стабильно и шустро работает везде, то по-прежнему рулит Flash. Ну а если еще про айфоны всякие вспомнить, то... проще плюнуть и никогда больше к этому проклятому болоту, фронтэнду, не приближаться.