Представлен Cheerp 1.2, компилятор C++ в JavaScript

Увидел свет стабильный релиз Cheerp 1.2 (бывший Duetto), открытого инструментария для разработки клиентских и серверных web-приложений на языке C++, а также для портирования существующих C++ программ для работы в Web-браузере. Код распространяется под свободной лицензией UI/NCSA, также используемой в проекте LLVM. Библиотеки поставляются под лицензией GPLv2+.

По своей сути Cheerp напоминает систему Emscripten и также использует наработки LLVM для обеспечения компиляции кода C++ в представление на языке JavaScript. Ключевым отличием Cheerp от Emscripten является ориентация на достижении более высокой производительности результирующего JavaScript-кода и предоставление средств для использования из С++ программ всех возможностей DOM, браузерного API и HTML5, в том числе WebGL. Cheerp не пытается как Emscripten эмулировать традиционное адресное пространство при помощи типизированных массивов, а обеспечивает прямой маппинг C++ объектов в объекты JavaScript, что позволяет снизить потребление памяти, так как сборщик мусора JavaScript имеет возможность удалять неиспользуемые объекты. Cheerp также поддерживает использование стандартных библиотек libc и libc++, и позволяет применять инструменты сборки cmake/autotool.

По поставленным перед проектом задачам Cheerp позиционируется как платформа для создания интегрированных клиент/серверных web-приложений на языке C++. В существующей практике, обычно используется выполняемый в браузере фронтэнд, написанный на языке JavaScript или компилируемый в JavaScript из Coffe­Script, Microsoft Type­Script, Google Dart, Google GWT, с раздельной серверной частью на языках PHP, Python, Ruby или JavaScript/node.js. Cheerp предоставляет средства для создания целостных web-приложений на языке C++, в которых бэкенд и фронтэнд поддерживаются в единой кодовой базе. В процессе компиляции серверная часть компилируется в нативный код, а интерфейс преобразуется в JavaScript-представление. Отладка всех компонентов проекта, в том числе преобразуемых в JavaScript, осуществляется по исходным текстам на языке C++ с использованием технологии Source Map (при возникновении ошибки можно увидеть участок кода на C++, поддерживается установка точек останова в коде C++ и построчного пошагового выполнения С++ кода).

Новый выпуск основан на кодовой базе LLVM/Clang 3.7 и примечателен существенным сокращением времени загрузки и увеличением производительности выполнения результирующего JavaScript-кода. Итоговый JavaScript-код, генерируемый при помощи Cheerp с применением динамической системы управления памятью, всего в 2–6 раз медленнее скомпилированных из C++ машинных инструкций. По сравнению с Emscripten, JavaScript-код Cheerp заметно отстаёт при применении Asm.js в Emscripten, но в режиме Split Memory (без Asm.js, но позволяет выделять больше памяти) в 2–3 раза быстрее при исполнении средних и больших тестов и примерно на том же уровне при выполнении мелких тестов. По времени загрузки созданный в Cheerp код грузится в 10–11 раз быстрее, но так как разница в диапазоне миллисекунд, она не ощущается пользователем.

0_1454434714.png

0_1454434728.png

0_1454434699.png

Из изменений, связанных с функциональностью, отмечается поддержка 64-разрядных целых чисел, возможность накопления информации о типах в процессе выполнения (RTTI — Runtime Type Information), расширение диагностических сообщений и экспериментальная поддержка изоляции генерируемого кода от других скриптов через его вынос в модули. Отдельно выделяется реализация техники PreExecuter, позволяющей преобразовывать C++-код инициализации глобальных структур в простые наборы данных, что существенно сокращает размер JavaScript-кода на выходе.

© OpenNet