# Откуда взялось название grep и как лингвистика создала утилиту

Источник: https://www.youtube.com/watch?v=NTfOnGZUZDk
Канал: Computerphile
Опубликовано: 06.07.2018

---

Утилита `grep` является одним из самых известных инструментов в экосистеме Unix, позволяющим находить текстовые шаблоны в неограниченном объеме данных. Известный ученый в области компьютерных наук Брайан Керниган в интервью для проекта Computerphile раскрыл истинную историю происхождения этой программы. Оказывается, ее появление было обусловлено жестким дефицитом памяти в компьютерах 1970-х годов и попыткой расшифровать анонимные исторические документы США.

## 💾 Эпоха экстремального минимализма: Unix на PDP-11
[[JUMP:0:53]]
Чтобы понять логику создания `grep`, необходимо перенестись в 1970–1971 годы — раннюю эпоху развития операционной системы Unix. В те времена вычисления производились на мини-компьютерах уровня PDP-11 (вероятно, модели 11/20), которые обладали ничтожной по современным меркам вычислительной мощностью. 

Аппаратные ресурсы систем того времени жестко ограничивали разработчиков:

* Объем оперативной памяти составлял порядка 32–64 килобайт.
* Емкость внешних дисковых накопителей измерялась всего несколькими мегабайтами.

Такой дефицит ресурсов напрямую влиял на архитектуру программного обеспечения. Программы ранней Unix создавались простыми и прямолинейными. Брайан Керниган подчеркивает, что этот минимализм отражал не только слабость доступного «железа», но и личные вкусы создателей Unix — Кена Томпсона и Денниса Ритчи.

## 📝 Бумажный редактор ed и сила регулярных выражений
[[JUMP:1:46]]
Основным инструментом для работы с текстом в Unix был редактор `ed` (среди знатоков произносимый как «и-ди»). Написанный Кеном Томпсоном, он представлял собой упрощенную версию более раннего редактора `QED`. Важнейшей особенностью той эпохи было отсутствие привычных нам мониторов — вся работа, включая редактирование кода, велась на бумажных терминалах (телетайпах). 

Работа на бумаге требовала максимальной экономии ресурсов, поэтому `ed` управлялся краткими однобуквенными командами без использования курсора:

* `p` (print) — вывод строки на экран или бумагу;
* `d` (delete) — удаление строки;
* `s` (substitute) — замена одного фрагмента текста на другой;
* `a` (append) — добавление новых строк;
* `r` (read) и `w` (write) — чтение и запись файлов.

Адресация в редакторе происходила по номерам строк. Например, команда `1,10p` выводила первые десять строк, а комбинация `1,$p` распечатывала файл целиком от первой до последней строки. Главным нововведением Томпсона в `ed` стала интеграция регулярных выражений — специальных шаблонов для поиска текста. Шаблон записывался внутри косых черт, например, `/print/`.

## 🇺🇸 Лингвистический детектив и загадка «Записок Федералиста»
[[JUMP:5:57]]
Несмотря на удобство регулярных выражений, у редактора `ed` был критический архитектурный недостаток: он работал исключительно внутри оперативной памяти компьютера. Из-за этого в нем физически невозможно было открыть большой файл. 

В это же время коллега Брайана Кернигана и Кена Томпсона, Ли Макмэхон, увлекся текстовым анализом (тем, что сегодня называют обработкой естественного языка). Макмэхон пытался решить историческую загадку авторства «Записок Федералиста» — 85 политических эссе, опубликованных в 1787–1788 годах в поддержку Конституции США. Документы выходили анонимно под псевдонимом Публий (Publius), и ученые до сих пор спорят, какие именно тексты принадлежат Александру Гамильтону, Джеймсу Мэдисону или Джону Джею.

Общий объем этих 85 документов составлял чуть более 1 мегабайта. Для современных компьютеров это ничтожно мало, но в 1971 году такой массив данных невозможно было одновременно загрузить в редактор `ed` для анализа.

## 🛠️ Как команда «g/re/p» превратилась в культовую утилиту
[[JUMP:7:18]]
Ли Макмэхону требовалось найти все вхождения определенных слов во всех файлах «Записок Федералиста». Он обратился с этой задачей к Кену Томпсону, после чего ушел домой ужинать. Вернувшись на следующий день, Макмэхон обнаружил, что Томпсон за ночь написал отдельную утилиту, которую назвал `grep`. Программа просто обходила указанные файлы и выводила строки, соответствующие регулярному выражению.

Название утилиты родилось напрямую из синтаксиса редактора `ed`. В архитектуре `ed` существовала глобальная команда `g` (global), которая выполняла действие над всеми строками, подходящими под регулярное выражение. Полная запись команды выглядела так: `g/re/p`. 

Расшифровывалось это следующим образом:

* `g` — искать глобально по всему файлу (global);
* `/re/` — шаблон регулярного выражения (regular expression);
* `p` — напечатать совпавшие строки (print).

Томпсон фактически вырезал этот функционал из редактора, превратив его в самостоятельный инструмент, а аббревиатура `g/re/p` превратилась в имя `grep`. По мнению Кернигана, в этом решении проявилась гениальность Томпсона — способность мгновенно создать красивую утилиту, просто убрав лишнее из существующего кода.

## 🎓 Принстонский эксперимент: Попробуй повторить за Томпсоном
[[JUMP:8:49]]
Спустя 25 лет, весной 1993 года, Брайан Керниган преподавал курс по программированию в Принстонском университете и решил дать своим студентам необычное задание. Он предоставил им исходный код редактора `ed`, который на тот момент насчитывал около 1800 строк на языке C. Задача студентов заключалась в том, чтобы за одну неделю извлечь этот код и воссоздать утилиту `grep`.

Керниган выделил ключевые особенности этого эксперимента:

* У студентов было важное преимущество — они точно знали, как должен работать финальный продукт, и код уже был написан на высокоуровневом языке C.
* Оригинальный `grep` Кен Томпсон писал на ассемблере для PDP-11.
* Однако у принстонских студентов был один фатальный недостаток — никто из них не был Кеном Томпсоном.

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