воскресенье, 6 января 2013 г.

QtCreator и библиотеки clang: вести с фронтов

Ещё в 2010 году был начат постепенный перевод QtCreator на библиотеки clang вместо встроенного движка анализа C++. Этот перевод настолько постепенный и настолько аккуратный, что в официальной версии QtCreator, которую скачивают для windows и mac и которая доступна в репозиториях linux, нет даже намёка на clang.

С точки зрения разработчика, в код QtCreator добавились точки подключения нового плагина — и не более того. Сам плагин ClangCodeModel находится в отдельной ветке git-репозитория. А в этом посте находятся предварительные результаты, а также оценка готовности плагина и самого clang на начало января 2013 года.


Диагностика


Очень точная каретная диагностика ошибок — одна из главных фишек clang, во многом именно она обеспечила интерес множества людей, компаний и организаций к ещё одному компилятору. Качество этой диагностики значительно выше, чем у любых других компиляторов, и на порядки лучше, чем во всех популярных IDE (не считая тех, что уже используют clang).
context() и stringize() — методы класса HeaderGen. Найдёте ошибку без всплывающей подсказки?
ClangCodeModel подчёркивает ошибки и показывает подсказку при наведении; он также передаёт clang параметры сборки проекта, в том числе и опции компилятора, например -Wdocumentation или -std=[...].

Текущая реализация на порядок лучше встроенной диагностики QtCreator и могла бы заменить её уже сейчас без каких-либо регрессий. Однако ещё остались баги, из-за которых иногда исчезает часть warning'ов. Не реализована поддержка QuickFix (или FixIt, в терминологии clang), и сообщения со статусом Note пока что прикрепляются к основному сообщению как текст, а не как ссылка на другой участок кода.

Дополнение кода


Objective-C, Ubuntu, GNUstep
На стороне ClangCodeModel существенных проблем не осталось, однако здесь подкачал сам clang. Качество дополнения уже имеет такого явного преимущества: в отдельных аспектах внутренние движки IDE могут его превзойти, а иногда попадаются заведомо неверные предложения. Но главная проблема — время дополнения C++. Разбор кода и рассчёт дополнения создают паузу, и если паузу от встроенного в QtCreator движка пользователь просто не успевает заметить, то у clang уходит от 200 до 500 миллисекунд, в зависимости от степени использования STL и Qt.

В ближайшей перспективе проблемы на стороне clang решены не будут. Хотя есть целых два направления — инкрементальная компиляция и import вместо #include — обе задачи поистине огромны, а возможные затраты на их выполнение невозможно спрогнозировать.

К счасть, некоторую часть пауз и проблем с качеством можно спрятать на стороне IDE, чем я и собираюсь заняться в январе.

Индексация


Множество типичных функций IDE требует индексации всего проекта. К сожалению, ClangCodeModel в 10-100 раз медленнее индексирует проект, чем встроенный парсер QtCreator. Этот разрыв будет уменьшен, когда Erik Verbruggen завершит работу над менеджером предкомпилированных заголовков. Тем не менее, именно индексация может ещё несколько лет сдерживать интеграцию ClangCodeModel в основную ветку.

Ссылки


  1. Инструкция по сборке ClangCodeModel
  2. Модули в C++ — инициатива разработчиков clang.

Комментариев нет:

Отправить комментарий