Из истории технологий: откуда взялся Unix

в 8:05, , рубрики: BASIC, Bell Labs, linux, multics, timeweb_статьи_перевод, UNIX, Кен Томпсон, код, ОС, Программирование

Сегодня многие полагают, что «Unix» и «Linux» — это одно и то же. Но по состоянию на 2024 год с большинством дистрибутивов, которые мы причисляем к «Unix» и «Linux» ситуация почти так и обстоит.

Но у Unix долгая история. Если у вас в распоряжении только известные сейчас системы Linux, то сложно размышлять о том «какова была ситуация на заре Unix», поскольку так много с тех пор изменилось.

❯ От прототипа до Unix

Сделаем шаг назад и рассмотрим, с чего начинался Unix. В 1969 году Кен Томпсон, сотрудник-исследователь из лаборатории «Bell Labs» экспериментировал в области проектирования операционных систем.

Тогда в Bell Labs имелся PDP-7, компьютер с интересной периферией: у него был очень быстрый (по тем временам) дисковый накопитель. Томпсон заинтересовался, на какую максимальную пропускную способность может выйти этот дисковод при обработке данных, поэтому написал собственную программу, служившую интерфейсом для жёсткого диска. Это была серьёзная задача: в те времена всё программировали на ассемблере, а для того, чтобы создать драйвер жёсткого диска, требовалась масса низкоуровневого кода.

В какой-то момент Томпсон осознал: в этот интерфейс уже вложено столько труда, что программу практически можно считать полноценным ядром операционной системы. Он посчитал, что ещё три недели — и он доведёт ядро до ума. Неделю на создание нового редактора, неделю на работу с ассемблером и ещё неделю, чтобы написать прототип ядра. Именно с этого прототипа и начинается история операционной системы Unix.

Этот ранний прототип и заложенные в нём идеи показались интересными, и Томпсон вместе с коллегами по Bell Labs принялся его развивать. Единственный паттерн проектирования в новой системе заключался в следующем: нужно много полезных инструментов, каждый из которых сфокусирован на решении ровно одной задачи. Брайан Керниган, ещё один исследователь из Bell Labs, предложил назвать новую систему «Unix» — как бы в противовес операционной системе «Multics», которой компания Bell Labs также занималась несколькими годами ранее. Но проект «Multics» не удался из-за того, что та операционная система получалась чрезмерно сложной.

❯ Ранний Unix

К ноябрю 1971 года «Bell Labs» собрала программы для новой операционной системы, и так был создан «Unix, 1-я редакция» (Unix 1st Edition). За ней последовали Unix 2nd Edition в июле 1972 года, Unix 3rd Edition в феврале 1973 года и Unix 4th Edition в ноябре 1973 года.

Эти ранние версии Unix не слишком отличались от современных систем Linux. Многие команды, на которые мы сегодня полагаемся при работе с Linux, присутствовали уже в Unix 2nd Edition. Например, команда cat для отображения файлов, команды mkdir и rmdir для управления каталогами, cpmv и rm для управления файлами, chmod и chown для управления доступом к файлам. Командами df и du можно было проверять, как используется дисковое пространство, а команды ls и chdir (подобная cd) обеспечивали навигацию по файлам. Была уже и масса других знакомых нам команд, в частности, cmp, dateechofindlnmanmount и umountsortwc и who.

Вот удобная справка по всем командам из раздела 1, взятая из мануала по Unix 4th Edition. Этот мануал был разбит на разделы, и в первом разделе рассматривались пользовательские команды общего назначения:

  1. Пользовательские команды;

  2. Системные вызовы;

  3. Процедуры для программирования;

  4. Специальные файлы;

  5. Форматы файлов;

  6. Программы, поддерживаемые пользователем;

  7. Разное;

  8. Поддержка.

Возможно, многие из этих команд вам знакомы. Большинство из них сохранились и в современных Linux-системах, но некоторые были заменены другими, которые функционально практически не отличаются от старых. Например, для архивации ранее применялась команда ar, а вы используете для архивации zip или tar.

Команда:

Что делает:

ar

Создание архивов

cat

Конкатенация файлов

chdir

Переход в другой каталог

chmod

Изменение режима

