В самых первых компьютерах программы писались в машинных кодах и первично вводились в память при помощи тумблеров, отвечающих за состояние каждого бита. Или же задавались напайкой соответствующих битам перемычек в постоянном запоминающем устройстве. Самые опытные программисты знали начальный загрузчик побитово наизусть и могли его ввести с тумблеров по памяти.
Конечно, достаточно тоскливо было вводить с тумблеров начальный загрузчик каждый раз при обнулении памяти, но у первых компьютеров часто были ферритовые запоминающие усстройства, не теряющие содержимое памяти при отключении питания.
Вот такой интерфейс для ввода программ был на машинах до 1960-х годов:
(кстати, это пульт системы IBM S/360 – первого компьютера, в котором придумали делить память на байты, благодаря чему видны группы по 8 тумблеров).
Потом, имея такую введённую по битам программу (начальный загрузчик), можно было с её помощью уже вводить, например, с перфоркарт другие программы на машинном языке, не манипулируя битами. В конечном итоге на машинном языке были написаны первые трансляторы с ассемблера, затем на ассемблере – первые трансляторы с языка высокого уровня. А имея транслятор с языка высокого уровня на одной машине, можно уже его дописать таким образом, чтобы он генерировал машинный код для другой машины, и на этой второй машине не повторять полностью всю цепочку.
Потом, имея такую введённую по битам программу (начальный загрузчик), можно было с её помощью уже вводить, например, с перфоркарт другие программы на машинном языке, не манипулируя битами. В конечном итоге на машинном языке были написаны первые трансляторы с ассемблера, затем на ассемблере – первые трансляторы с языка высокого уровня. А имея транслятор с языка высокого уровня на одной машине, можно уже его дописать таким образом, чтобы он генерировал машинный код для другой машины, и на этой второй машине не повторять полностью всю цепочку.Потом, имея такую введённую по битам программу (начальный загрузчик), можно было с её помощью уже вводить, например, с перфоркарт другие программы на машинном языке, не манипулируя битами. В конечном итоге на машинном языке были написаны первые трансляторы с ассемблера, затем на ассемблере – первые трансляторы с языка высокого уровня. А имея транслятор с языка высокого уровня на одной машине, можно уже его дописать таким образом, чтобы он генерировал машинный код для другой машины, и на этой второй машине не повторять полностью всю цепочку.
Сейчас, разумеется, все программы для новых компьютеров поначалу пишутся при помощи старых компьютеров.
Весь этот процессс развёртывания выполнения сложных программ при помощи многоэтапного усложения от самых простых называется bootstraping, или раскрутка.