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

Computerphile 1,3 млн 10 мин 4 мин 06.07.2018
Главное

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

💾 Эпоха экстремального минимализма: Unix на PDP-11 0:53

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

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

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

📝 Бумажный редактор ed и сила регулярных выражений 1:46

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

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

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

🇺🇸 Лингвистический детектив и загадка «Записок Федералиста» 5:57

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

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

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

🛠️ Как команда «g/re/p» превратилась в культовую утилиту 7:18

Ли Макмэхону требовалось найти все вхождения определенных слов во всех файлах «Записок Федералиста». Он обратился с этой задачей к Кену Томпсону, после чего ушел домой ужинать. Вернувшись на следующий день, Макмэхон обнаружил, что Томпсон за ночь написал отдельную утилиту, которую назвал grep. Программа просто обходила указанные файлы и выводила строки, соответствующие регулярному выражению.

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

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

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

🎓 Принстонский эксперимент: Попробуй повторить за Томпсоном 8:49

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

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

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

💬 Цитаты

«Однако у принстонских студентов был один фатальный недостаток — никто из них не был Кеном Томпсоном.»

Брайан Керниган 09:41
👥 Спикеры
📖 Термины
grep
Утилита командной строки Unix для поиска строк, соответствующих регулярному выражению.
ed
Стандартный строковый текстовый редактор в ранних версиях операционной системы Unix.
Регулярное выражение
Шаблон, описывающий или сопоставляющий начертание символов в тексте.
PDP-11
Серия 16-разрядных мини-компьютеров компании DEC, на которых развивалась ранняя Unix.
📊 Цифры
🗓 Хронология
  1. 1787–1788 Публикация 85 анонимных эссе «Записок Федералиста» под псевдонимом Публий.
  2. 1970–1971 Ранний этап развития Unix на мини-компьютерах PDP-11 и создание Кенном Томпсоном утилиты grep за одну ночь.
  3. 1993 Брайан Керниган дает задание студентам Принстона воссоздать grep из исходного кода ed за неделю.
Технологии и IT Брайан Керниган grep Unix Кен Томпсон