Cheerp 3.0, компилятор C/C++ в JavaScript, переведён на лицензии Apache 2.0 и LLVM

Kate

Administrator
Команда форума
Представлен компилятор Cheerp 3.0, позволяющий скомпилировать любой код C/C++ в WebAssembly или JavaScript. Новая ветка примечательна переводом компилятора и сопутствующих библиотек на использование пермиссивных лицензий Apache 2.0 и LLVM, вместо ранее применяемой ограниченной лицензионной политики, предлагающей вариант с лицензией GPLv2 для некоммерческих проектов и проприетарную лицензию для коммерческих. Код компилятора основан на наработках LLVM и Clang, и включает дополнительные оптимизации для повышения производительности и уменьшения размера скомпилированного результата.

Cheerp может применяться как для портирования существующих C/C++ библиотек и приложений для выполнения в браузере, так и для создания высокопроизводительных web-приложений и WebAssembly-компонентов с нуля. Проект позволяет комбинировать в одном web-приложении код на C/C++ и JavaScript с возможностью доступа из кода JavaScript к функциям, изначально разработанным на C/C++, а из кода C/C++ к объектам JavaScript, JavaScript-библиотекам, Web API и всем возможностям DOM. Допускается создание комбинированных сборок, часть кода в которых компилируется в JavaScript, а часть в WebAssembly. Поддерживается сборка проектов, использующих стандартные библиотеки libc и libc++.

По сравнению с компилятором Emscripten, Cheerp генерирует более оптимизированный и компактный промежуточный код WebAssembly (в среднем размер итоговых файлов на 7% меньше). Концептуально различия сводятся к тому, что Emscripten используется в качестве объектного формата WebAssembly и выполняет связывание и оптимизацию на стадии постобработки WebAssembly (wasm-opt). В Cheerp в качестве промежуточного представления для библиотек и объектных файлов используется байткод в формате LLVM, что позволяет применять более широкие оптимизации, охватывающие проект в целом и использующие метаданные на уровне LLVM, без необходимости выполнения постобработки.

Дополнительное в Cheerp применяются оптимизатор PreExecuter, обеспечивающий упреждающее выполнение кода на этапе компиляции, например, для преобразования в константы конструкторов, используемых для инициализации глобальных объектов. Также при компиляции используется PartialExecuter, который на основе анализа параметров функций удаляет код, который гарантированно не используется при выполнении.

Cheerp также может генерировать код 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++ и построчного пошагового выполнения С++ кода).

 
Сверху