hyperion/10-linux/90-history/history.md
2025-11-22 17:48:07 +03:00

8 KiB
Raw Permalink Blame History

Как компилировались самые первые ядра операционных систем

Ключевой момент: До Linux было множество операционных систем, и все они встали перед одной и той же проблемой bootstrap.


Цепочка: От машинного кода до Multics и Unix

Самое начало (1940s-1950s): Машинный код вручную

Первые компьютеры (ENIAC, EDSAC) не программировались в привычном смысле. Они либо перепроводились вручную (ENIAC), либо использовались прямые переключатели и перфокарты. Программы писались в чистом машинном коде в двоичной или шестнадцатеричной форме, и люди вручную рассчитывали адреса ветвлений.reddit+1

Это был настоящий ад: один из программистов того времени вспоминал, как писал монитор для ROM, записывая hex-коды вручную в тетрадь.reddit

1950s: Ассемблеры и первые компиляторы

Затем появились ассемблеры — программы, которые переводят мнемоничные инструкции (MOVE, ADD) в машинный код. Первые ассемблеры были написаны вручную в машинном коде.reddit

После этого, примерно в начале 1950-х, пришли первые компиляторы высокого уровня. Они тоже были написаны в ассемблере, который уже существовал.reddit

Multics (1964-1969): Первая сложная ОС на высокоуровневом языке

Bell Labs, MIT и General Electric разрабатывали Multics для GE-645 mainframe. Это была революционная система — она была написана на PL/I (высокоуровневом языке). Multics показала, что операционные системы можно писать не только на ассемблере.wikipedia+1

Однако Multics стала настолько сложной и дорогой, что Bell Labs вышла из проекта в 1969 году.

Unix (1969-1970): Bootstrapping на PDP-7 и PDP-11

Когда Ken Thompson начинал писать Unix, он столкнулся с классической bootstrap-проблемой. Вот как это выглядело:tuhs

  1. Сначала макросы: Thompson не писал на самом PDP-7, а использовал GEMAP ассемблер на машине GE-635. Он писал макросы для этого ассемблера, которые потом постпроцессор переводил в бумажную ленту, читаемую PDP-7. Эти ленты физически переносились на PDP-7 для тестирования.tuhs

  2. Простой kernel + инструменты: Thompson вручную написал на ассемблере примитивный Unix kernel, редактор, ассемблер и простую shell. Всё это — на ассемблере PDP-7.tuhs

  3. Self-hosting на PDP-11: Когда Bell Labs получили PDP-11, Thompson перекодировал Unix kernel и базовые команды в PDP-11 assembly. Только тогда система смогла компилировать саму себя на своей же машине.tuhs

  4. Переход на C (1973): К 1973 году Dennis Ritchie и Ken Thompson переписали большую часть Unix kernel на C — язык, который они сами разработали. Это была революция: ядро операционной системы на высокоуровневом языке, вопреки общему убеждению, что это невозможно.startertutorials+2


Общий паттерн bootstrap

Все первые операционные системы проходили через этот цикл:

Уровень Способ компиляции
Машинный код Люди вручную в двоичной/hex форме, перфокарты, переключатели
Ассемблеры Написаны вручную в машинном коде
Первые компиляторы высокого уровня Написаны на ассемблере
Операционные системы Написаны на ассемблере (или на высокоуровневом языке после C)
Self-hosting Система компилирует саму себя

Почему Unix смог перейти на C, а Multics — нет

Multics, будучи огромной системой на mainframe-е, была слишком сложна для переписывания. Unix был сознательно сделан маленьким и простым, что позволило Thompson и Ritchie переписать его на C за одно лето (1973). Это сделало Unix портируемым на любую машину, у которой была C-компилятор.wikipedia+1

Это было ключевой причиной успеха Unix — он был написан на языке, а не на железе.

  1. https://www.reddit.com/r/learnprogramming/comments/181gtei/if_programming_requires_a_compiler_how_was_the/
  2. https://en.wikipedia.org/wiki/Booting
  3. https://en.wikipedia.org/wiki/History_of_Unix
  4. https://en.wikipedia.org/wiki/Multics
  5. https://www.tuhs.org/Mirror/Hauben/unix-Part_I.html
  6. https://www.startertutorials.com/blog/history-of-unix.html
  7. https://users.dimi.uniud.it/~antonio.dangelo/LabOS/2007/lessons/helper/history/earlyunix.html
  8. http://amits-notes.readthedocs.io/en/latest/study/taoup/taoup-ch2-history.html
  9. https://www.reddit.com/r/askscience/comments/4gjvt4/how_were_the_very_first_computer/
  10. https://www.redhat.com/en/blog/unix-linux-history