The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

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

17.03.2023 08:12

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

  1. Главная ссылка к новости (https://leaningtech.com/cheerp...)
  2. OpenNews: Релиз Cheerp 1.3, компилятора C++ в JavaScript
  3. OpenNews: Началось ограниченное бета-тестирование Duetto, компилятора из C++ в JavaScript
  4. OpenNews: Открыт код Duetto, системы для запуска в web-браузере проектов на языке C++
  5. OpenNews: Доступен предварительный вариант стандарта WebAssembly 2.0
  6. OpenNews: Доступен Emscripten 3.0, компилятор из C/C++ в WebAssembly
Лицензия: CC BY 3.0
Короткая ссылка: https://opennet.ru/58807-cheerp
Ключевые слова: cheerp, compile, webassembly, javascript
При перепечатке указание ссылки на opennet.ru обязательно


Обсуждение (62) Ajax | 1 уровень | Линейный | +/- | Раскрыть всё | RSS
  • 1.5, Аноним (5), 08:41, 17/03/2023 [ответить] [﹢﹢﹢] [ · · · ]  
  • –5 +/
    это скорей интерпритатор, чем компилятор.
     
     
  • 2.13, Аноним (13), 08:52, 17/03/2023 [^] [^^] [^^^] [ответить]  
  • +9 +/
    Это скорее компилятор, чем интерпритатор (орфография автора сохранена).
     
     
  • 3.32, Аноним (32), 11:00, 17/03/2023 [^] [^^] [^^^] [ответить]  
  • +2 +/
    Это скорее компилятор интерпретатора, чем интерпретатор.  
     
     
  • 4.82, Аноним (82), 00:56, 18/03/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Это медленнее
     
  • 2.93, Tron is Whistling (?), 10:26, 18/03/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Интертрепатор.
     

  • 1.9, ИмяХ (?), 08:48, 17/03/2023 [ответить] [﹢﹢﹢] [ · · · ]  
  • +3 +/
    А есть транслятор из ассемблера в пайтон?
     
     
  • 2.33, Аноним (32), 11:02, 17/03/2023 [^] [^^] [^^^] [ответить]  
  • +5 +/
    Конечно есть сначала ассемблерный код через Ida Pro перегоняешь в Си код. Потом через c2py перегоняешь в питон. Можно даже онлайн https://www.javainuse.com/c2py
     
     
  • 3.59, Аноним (59), 15:55, 17/03/2023 [^] [^^] [^^^] [ответить]  
  • +3 +/
    далее через CPython собираешь бинарник и цикл можно повторять, до тех пор пока не сойдётся
     
     
  • 4.74, YetAnotherOnanym (ok), 17:49, 17/03/2023 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Не факт, что сойдётся. В лучшем случае потребуется доопределение для сходимости, а в худшем - будет  расходиться. Может быть, даже экспоненциально.
     
  • 2.34, _kp (ok), 11:33, 17/03/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Есть. Эффективность поченного кода другой вопрос. Но есть.
     
     
  • 3.84, Аноним (-), 01:23, 18/03/2023 [^] [^^] [^^^] [ответить]  
  • +6 +/
    > Есть. Эффективность поченного кода другой вопрос. Но есть.

    Можно будет получить выразительность ассемблера и скорость питона. Суперкомбо :)

     
     
  • 4.98, _kp (ok), 11:43, 18/03/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Осторожне с такими шутками. А то я чуть не подавися, и кофе пролил.

     

  • 1.24, Шарп (ok), 09:32, 17/03/2023 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    Emscripten это не только компилятор в wasm, но и эмуляция окружения (сокеты через websocket, printf в консоль браузера) и набор портированных библиотек (pthread, sdl2, openal и т.д.).

    Как дела с этим у Cheerp? Выполнение абстрактного кода в вакууме не интересует.

     
     
  • 2.31, Аноним (13), 10:47, 17/03/2023 [^] [^^] [^^^] [ответить]  
  • +2 +/
    > сокеты через websocket, printf в консоль браузера

    Представляю, какой там оверхед при пересечении границы между WASM и DOM. Запомните, дети: если нужно общаться с внешним миром, манипулировать элементами на странице, посылать туда-сюда запросы, ну и вообще -- если хочется интерактив, то яваскрипт в разы (в разЫ, Ы в конце) быстрее, чем WASM. Единственный сценарий, где WASM быстрее JS -- это числодробилка, которая ровно один раз получила число на вход, погоняла над ним алгоритм в течение часа и ровно один раз отдала результат обратно яваскрипту.

     
     
  • 3.35, Anon62513512124 (?), 11:46, 17/03/2023 [^] [^^] [^^^] [ответить]  
  • +3 +/
    Ну, вообще есть радикальная альтернатива этому подходу - не использовать DOM дерево, а вместо него - QML
     
     
  • 4.76, Nope (?), 20:26, 17/03/2023 [^] [^^] [^^^] [ответить]  
  • +/
    реинкарнация апплетов
     
  • 3.40, Рустик (?), 12:55, 17/03/2023 [^] [^^] [^^^] [ответить]  
  • –1 +/
    > Представляю, какой там оверхед при пересечении границы между WASM и DOM.

    200нс из доки emscripten, т.е. можно забить. Жиснявая вебня куда дольше ворочаться будет.

     
  • 3.47, Аноним (47), 14:17, 17/03/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Ради интереса запускал какой-то свой helloworld на Qt в emscripten Там была таб... большой текст свёрнут, показать
     
     
  • 4.49, Аноним (32), 14:21, 17/03/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Не подсказывай ему, пиши свой стартап.  
     
  • 4.54, Аноним (13), 15:04, 17/03/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Канва работает быстрее DOM No shit, Sherlock Правда решение WASM канва нуж... большой текст свёрнут, показать
     
     
  • 5.57, Рустик (?), 15:39, 17/03/2023 [^] [^^] [^^^] [ответить]  
  • +/
    > нужно сравнивать с аналогичным "JS + канва"

    Предъяви, сравним.

    > чтобы отправить строку из WASM в JS, нужно эту строку:

    Нет не нужно, на стороне c++ принимаешь строку как std::wstring и дальше с ним и работаешь.

     
     
  • 6.61, Аноним (13), 16:18, 17/03/2023 [^] [^^] [^^^] [ответить]  
  • +/
    > wasm, рисующий на канве через прослойку emscripten, работает быстрее "классического" HTML + JS.
    > Предъяви, сравним.

    Так ты и предъявляй. Так-то я тебе тоже могу показать, как JS-гриды на канве работают существенно быстрее JS-гридов на DOM. И никакой васм для этого не понадобился.

    > Нет не нужно, на стороне c++ принимаешь строку как std::wstring

    А откуда этот твой std::wstring возьмется без копирования данных из JS-строки в память WASM?

     
     
  • 7.64, Аноним (64), 16:25, 17/03/2023 [^] [^^] [^^^] [ответить]  
  • +/
    > Так ты и предъявляй

    Изи. Я сравнивал ffmpeg.wasm и ffmpeg.js и разрыв в скорости перекодирования одного и того же файла просто чудовищный, wasm в разы быстрее.

    > откуда этот твой std::wstring возьмется без копирования

    Куча у wasm общая с js, копировать не обязательно. Typed arrays те точно не копируется, с чего бы стрингам вести себя иначе, ведь в js это то же самое, что массив.

     
     
  • 8.69, Аноним (13), 16:39, 17/03/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Правильно, ибо это и есть тот самый единственный сценарий, где васм быстрее Пот... большой текст свёрнут, показать
     
     
  • 9.77, Рустик (?), 20:35, 17/03/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Пока так, возможно потом оптимизируют и дадут прямой доступ к dom, на второе пла... текст свёрнут, показать
     
  • 9.87, Аноним (87), 03:16, 18/03/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Это в каких таких _интерактивных_ приложениях тысячи раз в секунду что-то гоняет... большой текст свёрнут, показать
     
  • 5.62, Аноним (62), 16:20, 17/03/2023 [^] [^^] [^^^] [ответить]  
  • +/
    >распаковать из UTF на стороне JS при помощи TextDecoder

    Чего, JS не может напрямую работать с UTF-8?

     
     
  • 6.71, Аноним (13), 16:47, 17/03/2023 [^] [^^] [^^^] [ответить]  
  • +/
    V8 хранит строки в формате WTF-16. Если хочется принять буфер, в которой лежит UTF-8, то нужно перекодировать (TextDecoder). Напрямую с буфером будешь работать именно как с массивом байт, но если тебе эту строку нужно показать пользователю, то придется перегнать в WTF-16.
     
  • 6.92, Аноним (92), 07:32, 18/03/2023 [^] [^^] [^^^] [ответить]  
  • +/
    В JavaScript единственная кодировка utf-16
     
  • 3.85, Аноним (-), 01:25, 18/03/2023 [^] [^^] [^^^] [ответить]  
  • +/
    > Представляю, какой там оверхед при пересечении границы между WASM и DOM.

    Поэтому рисовать куданить в канвас и IO через вебсокеты всякие. Чтобы с вебтормозилками минимально пересекаться.

     

  • 1.27, Аноним (27), 10:06, 17/03/2023 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Интересная ситуация получается.
    GPL используют те, кто хотят рубить бабло, типа Qt, а вот некоторые переводят код на понастоящему свободные лицензии.
     
     
  • 2.29, Аноним (32), 10:25, 17/03/2023 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Так делают когда проект закрывается. Ну будем честны проект и раньше был мало кому нужен так как есть альтернативы.  
     
     
  • 3.30, Аноним (30), 10:47, 17/03/2023 [^] [^^] [^^^] [ответить]  
  • +3 +/
    > Ну будем честны проект и раньше был мало кому нужен так как есть альтернативы  

    будем честны - просто это псевдо IT для смузихлёбов, на острие прогресса совсем другое направление

    https://en.wikipedia.org/wiki/High-level_synthesis

     
     
  • 4.38, Аноним (62), 12:15, 17/03/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Это для разного. То, что в теме - это про Web, А HLS - это для FPGA.
     

  • 1.36, Аноним (36), 11:48, 17/03/2023 [ответить] [﹢﹢﹢] [ · · · ]  
  • –1 +/
    Сейчас как раз раздумываю над выбором инструмента для написания новой кросс платформенной игрушки. И если выбор платформ традиционный Desktop - Web(HTML5) - Android, то там где-то должен быть С++. Но я скорее склоняюсь к написанию игры на Haxe (этот язык ближе к ActionScript/TypeScript), кото рый умеет компилировать как в C++ , так и в JavaScript. И у которого уже есть графические фреймворки (OpenFL) и фреймворки для создания UI (HaxeUI), есть и разные bindings типа Raylib для Haxe. Кроме того у Haxe есть сборщик мусора и не надо напрямую работать с памятью, что облегчит создание прототипа и обеспечит быструю итерацию.
     
     
  • 2.81, Аноним (-), 00:46, 18/03/2023 [^] [^^] [^^^] [ответить]  
  • –1 +/
    > Кроме того у Haxe есть сборщик мусора и не надо напрямую работать с памятью, что позволит

    Позволит фигурно по...ться в профайлере с малоустранимыми лагами этого самого GC, что в игроделе самая мякотка. И пока у плюсера все будет просто работать, вон тот будет пыхтеть в профайлере доказывая всем что не так уж оно и дергается, и вообще :)

     
  • 2.89, Bobr (??), 05:08, 18/03/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Используй Kotlin MPP + rsocket, если нужен онлайн.
    Конференций на тему использования KMPP куча, половина есть на ютюбе и даже на русском.
    Скомпилить код сможешь даже нативно на тостер, не говоря о простой компиляции в js.
    Даже игровой движок под это есть.
     
     
  • 3.91, Аноним (92), 07:30, 18/03/2023 [^] [^^] [^^^] [ответить]  
  • +/
    >Даже игровой движок под это есть.

    Какой?

     
  • 3.94, Рустик (?), 10:44, 18/03/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Б-гмеркзая проприетарь.
    > Скомпилить код сможешь даже нативно на тостер

    И давно на тостерах 2 ядра 2 гига игровая видеокарта?

     
  • 3.95, Рустик (?), 10:47, 18/03/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Шмотлин в wasm пытался, но не шмог, и компилится в обычный медленный js.
     

  • 1.37, burjui (ok), 12:06, 17/03/2023 [ответить] [﹢﹢﹢] [ · · · ]  
  • –3 +/
    Сайты и веб-приложения на C++ — это именно то, чего нашим коллегам так не хватало. Зато теперь на любые претензии в духе "а у вас электрон" можно будет с умным лицом возразить: "Заткнись! У нас C++, поэтому мы умнее, и у нас всё эффективно."
     
     
  • 2.39, Аноним (62), 12:19, 17/03/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Пиши на Rust, кто не мешает?
     
  • 2.41, Аноним (41), 12:55, 17/03/2023 [^] [^^] [^^^] [ответить]  
  • –1 +/
    На: https://www.webtoolkit.eu/

     
  • 2.96, Аноним (32), 11:33, 18/03/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Какое бы не было качество кода. Код на C++ будет быстрее и надо для производительности на нагруженных сайтах. Как на той же самой Фигме.  
     

  • 1.43, Аноним (43), 13:31, 17/03/2023 [ответить] [﹢﹢﹢] [ · · · ]  
  • –1 +/
    вообще для трансляции в js есть nim, который уделывает по всем параметрам раст и по некоторым плюсы
     
     
  • 2.45, Аноним (32), 13:52, 17/03/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Вообще то хорошие развивающиеся проекты на лицензию апач никто не переводит.  
     
     
  • 3.55, Аноним (43), 15:11, 17/03/2023 [^] [^^] [^^^] [ответить]  
  • +/
    ох уж эти любители поспорить о лицензиях вместо того, чтобы проги писать
     
     
  • 4.83, Аноним (-), 01:11, 18/03/2023 [^] [^^] [^^^] [ответить]  
  • –2 +/
    Бесплатно ублажать корпов - такое себе счастье. Тут им патентных прав, там прав сорц зажимать, а они взамен дырок от бублика насыпят. И все как бы честно. А, еще вы можете к ним рабом на галеру прийти, только хотя код пишете вы, командовать будут они и все как бы честно. Или таки нет?
     
     
  • 5.103, Аноним (-), 21:34, 21/03/2023 Скрыто ботом-модератором     [к модератору]
  • +/
     
  • 2.52, Анонимусс (?), 14:54, 17/03/2023 [^] [^^] [^^^] [ответить]  
  • –1 +/
    > есть nim

    Это ненужное еще шевелится?

    Вообще есть много чего, что можно транслировать с js, тут фишка что можно транслировать именно с/с++ из-за накопленной огромной кодовой базы.

     
     
  • 3.58, burjui (ok), 15:43, 17/03/2023 [^] [^^] [^^^] [ответить]  
  • +/
    > именно с/с++ из-за накопленной огромной кодовой базы.

    Это-то и пугает: в вебе уже достаточно своего мусора на не менее уродливых, но более простых ЯП, а если добавится ещё приплюснутый, то может случиться переполнение кучи. Впрочем, меня сейчас, как обычно, заминусют, потому что местные приплюснутые свято верят в то, что уж они-то говно не пишут, потому что раз для знания всего С++ нужен гигантский ум, то если пишешь на С++, автоматически являешься интеллектуальным гигантом, даже если твой IQ всего на 10 баллов выше, чем у "вебмакак". Тут же каждый второй — сын Страуструпа и Кнута.

     
     
  • 4.72, Анонимусс (?), 17:20, 17/03/2023 [^] [^^] [^^^] [ответить]  
  • +/
    С одной стороны - да.
    А с другой стороны - за счет старости кодовой базы и ее повсеместного использования в либах могли поисправлять самые злобные баги и их может быть меньше на момент релиза, чем при написании с нуля на напр. JS. Тут уже нужно рассматривать конкретные ситуации и оценивать риски.
     
  • 2.100, Прохожий (??), 13:14, 18/03/2023 [^] [^^] [^^^] [ответить]  
  • +/
    По некоторым действительно уделывает. Но уж точно не по всем. Nim - язык с GB и не такой хорошей поддержкой конкурентности, как у Rust. Также программистов на Nim, пишут, гораздо меньше, чем программистов на Rust.
     

  • 1.68, Аноним (68), 16:36, 17/03/2023 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    > Также при компиляции используется PartialExecuter, который на основе анализа параметров функций удаляет код, который гарантированно не используется при выполнении.

    ААААА... Где мой код?!!!!

     
     
  • 2.79, Аноним (79), 00:39, 18/03/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Волобуев, вот ваш... код!
     

  • 1.88, Bobr (??), 05:04, 18/03/2023 [ответить] [﹢﹢﹢] [ · · · ]  
  • +3 +/
    Сейчас бы в 2023 смешивать js и плюсы.
    Лёгкий способ превратить жизнь того, кто этот код будет поддерживать в ад.
     
     
  • 2.97, Аноним (32), 11:34, 18/03/2023 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Твоему сайте визите C++ не нужен.  
     
  • 2.99, burjui (ok), 12:39, 18/03/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Минус на минус даёт плюс, а минусминус на минусминус — плюсплюс.
     

  • 1.102, КернелДиггер (?), 18:43, 21/03/2023 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Ничё нипонил!
    Перводить С++ - в ДжаваСкрипт?!
    Что народ курит?
     
     
  • 2.104, nobody (??), 21:28, 22/03/2023 [^] [^^] [^^^] [ответить]  
  • +/
    А во что переводить, если нужно приложение для браузера? В ActiveX?
     

  • 1.105, Аноним (105), 09:31, 23/03/2023 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    я чистый плюсовик, я не знаю эти ваши жээсы и хтмл. Мне проще функционал описать внутри консольного экзешника и сделать обращение к порту программы.
    Как мне прикрутить веб-морду чтобы пользователь тык-тык и доволен?
    Куда копать? Есть примеры?
     
     
  • 2.106, Аноним (106), 12:21, 23/03/2023 [^] [^^] [^^^] [ответить]  
  • +/
    libmicrohttpd
     

     Добавить комментарий
    Имя:
    E-Mail:
    Текст:



    Партнёры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2024 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру