Как стать автором
Обновить

Комментарии 3

Возможно, кого-то это заинтересует - новость от моей бывшей команды:
Cling Transitions to LLVM’s Clang-Repl - ROOT

autotranslated

Привязка переходов к Clang-Repl LLVM

(30 июня 2021 г.)

За последнее десятилетие мы разработали интерактивный интерпретирующий интерпретатор C ++ (также известный как REPL) в рамках проекта анализа данных физики высоких энергий (HEP) - ROOT. Мы приложили значительные усилия для замены CINT, интерпретатора C ++, который использовался до ROOT5, на недавно реализованный REPL, основанный на llvm-Cling. Cling является основным компонентом ROOT и находится в производстве с 2014 года.

Cling также является автономным инструментом, у которого растет сообщество за пределами нашей области. Он известен тем, что обеспечивает интерактивность, динамическую совместимость и возможности быстрого прототипирования для разработчиков C ++. Например, если вы набираете C ++ в блокноте Jupyter, вы используете ядро jupyter xeus- cling. Одна из основных задач - обеспечить устойчивость Cling и способствовать развитию этого растущего сообщества.

Цели

Cling построен на основе LLVM и Clang. Повторное использование этой инфраструктуры компилятора означает, что Cling получает легкий доступ к новым будущим стандартам C ++, новым функциям компилятора и инфраструктуре статического анализа. Наша проектная организация в основном следовала стандартам сообщества LLVM, но оставшиеся специфические для LLVM настройки, хотя и сохранены на минимальном уровне, теперь являются дорогостоящими для устойчивости и развития. Например, переход на более новые версии LLVM и выпуск Cling в соответствии с графиком выпуска LLVM занимает много времени.

Следующим естественным шагом для смягчения некоторых из этих проблем является перемещение основной части инфраструктуры ближе к орбите LLVM. Сообщество LLVM высоко оценило преимущества надежной разработки программного обеспечения. Например, строгие стандарты LLVM для проверки кода, циклов выпуска и интеграции часто поднимаются нашими «внешними» пользователями. Мы могли бы соединить два высококвалифицированных сообщества разработчиков системного программного обеспечения - одно вокруг LLVM, а другое - вокруг анализа данных в HEP. Успех Cling демонстрирует, что инкрементально компилируемый C ++ - это функция, которая может принести пользу сообществу C ++ и потребности сообщества специалистов по науке о данных. Наконец, существует также потенциальная синергия с такими проектами, как clangd и lldb, которые помогут интерактивному C ++ стать более популярным среди более широкой аудитории C ++.

Где мы сейчас

В 2018 году мы решили подойти к вопросу более структурно. Мы выделили ресурсы из различных текущих мероприятий в DIANA-HEP и IPCC-ROOT, и в 2019 году мы получили награду NSF, поддерживающую эту цель.

В июле 2020 года мы изложили наши аргументы в документе «запрос комментариев» в списках рассылки llvm . Обнадеживающий ответ сообщества побудил нас написать несколько сообщений в блоге llvm с намерением прояснить возможности, аспекты дизайна и использование расширенных функций:

  • Интерактивный C ++ с Cling - мотивирует интерактивный интерпретатор C ++, объясняет архитектуру и принципы проектирования Cling, а также разделяет некоторые проблемы реализации конкретных функций.

  • Интерактивный C ++ для науки о данных - мотивирует интерактивный C ++ в контексте сценария использования науки о данных и физики высоких энергий. Примеры включают возможности программирования в стиле eval и такие технологии, как C ++, в Jupyter Notebooks через xeus-cling и интерактивную разработку CUDA C ++.

  • Cling - Beyond Just Interpreting C ++ - демонстрирует расширенное использование, такое как создание экземпляров шаблона по запросу, языковая совместимость с Python и D через cppyy, а также использование интерпретатора в качестве службы для соединения скомпилированного и интерпретируемого кода. Другие приложения включают расширение языка C ++ для обеспечения функций автоматического распознавания «на лету».

Сообщество LLVM поддержало общее направление перемещения повторно используемых компонентов в Clang. «Новый» инструмент Clang называется clang-repl. Мотивация нового названия имеет два основных аспекта. Во-первых, нам нужно обеспечить постепенное повторное использование кода от clang-repl к нижележащему Cling, и конфликт имен классов - еще одна ненужная сложность. Во-вторых, некоторые функции Cling адаптированы к HEP, и трудно спорить о более широком использовании. Таким примером является неявныйautoвнедрение ключевого слова или подключение файлов ROOT к поиску имени. В этом отношении наличие проекта с именем Cling в репозитории Clang, который отличается по функциональности от проекта в ROOT и HEP, вызовет путаницу и проблемы с упаковкой. И последний (бонусный) аргумент заключается в том, что ROOT всегда будет требовать периодических исправлений как в Cling, так и в LLVM, которые не могут быть привязаны к основному графику выпуска LLVM. Например, было бы неразумно ждать следующего выпуска LLVM, чтобы решить эту проблему (или даже просто процедуры строгой проверки).

