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