Pull to refresh

Comments 40

А еще clang-c можно наверное юзать для автоматической генерации биндингов к скриптовым языкам
Да его много для чего юзать можно.
Я думаю будет в тему добавить ссылку на доклад от Chandler Carruth — Refactoring C++ with Clang.
www.youtube.com/watch?v=yuIOGfcOH0k&feature=plcp
В нем объясняется и показывается на конкретном примере реализация ренейма метода.
Ещё б они заопенсорсили свой рефкторинговый тул…
ASTMatchers некоторое время назад закоммитили.
Думаю стоит добавить эту статью ещё в хаб Компиляторы.
Объясните мне пожалуйста, в чем смысл использования С++ как скриптового языка? В какой ситуации вообще такое решение может быть принять и быть оправданным?
*принято, selffix
Возможные области примерения, которые я вижу, две:
1. Трансляторы (кодогенераторы) C++ -> C++ типа Qt moc.
2. Лёгкие плагины к IDE, написанных на C++.

Мотивация примерно следующая. В обоих случаях основная кодовая база — на C++. Чтобы не расширять набор языков, для которых требуется поддержка (а любой скриптовый язык этот набор автоматически расширяет), «скриптование» непосредственно на C++ имело бы смысл.
Когдогенераторы — хорошее применение, но в виде скрипта сомнительно. В IDE проще python/jscript использовать.
Вопрос комфорта, на мой взгляд.
Ну и да. Вопрос последующей поддержки. Чем большее количество языков используется в исходниках — тем большее количество разноплановых специалистов нужно, чтобы поддерживать кодовую базу. В итоге нередко получается, что знания о том, как работает ммм… скрипт для генерации ну, скажем, метаинформации по набору классов (работающий на связке doxygen + msxslt + javascript), превращаются в сакральные вместе с уходом из команды человека, который этот скрипт поддерживал.
Я согласен, но не проще ли это реализовать в виде уже скомпилированной DLL, а не on-the-fly в виде плагина в исходниках. На мой взгляд, это поможет избежать кучи проблем.
Всё зависит от того, какая политика выбирается в отношении хранения кодовой базы и инструментария, возможно ли кодогенераторы собирать вместе с регулярной сборкой продукта, сколько телодвижений придётся делать другим разработчикам, чтобы всем этим тулчейном пользоваться на рабочих машинах, и т. п.
Я думаю, можно значительно расширить возможности отладчика в IDE. Начиная с выполнения кода при его изменении без перекомпиляции/перезапуска отладчика.
Это хорошая идея. Мне нравится.
Можно, пожалуйста, примеры обработки распарсенного исходника?
Будут, но чуть позже. Иначе статья вышла бы уж слишком большой.
Раньше в clang была возможность конвертирования С++ кода в С. Интересно, возможностей API хватит для реализации этого?
Если есть конвертация в байткод, то его, по идее, можно транслировать в си. Это даже легче, чем машинный код в си.
Си бекенд удалили так как не было мейнтейнеров.
Используйте Tooling для работы с clang api, пожалуйста! Потому что следующий вопрос после «а как это скомпилировать» обычно «а почему системные заголовки не подключаются» — потому что в вашем примере вы фактически продублировали маленький кусочек драйвера, который делает очень много системно-зависимой магии за кулисами.
Если разобраться, то clangTooling не делает ничего особенного. Тут ведь как — основная работа по разбору опций командной строки сосредоточена в библиотеке clangDriver. И она используется из clangFrontend при создании экземпляра CompilerInvocation. Собственно, результаты этой работы не раз видел в отладчике.
Я говорю не про разбор опций, а про формирование опций для -cc1 режима. Например, поиск инсталляции GCC и стандартной библиотеки c++.

А так да — ничего особого, только делает ваш код короче раз в пять.
Задам вопрос так. А вы пытались откомпилировать приведенные примеры и проверить — находятся ли, например, пути к стандартным заголовкам или нет? Может быть, конечно, я недостаточно внимательно посмотрел исходники Tooling, но у меня сложилось впечатление (и комментарии к классам это впечатление усилили), что основное ее назначение — позволить клиентскому коду обработать за один раз сразу несколько исходных файлов. И никаких специальных. Впрочем, я мог и ошибиться, и не туда посмотреть.
> А вы пытались откомпилировать приведенные примеры и проверить — находятся ли, например, пути к стандартным заголовкам или нет?

Не пробовал :) Вот был бы патч на дерево кланга…

Сейчас вчитался в код — вы используете ASTUnit, поэтому вполне возможно ваш код будет находить стандартную библиотеку. Извините если был не прав.

> основное ее назначение — позволить клиентскому коду обработать за один раз сразу несколько исходных файлов

В том числе. А также избавить клиентский код от необходимости разбираться в хитросплетениях объектов, которые ему непосредственно не нужны.
По поводу хитросплетений объектов — интерфейс кланга настолько широкий, что позволяет выполнить одно и то же действие несколькими различными способами. И у каждого варианта будут свои особенности.
разбираю сейчас примеры. у меня на os x без дополнительного шаманства не данный пример c++ include не подхватывает, ни через tooling.
Да. Продолжение будет. Постараюсь к концу января — началу февраля выложить.
Круто! Я сейчас активно изучаю эту тему, будет интересно почитать :)
Вот уже и начало февраля, а статьи все нет и нет…
Прошу прощение, за оживление старого топика.
Столкнулся с тем, что не могу заставить Ваши примеры работать
#include "clang/Frontend/DiagnosticOptions.h"
— этот файл я могу найти только в Basic, но не во Frontend,

IntrusiveRefCntPtr< DiagnosticsEngine> diags(CompilerInstance::createDiagnostics(
— эта строчка выдает No matching function for call to 'createDiagnostics'

не знаю почему так. куда посоветуете копать и что можно читать про clang-c API, кроме доков?
API существенно поменялся =(
clang C++ API (в отличие от C-шного libclang) не обременено обратной совместимостью. Поэтому от версии к версии может изменяться. Иногда — существенно.
А можно услышать несколько основных ограничений Clang C API? Просто обратная совместимость тоже неплохой аргумент и только тем фактом, что это Pure C API я вполне могу смириться. Но какую информацию я при этом потеряю и не смогу получить от clang?
Думаю, да. Сейчас занимаюсь подготовкой доклада, где аккурат этот вопрос будет освещаться. По результатам исследования — отпишусь.
Sign up to leave a comment.

Articles