Обоснование. В моей повседневной разработке кода на С++ мне часто нужно ответьте на основные вопросы, например, кто называет то, что в очень большом С++-коде которая часто меняется. Но, мне также нужно иметь некоторые автоматизированный способ точно определить, что делает код вокруг определенной области кода. Полезны инструменты "grep", такие как Cscope (и Я использую их сильно уже), но не С++ - знание языков: они не дают возможности идентифицировать типы и виды лексических окружающей среды для данного использования типа или функции таким образом, чтобы способствующей автоматизации (даже если указанная автоматизация ограничена операции "только для чтения", такие как просмотр кода и навигация, но я прося гораздо больше, чем ниже).
Вопрос: существует ли уже существующая на C/С++ библиотека с открытым исходным кодом (родной, не управляемый, а не Microsoft или Linux-специфический), который может статически сканировать или анализировать большое дерево кода С++ и может производить которые отвечают на подробные вопросы, такие как:
- Какие функции вызывается некоторой поставляемой функцией?
- Какие функции используют этот поставляемый тип?
- Не так уж и выше, если задействованы классы С++ или шаблоны классов.
Результирующий набор должен предоставить своего рода "дескриптор". Я должен уметь для подачи этой обработки обратно в библиотеку для выполнения следующих типов интроспекции:
- Что такое смещение байта в файл, где была сделана ссылка?
- Какова ссылка на абстрактное синтаксическое дерево (AST) этого ссылку, чтобы я мог проверять окружающие конструкции кода? А также каждый объект АСТ также имеет путь к файлу, смещение по байтам и связанные с ним данные типа-типа, чтобы я мог рекурсивно ходить повернуть график звонящих или рефереров для выполнения полезных операций.
Ответ должен отвечать следующим требованиям:
- API. Открытый API должен быть одним из следующих:
- C или С++ и, вероятно, это "C-дескриптор" или С++ - класс-экземпляр (и если это так, должен быть общий код C o С++, а не Microsoft- или Конкретные кодовые конструкции Linux, если только они не соответствуют специфике данная платформа), или
- Стандартный ввод командной строки и стандартный вывод.
- Знание С++. Не ограничивается C-кодом, но понимает язык С++. строит в мельчайших подробностях, включая понимание межклассовых наследования и шаблоны С++.
- Быстрый. Если сканирование больших кодовых баз значительно быстрее, чем скомпилировать всю базу кода с нуля. Это, вероятно, необходимо быть расслабленным, но только если Инкрементный поиск результата и Resilient к небольшим изменениям кода требования полностью выполнены ниже.
- Укажите количество результатов. Я могу задать вопрос: "Сколько результатов вы бы предоставили какой-либо запрос (и не отправляйте мне все результаты)? ", который реагирует на порядок менее 3 секунд против чтобы получить все результаты по любому заданному вопросу. Если это потребуется слишком долго, чтобы получить этот ответ, а затем тратит время разработки. Это в сочетании со следующим требованием.
- Инкрементный поиск результатов. Я должен уметь спросить "Дайте мне просто следующие N результатов этого запроса ", а затем дескриптор чтобы я мог задать вопрос повторно, таким образом постепенно вытягивая результаты поэтапно. Это означает, что я не нужно ждать полного набора результатов перед тем, как увидеть некоторые подмножества всех результатов. И что я могу отменить если я видел достаточно результатов. Причина: мне нужно ответьте на вопрос: "Каково влияние создания или развития изменение какой-либо определенной сигнатуры функции? "
- Отказоустойчивые до небольших изменений кода. Если я изменю заголовок или источник файла, мне не нужно ждать, пока вся база кода будет rescanned, но только этот заголовок или исходный файл перепроверен. Повторное сканирование должно быть быстрым. Например, не делайте то, что cscope вам нужно сделать, чтобы пересканировать всю базу кода для небольшие изменения. Понятно, что если вы измените заголовок, тогда сканирование может занять больше времени, поскольку другие файлы, содержащие этот заголовок должен быть подвергнут сканированию.
- Агенство IDE. Является ли текстовый редактор агностиком (не заставляйте меня использовать конкретный Текстовый редактор; Я уже сделал свой выбор, спасибо!)
- Платформа Agnostic: Является платформо-агностиком (не заставляйте меня использовать его на Linux или только на Windows, поскольку я должен использовать оба этих платформы в моем ежедневном измельчении, но мне нужен инструмент, который будет полезен так как у меня есть песочницы на обеих платформах).
- Небиновое: не стоит мне ничего, кроме времени скачать и скомпилировать библиотеку и все ее зависимости.
- Не пробная версия.
- Активно поддерживается. Вероятно, отправка запросов справки в списки рассылки или связанные форумы, скорее всего, получат ответ менее чем за 2 дни.
- Сетевой агностик. Базы данных: сборники библиотек должны быть доступны напрямую сеть из 32-разрядных и 64-разрядных систем, как Linux, так и Windows взаимозаменяемо, в то же время, и не вставлять жестко установленные пути к файловым системам, которые в противном случае "корнили" базу данных конкретной сети.
- Агрессивность среды сборки. Не требует интимного знания моей среды сборки. заметное исключение, возможно, требующее знания компилятора заданные макросы CPP (например, -Dmacro = значение).