Me tomaré tu pregunta al pie de la letra y hablaré sobre todo de microprocesadores, no de ordenadores en general.
Todos los ordenadores tienen algún tipo de código máquina. Una instrucción consta de un opcode y uno o más operandos. Por ejemplo, la instrucción ADD para el Intel 4004 (el primer microprocesador) se codificaba como 1000RRR donde 1000 es el opcode de ADD y RRRR representaba un número de registro.
Los primeros programas de ordenador se escribieron a mano, codificando a mano los 1 y los 0 para crear un programa en lenguaje de máquina. A continuación, se programaba en el chip. Los primeros microprocesadores utilizaban una memoria de sólo lectura (ROM), que posteriormente fue sustituida por EPROM (Erasable Programmable ROM, que se borraba con luz UV); ahora los programas se suelen programar en EEPROM ( "Eléctricamente...-EPROM" que puede ser borrado en el chip), o específicamente la memoria Flash.
La mayoría de los microprocesadores pueden ahora ejecutar programas desde la RAM (esto es prácticamente un estándar para todo excepto para los microcontroladores), pero tiene que haber una forma de cargar el programa en la RAM en primer lugar. Como Joby Taffey señaló en su respuesta, esto se hizo con interruptores de palanca para el Altair 8080, que fue alimentado por un Intel 8080 (que siguió al 4004 y 8008). En tu PC, hay un trozo de ROM llamado BIOS que se utiliza para arrancar el ordenador y cargar el sistema operativo en la memoria RAM.
El lenguaje de máquina se vuelve tedioso rápidamente, por lo que se desarrollaron programas ensambladores que toman un lenguaje ensamblador mnemónico y lo traducen, normalmente una línea de código ensamblador por instrucción, a código de máquina. Así, en lugar de 10000001, se escribiría ADD R1.
Pero el primer ensamblador tuvo que ser escrito en código máquina. Luego se podía reescribir en su propio código ensamblador y utilizar la versión en lenguaje máquina para ensamblarlo la primera vez. Después, el programa podía ensamblarse a sí mismo. Esto se llama el arranque y también se hace con los compiladores -- normalmente se escriben primero en ensamblador (u otro lenguaje de alto nivel), y luego se reescriben en su propio lenguaje y se compilan con el compilador original hasta que el compilador pueda compilarse a sí mismo.
Dado que el primer microprocesador se desarrolló mucho después de que existieran los mainframes y los miniordenadores, y que el 4004 no era realmente adecuado para ejecutar un ensamblador, Intel probablemente escribió un ensamblador cruzado que se ejecutaba en uno de sus grandes ordenadores, y tradujo el código en ensamblador para el 4004 en una imagen binaria que se podía programar en las ROM. Una vez más, esta es una técnica común utilizada para portar compiladores a una nueva plataforma (llamada compilación cruzada ).