50 лет эволюции поиска по коду: что стоит за кодинговыми агентами

Кодинговые агенты вроде Claude Code, Codex и Cursor по-прежнему опираются на технологии поиска по коду, которым от пяти до пятидесяти лет. Об этом рассказывает большая статья на Хабре об эволюции инструментов поиска.

Главное
  • grep, написанный Кеном Томпсоном в Bell Labs, вышел в 1973 году и до сих пор лежит в основе поиска по коду
  • ripgrep ускоряет поиск за счёт извлечения обязательных литералов и движка на конечных автоматах без катастрофического бэктрекинга
  • Разные задачи — найти текст, объявление функции, поток данных или смысл — требуют принципиально разных представлений репозитория
Схема эволюции инструментов поиска по коду: от grep до графов и поиска по смыслу
Фото: Хабр: Машинное обучение

Кодинговые агенты — Claude Code, Codex, Cursor — при выполнении задач вроде «почини вот эту функцию» сначала должны найти нужный код в репозитории. Как устроен этот поиск, разбирает статья на Хабре. Автор напоминает: в 2026 году лучшие агенты по-прежнему опираются на алгоритмы и технологии возрастом от пяти до более чем пятидесяти лет.

Почему инструментов так много

«Найти код» — это несколько принципиально разных задач, а не одна. Можно искать по тексту, по объявлению функции, по смыслу, по форме или по пути данных через систему. Каждый тип вопроса требует своего представления репозитория: как текст, как набор сущностей, как синтаксическое дерево, как граф связей или как набор смысловых векторов.

Именно поэтому зоопарк инструментов не исчез: почти ничего из придуманного за полвека не умерло.

grep: простота как преимущество

Простейший случай — известен кусок текста, надо найти, где он встречается. Для этого достаточно текстового поиска. Утилиту grep написал Кен Томпсон в Bell Labs, а название пришло из редактора ed, где команда g/re/p означала «найти строки по регулярному выражению и напечатать их». В самостоятельную утилиту это вынесли в 1973 году.

Для исходного кода примитивность grep оказалась достоинством: ему не нужно понимать Python, Go или Java. Он просто ищет текст — независимо от того, функция это, комментарий или строковая константа. Сегодня часто используют ripgrep (команда rg) — современную и быструю реализацию того же подхода.

Главное преимущество прямого поиска — между файлом и результатом почти ничего нет. Только что добавленную функцию можно найти сразу, без переиндексации и без сборки проекта. Для агента это особенно важно: он может сам изменить файл и через секунду снова искать по репозиторию.

Что ускоряет ripgrep

Быстродействие ripgrep складывается из нескольких решений. Первое — literal extraction: из регулярного выражения извлекают обязательные текстовые фрагменты и проверяют полное выражение только рядом с ними. Поиск коротких фрагментов хорошо оптимизируется векторными инструкциями процессора.

Второе — движок на конечных автоматах: время работы растёт линейно с длиной строки, поэтому специально подобранная строка не превращает поиск в экспоненциальную мясорубку (катастрофический бэктрекинг). Для возможностей вроде обратных ссылок можно переключиться на PCRE2, но без гарантии линейного времени.

Третья оптимизация — не читать лишние файлы: ripgrep по умолчанию пропускает скрытые каталоги вроде .git, node_modules, target, dist и generated, двоичные файлы и всё из .gitignore.

Для профиТехнические детали: архитектура, цифры, ссылки

Ключевые технические приёмы ripgrep из статьи:

  • Literal extraction — из регулярного выражения выделяются обязательные литералы, полная проверка идёт только рядом с ними.
  • Движок на конечных автоматах — линейное время работы независимо от шаблона, без катастрофического бэктрекинга.
  • PCRE2 — подключается флагом -P для обратных ссылок и других расширенных возможностей, но без гарантии линейного времени.
  • Умный обход дерева — пропуск скрытых и бинарных файлов, каталогов из .gitignore (node_modules, target, dist, generated).

Примеры команд из статьи: grep -R "verifyCredentials" ., rg "verifyCredentials", rg -P '(ab)\1'.

Вопросы и ответы

Почему grep до сих пор используют, если есть умные инструменты?
Потому что между файлом и результатом почти ничего нет: поиск видит то, что лежит на диске сейчас, без переиндексации и сборки проекта. Для агента, который сам меняет файлы, это критично.
Чем ripgrep отличается от grep?
grep — это подход (искать в тексте файлов), ripgrep — современная и быстрая реализация, заточенная под деревья исходников. Внутри — извлечение литералов, движок на конечных автоматах и умный обход каталогов.
Что такое катастрофический бэктрекинг?
Ситуация, когда движок регулярных выражений перебирает варианты с возвратами, и число способов растёт экспоненциально с длиной строки. ripgrep на конечных автоматах от этого защищён.