Przyjmę twoje pytanie dosłownie i omówię głównie mikroprocesory, a nie ogólnie komputery.
Wszystkie komputery mają jakiś kod maszynowy. Instrukcja składa się z kodu operacji i jednego lub większej liczby operandów. Na przykład instrukcja ADD dla Intel 4004 (pierwszego mikroprocesora) została zakodowana jako 1000RRRR, gdzie 1000 to kod operacji dla ADD, a RRRR reprezentuje numer rejestru.
Pierwsze programy komputerowe zostały napisane ręcznie, ręcznie kodując jedynki i zera, aby stworzyć program w języku maszynowym. Jest to następnie programowane w chipie. Pierwsze mikroprocesory używały pamięci ROM (pamięć tylko do odczytu); zostało to później zastąpione przez EPROM (Erasable Programmable ROM, który został wymazany światłem UV); teraz programy są zwykle programowane w EEPROM ( „Electrically… - EPROM” , które można usunąć na chipie), a konkretnie w pamięci Flash.
Większość mikroprocesorów może teraz uruchamiać programy poza pamięcią RAM (jest to prawie standard dla wszystkiego oprócz mikrokontrolerów), ale przede wszystkim musi istnieć sposób na załadowanie programu do pamięci RAM. Jak zauważył Joby Taffey w swojej odpowiedzi, dokonano tego za pomocą przełączników Altair 8080, który był napędzany przez Intel 8080 (który następował po 4004 i 8008). W twoim komputerze jest trochę pamięci ROM zwanej BIOS, która służy do uruchamiania komputera i ładowania systemu operacyjnego do pamięci RAM.
Język maszynowy staje się naprawdę nudny, dlatego opracowano programy asemblera, które przyjmują mnemoniczny język asemblera i tłumaczą go, zwykle jedną linię kodu asemblera na instrukcję, na kod maszynowy. Więc zamiast 10000001 napisałby ADD R1.
Ale pierwszy asembler musiał zostać napisany w kodzie maszynowym. Następnie można go przepisać we własnym kodzie asemblera, a wersja w języku maszynowym zostanie użyta do złożenia go po raz pierwszy. Następnie program może się sam złożyć. Nazywa się to ładowaniem początkowym i odbywa się to również za pomocą kompilatorów - zwykle są one najpierw pisane w asemblerze (lub innym języku wysokiego poziomu), a następnie przepisywane w swoim własnym języku i kompilowane przy użyciu oryginalnego kompilatora, dopóki kompilator nie będzie mógł się skompilować.
Ponieważ pierwszy mikroprocesor został opracowany na długo po pojawieniu się komputerów mainframe i minikomputerów, a 4004 i tak nie nadawał się do uruchomienia asemblera, Intel prawdopodobnie napisał cross-asembler, który działał na jednym z jego dużych komputerów, i przetłumaczył kod asemblera dla 4004 w obraz binarny, który można zaprogramować w pamięci ROM. Ponownie jest to powszechna technika używana do przenoszenia kompilatorów na nową platformę (zwaną kompilacją krzyżową ).