Лучший в своем классе компилятор C / C ++ для WebAssembly / JavaScript

Сегодня мы с гордостью объявляем о выпуске Cheerp 2.0, кульминации 4-х летних улучшений и оптимизаций и нашего самого большого выпуска со времен Cheerp 1.0 в 2014 году.

Cheerp - это коммерческий компилятор C / C ++ с открытым исходным кодом для веб-приложений HTML5, способный компилировать C / C ++ в WebAssembly, JavaScript или их комбинацию.

Cheerp - это наиболее продвинутое и гибкое решение для переноса кода C ++ в Интернет. Он основан на стандартном стеке Clang / LLVM и обеспечивает надежный рабочий процесс с разумными значениями по умолчанию, четкими сообщениями об ошибках и параметрами командной строки, подобными gcc, которые позволяют легко интегрировать в IDE и среды непрерывной интеграции. Cheerp работает в Windows, macOS и Linux, что позволяет разработчикам на C ++ без проблем создавать веб-приложения в выбранной ими системе.

Cheerp 2.0 генерирует код WebAssembly, который в среднем на 20% меньше по занимаемой площади, а также быстрее или быстрее (в среднем на 7% быстрее), чем код, созданный Emscripten, основной альтернативой C ++ компилятору WebAssembly. Кроме того, он также может генерировать смешанные выходные данные JavaScript-WebAssembly, обходя ограничения WebAssembly (например, прямой доступ к DOM и WebGL / WebAudio), не жертвуя собственной скоростью.

Cheerp - наиболее гибкое и эффективное решение для запуска кода C / C ++ в Интернете. Cheerp - это инструмент, прошедший боевые испытания на миллионах строк кода, используемый во многих коммерческих продуктах и поддерживаемый Leaning Technologies, компанией с многолетним опытом разработки решений для компиляции в JavaScript и WebAssembly. выбор для преобразования C / C ++ в веб-приложения.

Новые возможности Cheerp 2.0

Cheerp 2.0 представляет поддержку WebAssembly в дополнение к целевому объекту JavaScript со сборкой мусора, который всегда был частью Cheerp. Кроме того, Cheerp 2.0 также представляет новый смешанный режим, который позволяет компилировать C / C ++ в JavaScript, WebAssembly или их комбинацию из единой базы кода.

В центре внимания Cheerp 1.0 была компиляция C / C ++ для объектно-ориентированного целевого объекта JavaScript с возможностью сбора мусора, способного полностью прозрачно взаимодействовать с API-интерфейсами DOM и HTML5 без дополнительных затрат.

Cheerp 2.0 позволяет использовать производительность WebAssembly, аналогичную нативной, сохраняя при этом гибкость и мощь объектно-ориентированной компиляции в обычный JavaScript. Благодаря новому диапазону тегов атрибутов (таких как [[cheerp::genericjs]] и [[cheerp::wasm]]) новый смешанный режим Cheerp 2.0 позволяет помечать определенные классы и функции, которые будут скомпилированы для указанной цели, что позволяет сочетать WebAssembly и JavaScript. режимы. Теги не требуются вообще, если кодовая база полностью скомпилирована для WebAssembly или JavaScript.

Cheerp 2.0 также представляет новый набор улучшенных шагов оптимизации, направленных как на повышение производительности во время выполнения, так и на уменьшение размера вывода. В этом отношении одним из наиболее значительных изменений является внедрение алгоритма CFGStackifier. В результате Cheerp 2.0 генерирует код WebAssembly, который, по крайней мере, так же быстр, но обычно быстрее, чем Emscripten, и обычно занимает меньше места.

CFGStackifier - более структурированная реконструкция потока управления

CFGStackifier - это алгоритм для восстановления структурированного потока управления JavaScript / WebAssembly из оптимизированного графа потока управления LLVM. Базовая версия этого алгоритма реализуется восходящим потоком LLVM.

Мы расширили CFGStackifier и адаптировали его для работы как с целевыми объектами WebAssembly, так и с JavaScript. CFGStackifier заменяет устаревший алгоритм Relooper, первоначально представленный проектом Emscripten.

В значительной степени Relooper - это алгоритм проверки концепции, который всегда может вычислить рабочее решение, но не обязательно оптимальное из-за ненужных ограничений, накладываемых на структуру выходного потока. Он достаточно хорошо работает во многих распространенных случаях, но за годы мы обнаружили значительную неэффективность в скомпилированном потоке управления для сложных коммерческих кодовых баз (таких как видеоигры и программное обеспечение САПР), на которых используется Cheerp.

