Ich werde Ihre Frage wörtlich nehmen und hauptsächlich auf Mikroprozessoren eingehen, nicht auf Computer im Allgemeinen.
Alle Computer haben eine Art Maschinencode. Eine Anweisung besteht aus einem Opcode und einem oder mehreren Operanden. Beispielsweise wurde der ADD-Befehl für den Intel 4004 (den allerersten Mikroprozessor) als 1000RRRR codiert, wobei 1000 der Operationscode für ADD ist und RRRR eine Registernummer darstellt.
Die allerersten Computerprogramme wurden von Hand geschrieben, wobei die Einsen und Nullen von Hand codiert wurden, um ein Programm in Maschinensprache zu erstellen. Dies wird dann in den Chip einprogrammiert. Die ersten Mikroprozessoren verwendeten ROM (Nur-Lese-Speicher); dies wurde später durch EPROM (Erasable Programmable ROM, das mit UV-Licht gelöscht wurde) ersetzt; Jetzt werden Programme normalerweise in ein EEPROM ( "Electrically ...- EPROM" , das auf dem Chip gelöscht werden kann) oder speziell in einen Flash-Speicher programmiert .
Die meisten Mikroprozessoren können jetzt Programme aus dem RAM ausführen (dies ist so ziemlich der Standard für alles außer Mikrocontrollern), aber es muss überhaupt eine Möglichkeit geben, das Programm in den RAM zu laden. Wie Joby Taffey in seiner Antwort betonte, handelte es sich hierbei um Kippschalter für den Altair 8080, der von einem Intel 8080 (der auf den 4004 und 8008 folgte) angetrieben wurde. In Ihrem PC befindet sich ein Stück ROM, das BIOS, das zum Starten des Computers und Laden des Betriebssystems in den Arbeitsspeicher verwendet wird.
Die Maschinensprache wird sehr schnell langweilig, daher wurden Assembler-Programme entwickelt, die eine mnemonische Assemblersprache verwenden und diese, normalerweise eine Zeile Assembler-Code pro Anweisung, in Maschinencode übersetzen. Anstelle von 10000001 würde man also ADD R1 schreiben.
Aber der allererste Assembler musste in Maschinencode geschrieben werden. Dann könnte es in seinem eigenen Assembler-Code umgeschrieben und die maschinensprachliche Version verwendet werden, um es das erste Mal zusammenzusetzen. Danach konnte sich das Programm selbst zusammenstellen. Dies wird als Bootstrapping bezeichnet und wird auch mit Compilern durchgeführt. Sie werden in der Regel zuerst in Assembler (oder einer anderen höheren Sprache) geschrieben und dann in ihrer eigenen Sprache neu geschrieben und mit dem ursprünglichen Compiler kompiliert, bis der Compiler sich selbst kompilieren kann.
Da der erste Mikroprozessor lange nach dem Bestehen von Großrechnern und Minicomputern entwickelt wurde und der 4004 ohnehin nicht für die Ausführung eines Assemblers geeignet war, hat Intel wahrscheinlich einen Cross-Assembler geschrieben, der auf einem seiner großen Computer ausgeführt und den Assembler-Code für übersetzt wurde die 4004 in ein binäres Abbild, das in die ROMs programmiert werden könnte. Auch dies ist eine übliche Technik, mit der Compiler auf eine neue Plattform portiert werden ( Cross-Compiling ).