Разработка системы навигации по кодовой базе в монорепозитории
В своей магистерской диссертации я разработал новую систему семантической навигации по коду, предназначенную для эффективной работы в сверхбольших монорепозиториях, таких как Arcadia в Яндексе.
Основная проблема большинства аналогов — часовые задержки при обновлении индекса для обработки накопившихся в репозитории изменений, что не позволяло, например, переиспользовать такой индекс в сценариях разработки в IDE. Мое решение предлагает пофайловую инкрементальность: при изменении одного файла переиндексируется только он, что сокращает время обновления до нескольких секунд.
Центральная идея работы заключается в отказе от графовых моделей в пользу системы переписывания строк. В моем решении семантические связи и правила разрешения имен (включая области видимости, импорты и наследование) кодируются в виде набора строковых правил. Процесс навигации, например, «Переход к определению», сводится к последовательному применению этих правил к строке-контексту, представляющей ссылку, до тех пор, пока она не приведет к строке, обозначающей определение. Для подтверждения жизнеспособности подхода я реализовал систему правил для языка Python, включая индексатор и LSP-сервер для интеграции с IDE. Эксперименты показали, что мой подход сокращает время переиндексации Python примерно в 100 раз, обеспечивая качество навигации и время отклика, сопоставимые с существующими решениями.
По сравнению с такими системами, как Kythe, Glean и SourceGraph, а также с текущим инструментом, используемым в Яндексе, мое решение на порядки ускоряет индексацию за счет пофайлово-инкрементального подхода. Фундаментально мы переносим часть сложности анализа языка в саму модель данных и реализуем ленивое разрешение ссылок в момент запроса. Поскольку модель является языко-независимой, это упрощает добавление поддержки для специфичных доменных языков, что сводится к написанию генератора правил переписывания по коду. В отличие от модели Stack Graphs, которая послужила основой для моего решения, оно более гетерогенно, прозрачно и отказоустойчиво, а таже обеспечивает сопоставимые показатели скорости индексации и полноты индекса при значительно меньшем размере индекса.
Прямое практическое применение моей системы — внедрение в инструменты разработки Яндекса. Учитывая масштабы компании, это может иметь значительный эффект. Хотя система была создана для Arcadia, ее архитектурные принципы универсальны. Результаты работы могут послужить основой для создания новых или улучшения существующих open source инструментов для анализа кода, предназначенных для работы с большими проектами, которые становятся все более распространенными.