CFGStackifier - это принципиальное современное решение проблемы реконструкции потока управления, которое обеспечивает значительное уменьшение размера вывода (как для целей WebAssembly, так и для целей JavaScript). Более того, мы заметили повышение производительности до 5–8% в очень сложных приложениях, таких как движки трассировки лучей.

CFGStackifier содержит много интересных технических деталей, и в будущем мы планируем опубликовать один (или, может быть, два) сообщения в блоге об этом. Этот новый алгоритм является стабильным и включен по умолчанию в Cheerp 2.0, но мы также позволяем пользователям выбирать старое решение на основе Relooper с помощью параметра командной строки -cheerp-cfg-legacy.

Управление DOM и доступ к WebAPI из WebAssembly - смешанный режим Cheerp

Cheerp 2.0 может компилировать C ++ в комбинацию кода WebAssembly и JavaScript, что позволяет использовать преимущества WebAssembly (скорость и размер, аналогичные нативным) и JavaScript (манипуляции с DOM и доступ к WebAPI) на одной и той же кодовой базе.

Переключатель командной строки -cheerp-mode выбирает основной режим вывода компиляции между JavaScript и WebAssembly. Кроме того, отдельные классы и функции могут быть помечены с помощью настраиваемых атрибутов Cheerp - [[cheerp::wasm]] и [[cheerp::genericjs]] - для определения того, как они будут скомпилированы. В качестве примера посмотрите этот фрагмент кода, который можно скомпилировать в WebAssembly:

Это очень полезно в (общем) случае, когда вы хотите скомпилировать тело кода C ++ в быстрый код WebAssembly, но при этом необходимо взаимодействовать с ним из JavaScript. Используя возможности взаимодействия Cheerp и детализированную маркировку атрибутов, это можно сделать без написания какого-либо «связующего» кода.

Любой метод с тегом [[cheerp::genericjs]] предоставит полный доступ к API-интерфейсам браузера (например, DOM, WebGL и т. Д.), А также к любым сторонним библиотекам JavaScript. В то же время и без ручного вмешательства вы можете размещать и использовать объекты из WebAssembly, не беспокоясь об интерфейсах - Cheerp сгенерирует все это автоматически.

Что можно делать с Cheerp

Cheerp - мощный, гибкий и надежный инструмент, который можно использовать несколькими способами:

Преобразование существующего приложения C ++ в веб-приложения: Cheerp может перекомпилировать любое крупномасштабное приложение C ++ в веб-приложение HTML5, что позволяет предоставить вашим пользователям современный интегрированный облачный интерфейс с минимальным вмешательством в основной бизнес. логика.

Компилируя код C ++, нет необходимости переписывать приложение с нуля на JavaScript, что экономит ваше время, ресурсы и головные боли, связанные с параллельным сопровождением двух баз кода.

Компилируйте игры на C ++ в HTML5: Cheerp позволяет быстро перенести игру на C ++ в Интернет без необходимости переписывать код. Современные веб-браузеры - это мощные игровые платформы, включая трехмерную графику (через WebGL), программируемый звуковой конвейер (через WebAudio) и датчики движения (акселерометры и GPS). Вы можете использовать Cheerp, чтобы конвертировать полные игры или предлагать игровой трейлер или демонстрацию, которые можно запустить одним щелчком мыши.

Преобразование библиотек C ++ и их интеграция в приложения HTML5: как правило, если у вас есть проблема, существует библиотека C / C ++ (с открытым исходным кодом или проприетарная), которая решит ее.

С Cheerp вы можете скомпилировать любую библиотеку и предоставить веб-API, который можно использовать непосредственно из кода JavaScript в вашем веб-приложении. Рабочий пример библиотеки C ++, скомпилированной с помощью Cheerp, см. В нашем предыдущем посте.

Дополнения Cheerp (коммерческие пользователи)

В рамках нашего предложения для коммерческих пользователей мы предоставляем несколько проприетарных дополнительных библиотек, предназначенных для упрощения переноса и отладки сложных приложений с помощью Cheerp.

