«Никто не Кен Томпсон»: Брайан Керниган об истории утилиты grep

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

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

💾 Эпоха PDP-11 и скромные ресурсы ранней Unix 0:00

В начале 1970-х годов операционная система Unix делала свои первые шаги. Компьютер, на котором она работала — PDP-11 (вероятно, модель 11/20) — обладал ничтожной по современным меркам вычислительной мощностью. Оперативная память составляла порядка 32 или 64 килобайт, а вторичное хранилище на дисках ограничивалось всего несколькими мегабайтами. По словам Брайана Кернигана, жесткие лимиты аппаратного обеспечения напрямую влияли на архитектуру программ: софт стремились делать максимально простым и прямолинейным. Это также отражало личные вкусы ключевых разработчиков системы — Кена Томпсона и Денниса Ритчи.

Главным инструментом для работы с текстом в те годы был редактор ed (среди посвященных его принято называть «Иди»), созданный Кеном Томпсоном на основе более раннего редактора qed. Работа велась в эпоху, когда привычных видеотерминалов и дисплеев еще не существовало, а весь ввод и вывод распечатывался на бумаге. Чтобы минимизировать расход бумаги, ed управлялся краткими однобуквенными командами и работал построчно. В нем не было привычного нам курсора для перемещения внутри строки. Керниган приводит примеры основных команд редактора:

Для работы с диапазонами строк использовалась адресация: например, команда 1,10p выводила первые десять строк, а сокращение 1,$p печатало весь файл целиком.

🔍 Регулярные выражения Кена Томпсона 4:25

Важнейшим нововведением в ed, которое Брайан Керниган однозначно связывает с влиянием Кена Томпсона, стала интеграция регулярных выражений. Регулярное выражение представляло собой шаблон для поиска текста — от точного совпадения слова до сложных конструкций с использованием метасимволов.

В редакторе ed шаблон поиска записывался внутри косых черт, например, /print/. Керниган отмечает, что синтаксис регулярных выражений в ed несколько отличался от привычных современным пользователям подстановочных знаков командной строки (wildcards), где звездочка означает «что угодно». Это был более гибкий и сложный механизм, идеально адаптированный для задач текстового редактирования. Поиск по шаблону позволял мгновенно находить нужные строки в тексте, однако архитектурное ограничение ed оставалось неизменным — редактор мог работать с файлом только в том случае, если тот полностью помещался в оперативную память компьютера.

📜 Федералистские бумаги и загадка автора Публиуса 5:57

Проблема ограниченной памяти проявилась, когда коллега Кернигана Ли Макмэхон решил заняться текстовым анализом в рамках того, что сегодня называют обработкой естественного языка (NLP). Объемом его исследования стали знаменитые «Записки Федералиста» (The Federalist Papers) — серия из 85 политических эссе, опубликованных в 1787–1788 годах Александром Гамильтоном, Джеймсом Мэдисоном и Джоном Джеем под общим псевдонимом Публиус.

Историческая наука долго пыталась установить точное авторство некоторых из этих документов. Ли Макмэхон планировал применить собственные методы текстового анализа для раскрытия этой тайны, однако столкнулся с техническим барьером. Суммарный объем 85 документов составлял чуть более одного мегабайта. Брайан Керниган шутит, что по нынешним меркам это «цифровой шум», но для PDP-11 такой объем данных был гигантским — файлы попросту не помещались в память текстового редактора ed.

⚡ Рождение grep за одну ночь 7:18

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

Программа последовательно сканировала файлы и выводила строки, соответствующие заданному регулярному выражению. Как объясняет Керниган, секрет названия утилиты кроется в синтаксисе команд редактора ed. В арсенале ed была глобальная команда g (global), которая выполняла действие над всеми строками файла, содержащими определенный шаблон. Полная запись операции поиска и вывода выглядела так:

g/re/p

Где g означает глобальный поиск, re — регулярное выражение (regular expression), а p — команду печати (print). Томпсон взял логику этой команды, вырезал её из общего кода редактора ed, превратил в самостоятельный инструмент и дал ему имя, ставшее легендарным. По мнению Кернигана, в этом и заключается гениальность Томпсона — способность мгновенно создать изящную и полезную программу, используя уже готовые наработки.

🎓 Студенческий эксперимент в Принстоне 8:48

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

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

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

💬 Цитаты

«У них было одно серьезное преимущество: никто из них не был Кеном Томпсоном.»

Брайан Керниган 09:41

«В каком-то смысле это гениальность Кена Томпсона — прекрасная программа, написанная в кратчайшие сроки.»

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