Разобраться в новом коде


Когда пытаешься разобраться в новом коде, то удобно это делать двигаясь от общей архитектуры в сторону реализации отдельных функций. Обычно я пользуюсь связкой vim с ctags и ctags конечно помогает в навигации по функциям, но чтобы понять все взаимосвязи в большой кодовой базе нужно потратить прилично времени. Было бы удобно рисовать граф вызовов функций для общего представления и потом уже погружаться в детали реализации.

После непродолжительного поиска я нашел несколько скриптов, которые рисуют такой граф. На вопрос в твиттере мне подсказали ещё несколько вариантов: doxygen и скрипт graph-llvm-ir для LLVM IR.

Все найденные варианты работают примерно одинаково: строят синтаксическое дерево и на его основе рисуют картинку с графом. При ближайшем рассмотрении выяснилось, что код pycflow2dot давно не обновлялся и не работает с последними версиями питоновских модулей. codeviz тоже давно не обновлялся и у меня не получилось его попробовать. А вот Doxygen оказался очень простым в использовании. Нужно выполнить команду doxygen -g, которая создаст шаблон конфига, потом включить в этом конфиге опции HAVE_DOT, EXTRACT_ALL, EXTRACT_PRIVATE, EXTRACT_STATIC, CALL_GRAPH и запустить doxygen Doxyfile в директории с исходниками. После успешного выполнения программа создаст две директории: latex и html. В первой будут исходники для сборки pdf документа, а во второй документация для просмотра в браузере. Для теста я запускал doxygen в репозитории проекта CRIU (~67 KLOC) и создание документации заняло 4 минуты. Для каждого исходного файла создается отдельный раздел с документации и там можно посмотреть и описания функций, если они аннотированы в коде, и графы взаимосвязей функций. Пользоваться удобно.

Метки: opensource