Quando vede le parentesi, fa in modo che la macchina esegua le operazioni tra parentesi o distribuisca le parentesi?
Ad esempio, se ho la seguente riga di codice:
int i = 2 * (a + b)
si compila come questo codice:
int c = a + b
int i = 2 * c
Quando vede le parentesi, fa in modo che la macchina esegua le operazioni tra parentesi o distribuisca le parentesi?
Ad esempio, se ho la seguente riga di codice:
int i = 2 * (a + b)
si compila come questo codice:
int c = a + b
int i = 2 * c
Funziona "come-se" l'aggiunta viene eseguita per prima, seguita dalla moltiplicazione. Sotto la regola as-if, è possibile utilizzare qualsiasi numero di istruzioni della macchina che producono il risultato corretto, ed è quasi certo che un'istruzione di moltiplicazione non verrà utilizzata da alcun compilatore di ottimizzazione.
Una probabile sequenza di istruzioni della macchina per una CPU RISC regolare e ortogonale a 3 indirizzi sarebbe simile a questa:
LOAD_MEMORY &a -> register01
LOAD_MEMORY &b -> register02
INT_ADD register01, register02 -> register01
LOAD_CONSTANT 1 -> register02
BIT_SHIFT register01, register02 -> register01
STORE_MEMORY &i, register01
Inoltre, se a
è una variabile locale e il compilatore può dimostrare che non sarà accessibile dopo questo, potrebbe mettere i
e a
allo stesso indirizzo di memoria.
Per una CPU CISC con un set di istruzioni irregolari più complesso, potrebbero esserci istruzioni di spostamento che funzionano sulla memoria, prendono costanti e aggiungono istruzioni che funzionano sulla memoria, quindi assomigliano a questo:
INT_ADD_MEM &a, &b -> &i
BIT_SHIFT_MEM_CONSTANT &i, 1 -> &i
Ancora, a
e i
potrebbero avere lo stesso indirizzo, se a
è locale e inutilizzato in seguito.