·Денис Батранков·Обновлено

Как желание поиграть в Space Travel подарило нам UNIX и C

UNIX, C, Python, JavaScript, Perl, Lua, PHP, Erlang и Go появились не из идеальных планов, а из конкретных проблем, скуки и желания быстрее починить работающую систему.

История IT строится не на великих замыслах корпоративных комитетов. Она строится на банальной лени, скуке и желании инженеров побыстрее закрыть задачу. Идеальная архитектура существует только в презентациях. В реальности самые живучие инструменты рождаются из хаоса.

С Днём программиста! 13 сентября — тот самый 256-й день года, когда особенно уместно вспомнить: большие технологии часто начинаются с маленькой личной задачи.

Игровая зависимость C и UNIX

Кен Томпсон просто хотел играть в Space Travel. Машинное время на корпоративных мейнфреймах стоило непозволительно дорого: игра съедала примерно 75 долларов вычислительного времени на GE-635.

Механика была простой. Томпсон нашёл в углу малоиспользуемый мини-компьютер PDP-7 и вместе с Деннисом Ритчи перенёс игру туда. Заодно пришлось написать для неё файловую систему и другие части операционной системы. Эту систему позже назвали UNIX.

Первую версию UNIX писали на ассемблере. Деннис Ритчи развил язык B в C, добавив типы и другие конструкции, чтобы системный код можно было писать на более удобном языке. Потом ядро UNIX переписали на C — и получили переносимость, которой у ассемблера не было.

Последствие: игрушка на старом железе породила операционную систему и язык программирования. Сегодня C лежит под огромным куском низкоуровневой инфраструктуры — от ядра Linux до прошивок сетевого железа. Под капотом всё ещё много ручной работы с памятью.

Новогодняя скука Python

В декабре 1989 года в амстердамской лаборатории CWI было нечем заняться. Точнее, лаборатория закрылась на рождественские каникулы, а у Гвидо ван Россума появился домашний проект.

Он решил написать интерпретатор нового скриптового языка. Взял идеи из ABC, добавил расширяемость и обработку исключений, которая пришла из опыта с Amoeba и языка Modula-3. Назвал проект в честь британского скетч-шоу «Летающий цирк Монти Пайтона». Рептилии тут ни при чём.

Первую версию ван Россум начал за рождественскую неделю, а до публичного релиза доводил чуть больше года. В феврале 1991 года Python вышел в Usenet. Официальная история Python звучит менее романтично, зато точнее.

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

Десятидневный марафон JavaScript

В 1995 году браузер Netscape Navigator был в основном статичным. Маркетологам срочно понадобилось заставить кнопки нажиматься, а картинки двигаться.

Механика: Брендан Эйх получил задачу быстро добавить язык в браузер и за десять дней собрал прототип. В нём смешались синтаксис C, объекты из Self и функциональные идеи Scheme. Это был сырой прототип. Его единственная цель заключалась в том, чтобы успеть к релизу Netscape Navigator 2.0.

Последствие: наспех сшитый Франкенштейн захватил мир. Сегодня на этом языке работает весь современный веб, серверные приложения, банковские клиенты и тяжёлый энтерпрайз. Спустя тридцать лет его уже не перепишешь с нуля: слишком много страниц, библиотек и контрактов завязано на странности ранних решений.

Лингвистическая лень Perl

Ларри Уолл работал системным администратором и постоянно склеивал разрозненные инструменты для обработки текста. Писать для каждой такой задачи отдельную утилиту на C было слишком долго.

Будучи по образованию лингвистом, Уолл создал язык, который собирал идеи из C, awk, sed, оболочек Unix и других инструментов. В истории Perl это называют эклектичным наследием. Более точное слово подобрать трудно.

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

Телефонная надёжность Erlang

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

Механика: команда взяла хорошие идеи Lisp, Prolog и Parlog, выкинула лишнее и начала делать собственный язык. В 1987 году появились первые эксперименты с Erlang. Телефонная станция не может ждать, пока разработчик перезапустит весь процесс из-за одной неисправной линии.