cmp

Сравнение файлов

comm

Вывод обычных строк

cp

Копирование файлов

date

Вывод даты

dc

Настольный калькулятор

du

Использование диска

echo

Вывод результатов

ed

Редактор

exit

Выход из командной оболочки

file

Вывод типа файла

goto

Команда для работы со сценариями оболочки

grep

Поиск текста

if

Команда для работы со сценариями оболочки

kill

Завершение процессов

ln

Создание ссылок

login

Вход в систему

ls

Составление списка файлов

mail

Отправка электронного сообщения

man

Страницы справки

merge

Комбинирование файлов

mesg

Разрешение сообщений или отказ от них

mkdir

Создание каталогов

mv

Перемещение файлов

nice

Работа в низкоприоритетном режиме

nohup

Выполнение команды без зависаний

nroff

Подготовка документа (замена для roff)

passwd

Установка пароля

pr

Печать файлов

ps

Статус процесса

rm

Удаление файлов

rmdir

Удаление каталогов

roff

Подготовка документа (заменена nroff)

sh

Командная оболочка

shift

Корректировка аргументов командной строки

sleep

Дождаться интервала

sort

Сортировка файла

split

Разбиение файла

stty

Установка опций TeleType

sum

Контрольная сумма

time

Сколько времени требуется на выполнение команды

tr

Транслитерация текста

troff

Обработчи кдокументов

tty

Получение имени TeleType

uniq

Удаление повторяющихся строк

wait

Ожидание, пока задача будет выполнена до конца

wc

Подсчет слов

who

Список пользователей, которые на данный момент вошли в систему

write

Отправить сообщение пользователю через строку терминала

А вот и другие команды из раздела 1, которые полезны при программировании.

Команда:

Что делает:

as

Ассемблер

bas

Программирование на BASIC

cc

Компилятор C

cdb

Отладчик C

cref

Список с перекрёстными ссылками

db

Отладчик

fc

Компилятор FORTRAN

ld

Линковщик

nm

Вывести список имён

od

Восьмеричный дамп

size

Размер объектного файла

sno

Интерпретатор SNOBOL

strip

Удалить символы

А вот команды, содержавшиеся в разделе 1 в версии Unix 4th Edition, специфичные для рабочего окружения компании Bell Labs. Если вы какие-то из них не узнаёте, то потому, что со временем от них было решено отказаться:

Команда:

Что делает:

catsim

Симуляция фотонаборного автомата в окне терминала

dsw

Интерактивное удаление

fed

Редактор официальных писем

form

Генератор официальных писем

opr

Оффлайновый вывод в Honeywell 6070

pfe

Вывод исключений при операциях над числами с плавающей точкой

plot

Построение графиков в окне терминала

proof

Сравнение текстовых файлов (подобно diff)

rew

Перемотка магнитной ленты

speak

Преобразование текста в речь

tp

Управление магнитными лентами

tss

Подключение к MH-TSS на Honeywell 6070

type

Печать файлов на TeleType как на пишущей машинке

typo

Поиск ошибок правописания

Также в ранних версиях Unix существовали и другие команды, которые сохранились до наших дней, но используются нечасто — например, ar для архивации файлов, dc — настольный калькулятор, ed для редактирования файлов и sum для вычисления контрольных сумм. В версии Unix 2nd Edition также поддерживалась одна из ранних концепций электронной почты (для работы с ней существовала команда mail) и своеобразный мессенджер: при помощи команд mesg и write можно было обмениваться сообщениями с другими пользователями через терминал.

Программисты, работавшие с ранними версиями Unix, пользовались разнообразными компиляторами и инструментами, при помощи которых было удобно создавать новые программы. Так, команда as использовалась для сборки программ, bas для программирования на BASIC, ещё были команды cc (компилятор C), db (отладчик), fc (компилятор FORTRAN), ld (линковщик), nm (список имён), od (восьмеричный дамп), strip (удаление символов) и un (нахождение неопределённых символов). Возможно, вы узнаете эти инструменты в современных системах Linux, но многие из них теперь называются иначе. Например, для компиляции программ на C применяется команда gcc.