12 мая в репозиторий LLVM загрузился исходный, минимально функциональный clang-repl . Ура!

Следующие вызовы

Хотя принятие первоначального патча clang-repl было значительным успехом, по сути, он направлен на то, чтобы инициировать новое направление для сообщества LLVM. Такой стратегический выбор был сделан в результате многолетних усилий HEP по внедрению инноваций, а также по поддержанию своего технологического прогресса, что сделало его доступным для более широкой аудитории.

Некоторые технические аспекты Cling сейчас обсуждаются с сообществом LLVM, например, как реализовать надежные механизмы восстановления ошибок и удаления кода, которые освобождают неиспользуемую базовую память. Эти задачи оказались трудными для Cling, находящегося за пределами инфраструктуры LLVM. Благодаря Джону МакКоллу и Ричарду Смиту набросок технического проекта функции в LLVM получился правильным, и мы работаем над ним. Однако этот процесс ставит ожидаемую задачу - как продвинуть технологию в слегка касательном направлении, одновременно возвращая ее в основную область использования?

Обратная реализация от основного LLVM к Cling и ROOT - нетривиальная задача, отчасти потому, что ROOT обычно использует значительно более старые версии LLVM. LLVM API не обещает обратной совместимости, а ROOT использует сложную и обширную поверхность API, что делает переход на более новые версии, по сути, задачей разработки. Целью восходящих частей Cling в LLVM является уменьшение используемой поверхности API. Мы ускорим процедуру обновления, хотя по-прежнему измеряется месяцами, чтобы можно было проводить всестороннее тестирование стеками программного обеспечения для экспериментов. Мы не можем ожидать, что ROOT сможет легко принять каждый выпуск LLVM, не говоря уже о каждом коммите. Однако мы можем сохранить ROOT ближе к основной ветке LLVM, что упростит обратное портирование функций из основной ветки.

Следующая часть головоломки заключается в том, если основная функциональность успешно перенесена на серверную часть, как постепенно развивать ROOT и кодовые базы Cling в этом направлении и как обеспечить, чтобы все работало в полном масштабе экспериментов. Лично я считаю, что это возможно только в том случае, если два конца совпадают по замыслу. То есть при разработке патча против clang-repl нам необходимо оценить его повторное использование в Cling. Легче сказать, чем сделать, и нам нужно будет учиться на собственном опыте ...

Устойчивость в открытом исходном коде обычно означает наличие опытных пользователей, которые могут отправлять отчеты об ошибках, обзоры кода и код. Таким образом, неотъемлемой частью этих усилий является разъяснительная работа и создание сообщества как для clang-repl, так и для Cling. Клингу повезло, что люди жертвуют свое время, чтобы помочь перейти к основной линии LLVM. Здесь я хочу их всех поблагодарить. В частности, Рафаэль Исеманн, Йонас Ханфельд и Пратюш Дас, каждый из которых посвятил значительное время тому, чтобы помочь нашим усилиям и тем самым сократить накопленный технический долг в HEP.

Заключение

Исследования и разработки в направлении интерактивного и инкрементного C ++ в ROOT привели к созданию Cling, который стал краеугольным камнем для анализа данных в области HEP. Технические достижения в Cling открывают новые, ранее не предполагаемые возможности для clang и C ++, такие как создание экземпляров шаблонов по запросу, отражение и языковая совместимость.

Благодаря поддержке CERN, USCMS, DIANA-HEP, Intel «технический долг» при первоначальном внедрении Cling был значительно сокращен. Тем не менее, большая часть этой работы еще впереди.

Cling теперь используется вне HEP. Мы рады работать над тем, чтобы сделать его доступным для еще более широкой аудитории, например, за счет расширения связей Cling с проектом llvm, одновременно возвращая достижения других сообществ в HEP через Cling и ROOT.

Благодарности

Автор хотел бы поблагодарить Axel Naumann и David Lange, которые внесли свой вклад в этот пост. Вы можете узнать больше о нашей деятельности на https://compiler-research.org и https://root.cern/cling/

Возможно, кого-то это заинтересует ...

Минусы-то за что?

Я просто хотел сказать, что C++ сообществом активно развивается C++ интерпретатор и Reflection на основе LLVM.  

"Reflection && Interpreter"  - это то, что давно есть почти во всех современных языках программирования на уровне стандарта, но только не в C++.
Бьярн прекрасно знает об этой работе и не раз упоминал о ней в своих публикациях.
Более того, добавление "Reflection && Interpreter" было даже, когда-то, лет 10 назад, добавлено комитетом по C++ стандарту в C++ Roadmap.

К сожалению, этого не произошло.

И то, что мы видим сегодня - это бурное развитие C++образных языков, таких как C# & Kotlin, и "стагнацию" их прародителя, C++, как , по-видимому, и самого его создателя, Бьярнa Страустрапа, о чём говорят заключительные строки этой "биографии".


Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.