73 lines
No EOL
8 KiB
Markdown
73 lines
No EOL
8 KiB
Markdown
|
||
|
||
## Как компилировались самые первые ядра операционных систем
|
||
|
||
**Ключевой момент:** До Linux было множество операционных систем, и все они встали перед одной и той же проблемой bootstrap.
|
||
|
||
---
|
||
|
||
## Цепочка: От машинного кода до Multics и Unix
|
||
|
||
## Самое начало (1940s-1950s): Машинный код вручную
|
||
|
||
Первые компьютеры (ENIAC, EDSAC) **не программировались в привычном смысле**. Они либо перепроводились вручную (ENIAC), либо использовались прямые переключатели и перфокарты. Программы писались в **чистом машинном коде в двоичной или шестнадцатеричной форме**, и люди вручную рассчитывали адреса ветвлений.[reddit+1](https://www.reddit.com/r/learnprogramming/comments/181gtei/if_programming_requires_a_compiler_how_was_the/)
|
||
|
||
Это был настоящий ад: один из программистов того времени вспоминал, как писал монитор для ROM, записывая **hex-коды вручную в тетрадь**.[reddit](https://www.reddit.com/r/learnprogramming/comments/181gtei/if_programming_requires_a_compiler_how_was_the/)
|
||
|
||
## 1950s: Ассемблеры и первые компиляторы
|
||
|
||
Затем появились **ассемблеры** — программы, которые переводят мнемоничные инструкции (MOVE, ADD) в машинный код. Первые ассемблеры были написаны **вручную в машинном коде**.[reddit](https://www.reddit.com/r/learnprogramming/comments/181gtei/if_programming_requires_a_compiler_how_was_the/)
|
||
|
||
После этого, примерно в начале 1950-х, пришли первые компиляторы высокого уровня. Они тоже были написаны в ассемблере, который уже существовал.[reddit](https://www.reddit.com/r/learnprogramming/comments/181gtei/if_programming_requires_a_compiler_how_was_the/)
|
||
|
||
## Multics (1964-1969): Первая сложная ОС на высокоуровневом языке
|
||
|
||
Bell Labs, MIT и General Electric разрабатывали **Multics** для GE-645 mainframe. Это была революционная система — она была написана на **PL/I** (высокоуровневом языке). Multics показала, что операционные системы можно писать не только на ассемблере.[wikipedia+1](https://en.wikipedia.org/wiki/History_of_Unix)
|
||
|
||
Однако Multics стала настолько сложной и дорогой, что Bell Labs вышла из проекта в 1969 году.
|
||
|
||
## Unix (1969-1970): Bootstrapping на PDP-7 и PDP-11
|
||
|
||
Когда Ken Thompson начинал писать Unix, он столкнулся с классической bootstrap-проблемой. Вот как это выглядело:[tuhs](https://www.tuhs.org/Mirror/Hauben/unix-Part_I.html)
|
||
|
||
1. **Сначала макросы**: Thompson **не писал на самом PDP-7**, а использовал **GEMAP ассемблер на машине GE-635**. Он писал макросы для этого ассемблера, которые потом постпроцессор переводил в **бумажную ленту**, читаемую PDP-7. Эти ленты физически переносились на PDP-7 для тестирования.[tuhs](https://www.tuhs.org/Mirror/Hauben/unix-Part_I.html)
|
||
|
||
2. **Простой kernel + инструменты**: Thompson вручную написал на ассемблере **примитивный Unix kernel, редактор, ассемблер и простую shell**. Всё это — на ассемблере PDP-7.[tuhs](https://www.tuhs.org/Mirror/Hauben/unix-Part_I.html)
|
||
|
||
3. **Self-hosting на PDP-11**: Когда Bell Labs получили PDP-11, Thompson **перекодировал Unix kernel и базовые команды в PDP-11 assembly**. Только тогда система смогла **компилировать саму себя** на своей же машине.[tuhs](https://www.tuhs.org/Mirror/Hauben/unix-Part_I.html)
|
||
|
||
4. **Переход на C (1973)**: К 1973 году Dennis Ritchie и Ken Thompson переписали **большую часть Unix kernel на C** — язык, который они сами разработали. Это была революция: **ядро операционной системы на высокоуровневом языке**, вопреки общему убеждению, что это невозможно.[startertutorials+2](https://www.startertutorials.com/blog/history-of-unix.html)
|
||
|
||
|
||
---
|
||
|
||
## Общий паттерн bootstrap
|
||
|
||
Все первые операционные системы проходили через этот цикл:
|
||
|
||
|Уровень|Способ компиляции|
|
||
|---|---|
|
||
|**Машинный код**|Люди вручную в двоичной/hex форме, перфокарты, переключатели|
|
||
|**Ассемблеры**|Написаны вручную в машинном коде|
|
||
|**Первые компиляторы высокого уровня**|Написаны на ассемблере|
|
||
|**Операционные системы**|Написаны на ассемблере (или на высокоуровневом языке после C)|
|
||
|**Self-hosting**|Система компилирует саму себя|
|
||
|
||
---
|
||
|
||
## Почему Unix смог перейти на C, а Multics — нет
|
||
|
||
Multics, будучи огромной системой на mainframe-е, была слишком сложна для переписывания. Unix был **сознательно** сделан **маленьким и простым**, что позволило Thompson и Ritchie переписать его на C за одно лето (1973). Это сделало Unix **портируемым** на любую машину, у которой была C-компилятор.[wikipedia+1](https://en.wikipedia.org/wiki/History_of_Unix)
|
||
|
||
Это было ключевой причиной успеха Unix — он был написан на языке, а не на железе.
|
||
|
||
1. [https://www.reddit.com/r/learnprogramming/comments/181gtei/if_programming_requires_a_compiler_how_was_the/](https://www.reddit.com/r/learnprogramming/comments/181gtei/if_programming_requires_a_compiler_how_was_the/)
|
||
2. [https://en.wikipedia.org/wiki/Booting](https://en.wikipedia.org/wiki/Booting)
|
||
3. [https://en.wikipedia.org/wiki/History_of_Unix](https://en.wikipedia.org/wiki/History_of_Unix)
|
||
4. [https://en.wikipedia.org/wiki/Multics](https://en.wikipedia.org/wiki/Multics)
|
||
5. [https://www.tuhs.org/Mirror/Hauben/unix-Part_I.html](https://www.tuhs.org/Mirror/Hauben/unix-Part_I.html)
|
||
6. [https://www.startertutorials.com/blog/history-of-unix.html](https://www.startertutorials.com/blog/history-of-unix.html)
|
||
7. [https://users.dimi.uniud.it/~antonio.dangelo/LabOS/2007/lessons/helper/history/earlyunix.html](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](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/](https://www.reddit.com/r/askscience/comments/4gjvt4/how_were_the_very_first_computer/)
|
||
10. [https://www.redhat.com/en/blog/unix-linux-history](https://www.redhat.com/en/blog/unix-linux-history) |