Некоторые команды Unix со временем изменились, но их ранние версии вполне узнаваемы в Unix 2nd Edition. В оболочке sh поддерживались ранние версии меток, goto и операторов if. Возможно, вы привыкли работать в командной оболочке с Bash, так как язык Bash умеет всё это и многое другое. Программа roff использовалась для подготовки документов и представляла собой упрощённую реализацию на основе программы RUNOFF, появившейся несколькими годами ранее. Команды check и salve обеспечивали примерно такие же проверки файловой системы, как fsck, команда dsw удаляла файлы как rm -i, команда istat выдавала статус индексного дескриптора, m6 был одним из первых обработчиков макрокоманд и походил на современный m4, а tm отображала системное время и информацию о том, как долго система остаётся активна.

Другие команды из этого раннего Unix долгое время сохранялись в качестве реликтов и применялись для поддержки систем, которые сегодня уже не существуют. Например, в мануале Unix 2nd Edition описаны инструменты для коммуникации с мейнфреймом Honeywell 6070, в том числе dpd (служба для передачи данных по телефону), tss (связь с системой, работающей с разделением времени) и opr («оффлайновый» вывод файлов на печать в систему Honeywell 6070).

❯ Обработка текста

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

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

Причём, технически при этом никто не будет заниматься исследованием операционных систем.

Вот почему в версию Unix 2nd edition также вошло много инструментов для обработки документов и вывода их на печать, в том числе, nroff (новая версия roff), ov для наложения печатных страниц, pr для предпечатной подготовки и type для печати страниц на аппарате TeleType как на пишущей машинке.

Позже, когда компания приобрела фотонаборный аппарат, команда Unix переписала nroff, превратив её в troff (наборная версия roff) — эта команда вошла в Unix 4th Edition. Другие инструменты для работы с текстом также поддерживали troff. Например, инструмент eqn генерировал уравнения для научных документов и tbl для форматирования таблиц.

Другие возможности Unix, которые сегодня воспринимаются как должное, появились в более поздних версиях Unix. Характерный пример — это возможность передавать одну команду в качестве ввода для другой при помощи конвейеров. Такая функция впервые появилась в Unix 3rd Edition. При помощи конвейеров появилась возможность создавать новые программы, работавшие в качестве фильтров. Такова, например, команда grep, позволяющая сопоставлять текстовые файлы и искать в них совпадения (Unix 4th Edition) и tee для сохранения промежуточного вывода конвейеризованных команд (Unix 5th Edition). В версии Unix 7th Edition команда sh, наконец, была заменена на Bourne Shell с гораздо более разнообразными функциями.

❯ Общие корни в Unix

Мы нечасто задумываемся о происхождении команд Linux, используемых в повседневной практике. Эти команды возникли во времена, когда компьютеры были медленными, а память исчислялась килобайтами. Инструменты приходилось делать маленькими и строго специализированными.

Особенно сильно от исходного Unix до современных дистрибутивов Linux изменился разброс доступных опций командной строки. Когда компьютеры стали гораздо быстрее, и памяти стало больше, каждый инструмент стал брать на себя всё больше и больше работы. Например, команда ls из версии Unix 2nd Edition поддерживала всего пять опций: -l для вывода списка в длинном формате, -t для сортировки по времени, а не по имени, -a для перечисления всех файлов, -s для показа, каков размер каждого файла и -d для перечисления имён каталогов, а не их содержимого. Современная команда ls в GNU поддерживает как эти исходные опции, так и более пятидесяти расширений для них.

Родословная всех современных Unix-подобных систем прослеживается вплоть до исходного Unix. Linux — одна из таких систем, использующих инструментарий GNU. Набор GNU основан на инструментах Unix. В 2024 Linux уже не указывается в исходной структуре Unix, и неслучайно: теперь Linux поддерживает такие архитектуры и инструменты, о которых и мечтать было нельзя на момент зарождения Unix. Но общий принцип работы с командной строкой по-прежнему сохранился во многом таким, каким его закладывали в Unix в 1970-е. В следующий раз, когда вам доведётся при помощи ls вывести список файлов из каталога — вспомните, что вы пользуетесь инструментом, которому уже больше пятидесяти лет.

Автор: Albert_Wesker

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js