Последствие: язык из лабораторного эксперимента вырвался в реальные проекты Ericsson. В нём отказ отдельного процесса — штатная ситуация, а не конец света. Для телефонных сетей это не философия, а должностная инструкция.

Конфигурационная луна Lua

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

Механика: для форм ввода и отчётов сделали два маленьких языка — DEL и Sol. Пользователи попросили циклы, условия и более сложные правила, поэтому языки объединили в один встраиваемый инструмент. Один из авторов предложил назвать его Lua — «луна» по-португальски, как противоположность Sol, «солнцу». Авторы подробно описали эту историю.

Последствие: язык, который начинался как средство описания данных для нефтяных симуляторов, стал лёгким встраиваемым языком для конфигурации, сценариев и расширения приложений. Никакого большого плана. Просто таблицы чисел надоели всем.

Онлайн-резюме PHP

В 1994 году Расмус Лердорф хотел считать посетителей своего онлайн-резюме. Для этого он написал несколько CGI-программ на C и назвал набор Personal Home Page Tools.

Механика: посетителям понадобились формы, базы данных и гостевые книги. Лердорф постепенно расширял набор скриптов, а в 1995 году выложил исходный код. Другие разработчики начали добавлять свои исправления и функции. Счётчик посещений перестал быть личным инструментом и превратился в язык для динамических страниц. Официальная история PHP выглядит именно так.

Последствие: огромный кусок раннего веба вырос из задачи «узнать, кто открыл мою страницу». Архитектура получилась неровной, зато интернет получил способ быстро превращать HTML в работающий сайт.

Сорокапятиминутная сборка Go

В Google инженеры жили внутри больших C++-проектов. Программа могла работать быстро, но сборка занимала десятки минут. По легенде самого проекта, идея Go родилась во время 45-минутной компиляции.

Механика: 21 сентября 2007 года Роб Пайк, Роберт Гриземер и Кен Томпсон начали рисовать на доске новый язык. Им нужны были скорость разработки, безопасность, простая сборка и конкурентность для многопроцессорных серверов. В FAQ Go причина сформулирована без романтики: существующие языки и системы сборки стали слишком сложными для больших проектов.

Последствие: язык, придуманный из раздражения на время компиляции, стал инструментом для сетевых сервисов и облачной инфраструктуры. Иногда лучший способ ускорить сборку — написать новый язык.

Инструменты, которые мы получили в итоге

  • Python работает как отличный клей для инфраструктуры. Ломается, когда проект перерастает масштаб одного кабинета.
  • JavaScript запускается на любом утюге. Заставляет инженеров годами бороться с неявным приведением типов.
  • Perl проглатывает любые объёмы текста. Превращает поддержку легаси-кода в археологические раскопки.
  • Lua встраивается почти куда угодно. Делает конфигурацию программ настоящим языком, а не лесом из JSON-файлов.
  • PHP превращает личный счётчик посещений в веб-приложение. Заодно оставляет будущим поколениям странный синтаксис.
  • Erlang переживает падение отдельных процессов. Требует привыкнуть к тому, что ошибка — часть штатной работы системы.
  • Go быстро собирается и спокойно работает с конкурентными задачами. Отнимает у программиста любимые сложные конструкции.
  • C даёт абсолютный контроль над памятью. Одно неверное движение приводит к краху всей системы.

Худшие языки проектируются годами в душных переговорках. Лучшие часто начинаются как попытка закрыть конкретную дыру в системе. Если инструмент работает прямо сейчас — он уже прав.

Новые статьи — на почту

Письмо выходит, когда выходит материал, а не по расписанию. Никакой рекламы и чужих рассылок: только мои статьи и таблицы. Отписаться можно из любого письма одной ссылкой.

Есть тема, о которой стоит написать?

Разбираю то, что реально решает задачи в кибербезопасности. Если у вас есть тема, которую хотелось бы увидеть разобранной, — напишите её, прочитаю лично.

НовееКонтроль действий ИИ-агентов: почему классические средства защиты не работаютРаньше173 приложения на одном порту: почему правило «разрешить 443» ничего не значит