As far as I know, we do not write the assemblers or compilers in machine language, so how do we add these programs to the new machine so that it can run programs in high-level language?
In effetti noi facciamo , almeno se non ci sono altre catene di sviluppo disponibili per la cross-compilation. I primi computer moderni non ne avevano uno, quindi sì, le persone hanno scritto assemblatori in linguaggio macchina, poi compilatori in linguaggio assembly e infine programmi applicativi in linguaggi di livello superiore. Google "bootstrap" per ulteriori informazioni.
Oggi, naturalmente, è molto raro che non sia disponibile una catena di sviluppo cross-compiling, dato che ci sono più kit di compilatori gratuiti o quasi gratuiti che hanno la portabilità come uno dei loro obiettivi principali. In effetti, è improbabile che mai torni ai tempi in cui le nuove macchine hanno l'opzione no per lo sviluppo incrociato di qualsiasi cosa! La catena di programmi che trasformano il programma risalgono alla storia fino all'inizio dei compilatori, proprio come tutta la vita di oggi è in definitiva discendente dalle stesse cellule eoni fa, e la sua perdita sarebbe una catastrofe simile a uccidere tutte le vite più elevate e dovendo permettere alla natura di riqualificarlo da organismi unicellulari. Ma almeno in linea di principio, sì, i compilatori devono essere implementati in modo arduo a un livello inferiore a quello con cui dovrebbero lavorare.