I processori dei computer possono solo capire le istruzioni del loro specifico linguaggio macchina. Quindi, come hai indovinato, la maggior parte dei programmi (incluso il sistema operativo stesso) sono memorizzati in formato lingua macchina su un disco rigido o altro dispositivo di memorizzazione, o nella memoria EPROM permanente del computer. Quando è necessario, il codice del programma viene caricato in memoria e quindi può essere eseguito.
Ci sono alcuni programmi (di solito chiamati "script") che sono memorizzati nel formato del codice sorgente sul disco e quindi interpretati da un compilatore adatto quando è necessario eseguirli. Tuttavia, il codice del compilatore stesso deve essere direttamente eseguibile dal sistema, quindi deve essere nel codice macchina.
Esiste anche un incrocio tra queste due opzioni, chiamato bytecode . In questo caso, il compilatore trasforma il codice sorgente originale, leggibile dall'uomo, in un formato binario più corto e più basso che non è più leggibile dall'uomo, ma non direttamente interpretabile da un processore fisico. Quindi questo richiede un altro compilatore o interprete in un ambiente speciale per eseguirlo su un dispositivo fisico. Questo ambiente speciale è chiamato macchina virtuale . Ecco come funziona Java o C #, per esempio.
Il vantaggio di questo rispetto alla compilazione diretta sul codice macchina è che il codice macchina è specifico per una famiglia di processori, quindi può essere eseguito solo su computer con il giusto tipo di processori al loro interno. Mentre il bytecode può essere indipendente da una specifica architettura del processore o dal linguaggio della macchina, quindi è eseguibile su molti diversi tipi di computer, utilizzando la variante della macchina virtuale specifica per quel tipo di computer.
E il vantaggio rispetto agli script interpretati è che il bytecode è molto più conciso e standardizzato, quindi compilarlo ulteriormente rispetto al codice macchina è più semplice e molto più rapido dell'interpretazione degli script. Inoltre, il compilatore bytecode può già verificare la correttezza del codice in modo significativo prima di distribuirlo su una macchina fisica per eseguirlo.
Se vuoi capire meglio come i computer sono costruiti da zero, consiglio il libro CODE di Charles Petzold.