В настоящее время доступны следующие основные дополнения для Cheerp:

  • Профилировщик памяти Cheerp: этот инструмент обеспечивает учет использования памяти в реальном времени, включая API-интерфейсы самоанализа, предназначенные для помощи в выявлении утечек памяти. Он интегрирован с размещенным сценарием JavaScript, который должен быть добавлен на HTML-страницу приложения для отслеживания потребления памяти (и особенно утечек) в режиме реального времени. Полная документация по профилировщику памяти Cheerp доступна здесь .
  • libposixcompat: обеспечивает дополнительную совместимость с функциями POSIX, такими как файловая система и API синхронизации. Подробнее см. Здесь.
  • libemscompat: обеспечивает частичную совместимость с API-интерфейсами Emscripten, чтобы упростить перенос проектов на Cheerp.

Тесты производительности

Подробные тесты производительности будут представлены в специальном сообщении в блоге. Сводная информация о производительности и размере вывода, ориентированная на WebAssembly, представлена ​​в этом посте.

Производительность оценивалась в Google Chrome (автономная версия 8 - git revision) и Mozilla Firefox (автономная версия SpiderMonkey - hg revision). Производительность сравнивали с Emscripten (git revision).

Производительность во время выполнения - Firefox

В движке Firefox SpiderMonkey вывод Cheerp 2.0 WebAssembly в среднем на 36% медленнее, чем собственный, в диапазоне от 1,13-кратной собственной скорости до 2,45-кратной собственной скорости в зависимости от конкретного теста.

В среднем код WebAssembly, сгенерированный Cheerp 2.0, на 9% быстрее, чем код, созданный Emscripten (в лучшем случае: Cheerp на 29% быстрее, в худшем случае: с той же скоростью).

Производительность во время выполнения - Chrome

На движке Chrome v8 вывод Cheerp 2.0 WebAssembly в среднем на 80% медленнее, чем нативный, поэтому Chrome в целом кажется медленнее и гораздо более вариативным при выполнении кода WebAssembly по сравнению с Firefox.

В среднем код WebAssembly, сгенерированный Cheerp 2.0, на 5% быстрее, чем код, созданный Emscripten (в лучшем случае: Cheerp на 11% быстрее, в худшем случае: Emscripten на 2% быстрее).

Размер сборки

При сравнении размера сборки использовался совокупный размер файла JavaScript загрузчика и файла WebAssembly.

Результат Cheerp 2.0 в среднем на 20% меньше по сравнению с Emscripten (в лучшем случае: Cheerp на 44% меньше, в худшем случае: Emscripten на 2% меньше).

Начало работы с Cheerp 2.0

Cheerp 2.0 доступен для Windows, macOS и Linux с сайта https://leaningtech.com/cheerp/download/.

Чтобы начать работу с Cheerp, посетите главную страницу документации. Вы найдете инструкции по загрузке, установке и использованию Cheerp, а также пошаговые инструкции.

Резюме

Cheerp 2.0 - это самая мощная версия Cheerp на сегодняшний день и кульминация четырехлетней работы с Cheerp 1.0 в 2014 году. В этом новом основном выпуске представлена ​​поддержка WebAssembly, а также выборочная компиляция в смешанный режим JavaScript-WebAssembly, что позволяет использовать преимущества WebAssembly (скорость и размер) и JavaScript (доступ к DOM и WebAPI, сборка мусора) на одной и той же кодовой базе.

Cheerp 2.0 создает код WebAssembly, который быстрее и меньше по размеру, чем Emscripten, при этом сохраняя большую гибкость в доступе к DOM, WebAPI и библиотекам. Cheerp - это активно развивающийся проект, поддерживаемый Leaning Technologies, компанией с многолетним опытом разработки решений для компиляции в JavaScript и WebAssembly, а также сильной технической командой, которая может предоставить поддержку и профессиональные услуги в случае необходимости.

Проверенная на миллионах строк кода, выбранных многими коммерческими продуктами, Cheerp - лучшая технология, позволяющая преобразовывать сложные крупномасштабные приложения в веб-приложения.

Для получения дополнительной информации о том, как Cheerp может помочь вашей организации использовать существующий код C ++ для разработки веб-приложений HTML5, которые работают на любом устройстве, не требуя дополнительных модулей или загрузки, посетите наш веб-сайт по адресу https: // leaningtech. com / cheerp / .

Следите за нами в twitter и на нашем сайте https://leaningtech.com. Для получения дополнительной технической информации о Cheerp посетите нашу вики или технический блог.