50 лет эволюции поиска по коду: что стоит за кодинговыми агентами
Кодинговые агенты вроде Claude Code, Codex и Cursor по-прежнему опираются на технологии поиска по коду, которым от пяти до пятидесяти лет. Об этом рассказывает большая статья на Хабре об эволюции инструментов поиска.
- grep, написанный Кеном Томпсоном в Bell Labs, вышел в 1973 году и до сих пор лежит в основе поиска по коду
- ripgrep ускоряет поиск за счёт извлечения обязательных литералов и движка на конечных автоматах без катастрофического бэктрекинга
- Разные задачи — найти текст, объявление функции, поток данных или смысл — требуют принципиально разных представлений репозитория

Кодинговые агенты — 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 на конечных автоматах от этого защищён.



