Представлен компилятор Cheerp 3.0, позволяющий скомпилировать любой код C/C++ в WebAssembly или JavaScript. Новая ветка примечательна переводом компилятора и сопутствующих библиотек на использование пермиссивных лицензий Apache 2.0 и LLVM, вместо ранее применяемой ограниченной лицензионной политики, предлагающей вариант с лицензией GPLv2 для некоммерческих проектов и проприетарную лицензию для коммерческих. Код компилятора основан на наработках LLVM и Clang, и включает дополнительные оптимизации для повышения производительности и уменьшения размера скомпилированного результата.
Cheerp может применяться как для портирования существующих библиотек и приложений для выполнения в браузере, так и для создания высокопроизводительных web-приложений и WebAssembly-компонентов с нуля. Проект позволяет комбинировать в одном web-приложении код на C/C++ и JavaScript с возможностью доступа из JavaScript кода к функциям, изначально разработанным на C/C++, а из кода C/C++ к объектам JavaScript, JavaScript-библиотекам, Web API и всем возможностям DOM. Допускается создание комбинированных сборок, часть кода в которых компилируется в JavaScript, а часть в WebAssembly. Поддерживается сборка проектов C++, использующих стандартные библиотеки libc и libc++.
По сравнению с компилятором Emscripten, Cheerp генерирует более оптимизированный и компактный промежуточный код WebAssembly (в среднем размер итоговых файлов на 7% меньше). Концептуально различия сводятся к тому, что Emscripten используется в качестве объектного формата WebAssembly и выполняет связывание и оптимизацию на стадии постобработки WebAssembly (wasm-opt). В Cheerp в качестве промежуточного представления для библиотек и объектных файлов используется байткод в формате LLVM, что позволяет применять более широкие оптимизации, охватывающие проект в целом и использующие метаданные на уровне LLVM, без необходимости выполнения постобработки.
Cheer также может генерировать код JavaScript с поддержкой динамического распределения памяти, обрабатывамого сборщиком мусора.
В частности, вместо эмулирования традиционного адресного пространства при помощи типизированных массивов, Cheerp обеспечивает прямой маппинг объектов C++ в объекты JavaScript, что позволяет снизить потребление памяти, так как сборщик мусора JavaScript имеет возможность удалять неиспользуемые объекты. Для повышения производительности в генерируемом промежуточном коде WebAssembly могут использоваться SIMD-расширения, позволяющие организовать распараллеливание выполнения операций над данными.
Cheerp может использоваться как платформа для создания интегрированных клиент/серверных web-приложений на языке C++. В существующей практике, обычно применяется выполняемый в браузере фронтэнд, написанный на языке JavaScript, и раздельная серверная часть, написанная на языках PHP, Python, Ruby или JavaScript/Node.js. Cheerp предоставляет средства для создания целостных web-приложений на языке C++, в которых бэкенд и фронтэнд поддерживаются в единой кодовой базе. В процессе компиляции серверная часть компилируется в нативный код, а интерфейс преобразуется в JavaScript-представление. Отладка всех компонентов проекта, в том числе преобразуемых в JavaScript, осуществляется по исходным текстам на языке C++ с использованием технологии Source Map (при возникновении ошибки можно увидеть участок кода на C++, поддерживается установка точек останова в коде C++ и построчного пошагового выполнения С++ кода).