Come vengono eseguite le righe di codice dalla CPU?

10

Sto cercando di capire veramente come esattamente un linguaggio di alto livello viene convertito in codice macchina e poi eseguito dalla CPU.

Capisco che il codice sia compilato in codice macchina, che è il codice di basso livello che può essere utilizzato da una CPU. Se ho una dichiarazione di incarico, dì:

x = x + 5;
y = x - 3;

La CPU esegue ciascuna riga una alla volta? Quindi per prima cosa eseguirà x = x + 5; istruzione e quindi l'istruzione successiva che la CPU eseguirà è y = x- 3; Sto davvero cercando di capire il processo di esecuzione e come il codice che scrivo sia effettivamente eseguito dalla CPU.

    
posta Frankie 05.01.2012 - 17:43
fonte

4 risposte

12

Le righe di codice non hanno nulla a che fare con il modo in cui la CPU la esegue. Consiglierei di leggere sull'assemblatore, perché questo ti insegnerà molto su come l'hardware fa effettivamente le cose. Puoi anche ottenere l'output assembler da molti compilatori.

Questo codice potrebbe essere compilato in qualcosa di simile (in un linguaggio assemblato):

load R1, [x] ; meaning load the data stored at memory location x into register 1
add R1, 5
store [x], R1 ; store the modified value into the memory location x
sub R1, 3
store R1, [y]

Tuttavia, se il compilatore sa che una variabile non viene utilizzata di nuovo, l'operazione di memorizzazione potrebbe non essere emessa.

Ora che il debugger è in grado di sapere quale codice macchina corrisponde a una linea di origine del programma, le annotazioni vengono aggiunte dal compilatore per mostrare quale riga corrisponde a dove nel codice macchina.

    
risposta data 05.01.2012 - 18:04
fonte
2

Dipende.

Nei primi tempi di macchine veramente semplici, sì, il codice eseguiva una riga alla volta. Man mano che le macchine diventavano più grandi, più veloci e più complesse, si iniziava a vedere sia la capacità di eseguire più istruzioni contemporaneamente, sia la lettura e la scrittura della memoria richiedendo molto più tempo rispetto alle operazioni sui registri.

L'ottimizzazione dei compilatori ha dovuto tener conto di ciò e le linee fornite potrebbero essere eseguite "più o meno" in parallelo, con una parte del processore che lavora sul calcolo di y, mentre un'altra parte stava memorizzando il calcolo precedentemente calcolato nuovo valore di x (e il calcolo di y stava usando quel nuovo valore dal registro).

Control Data 6600 è stata la prima macchina che conosco che abbia fatto questo genere di cose. L'aggiunta di interi ha richiesto 300 nsec, il riferimento di memoria (lettura o scrittura) ha impiegato 1000 nsec, moltiplica e divide ha richiesto molto più tempo. Fino a circa dieci istruzioni potrebbero essere eseguite in parallelo, a seconda delle unità funzionali richieste. I compilatori FORTRAN CDC 6600 erano MOLTO bravi a pianificare tutto questo.

    
risposta data 05.01.2012 - 18:03
fonte
1

No, non esiste un mapping one-to-one tra le code line / istruzioni nei linguaggi di livello superiore e inferiore. In effetti, entrambe le righe sopra sono tradotte in più istruzioni codice macchina , come

  1. carica un valore da un determinato indirizzo di memoria in un registro
  2. modifica il valore
  3. riscrivilo in memoria

I dettagli reali di queste istruzioni variano tra piattaforme.

Questa è la visione di base delle cose. Tuttavia, per complicare ulteriormente i problemi, le moderne CPU applicano tecniche come pipeline di esecuzione , out-of-order execution e più core , tra gli altri. Ciò comporta che la CPU fa più cose contemporaneamente, ad es. le pipeline elaborano fasi diverse delle istruzioni successive in parallelo all'interno della stessa unità di elaborazione, mentre i nuclei multipli possono elaborare istruzioni indipendenti in parallelo.

    
risposta data 05.01.2012 - 17:54
fonte
0

Dovresti dare un'occhiata a grandi dettagli in un libro per trovare maggiori dettagli su come funziona, possibilmente anche una classe di compilazione.

Fondamentalmente, la tua domanda si concentra su 2 diversi aspetti.

1) Come viene tradotto il codice nel codice macchina?

2) Quando / come viene calcolato il codice usando la parallelizzazione?

La risposta a 1) dipende dalla lingua che usi (anche se il tuo esempio è banale, quindi l'output sarebbe lo stesso). Il modo in cui il compilatore esegue la traduzione su codice macchina è uno dei punti di forza del linguaggio. Inoltre, ci sono diverse preoccupazioni che devono essere prese in considerazione nel tuo esempio, il codice dovrebbe caricare i dati in memoria, memorizzarli, ecc.

Infine la parallelizzazione è una funzionalità che è possibile forzare da un punto di vista della programmazione, ma in poche parole, alcuni processori potrebbero provare a pensare che parte del codice possa essere eseguita contemporaneamente, perché sono indipendenti. Nel tuo caso, chiaramente, non è il caso, in quanto è necessario eseguire le istruzioni in modo sequenziale, quindi no, non verrà eseguito contemporaneamente.

    
risposta data 05.01.2012 - 17:57
fonte

Leggi altre domande sui tag