Dipende davvero dalla lingua, ovviamente. Dato che stai dando un esempio di pseudo-C, mi limiterò a come funziona nella maggior parte dei linguaggi di tipo C.
Alla fine, un programma deve essere tradotto in codice macchina, quindi dobbiamo prima parlare del codice macchina.
Iniziamo con un computer molto vecchio (immaginario, ma è l'idea) che è in grado di eseguire solo queste operazioni:
- 1: inserisci il valore inserito dall'operatore nel registro A
- 2: inserisce il valore inserito dall'operatore nel registro B
- 3: inserisci il seguente valore nel registro C
- 4: inserisci il contenuto di C in A
- 5: inserisci il contenuto di A in C
- 6: aggiungi A e B e metti il risultato nel registro A
- 7: sottrai A e B e ...
- 8: moltiplica A e B ...
- 9: divide A e B e metti il quoziente nel registro A
- 10: stampa il valore che si trova nel registro A su un pezzetto di carta
Quindi, il seguente "programma" salvato su, diciamo, una scheda perforata:
- istruzione 1: 1
- istruzione 2: 2
- istruzione 3: 6
- istruzione 4: 10
Mettere un numero in A, poi un altro in B, aggiungerli e inserire il risultato in A, quindi stamparlo su un foglio di carta. Il punto è che i computer molto vecchi non avevano alcuna possibilità di esecuzione condizionale o loop. Un programma non era altro che eseguire questo calcolo, quindi questo, poi questo e così uno. Erano poco più di una calcolatrice a cui hai dato un elenco di calcoli da eseguire.
Questo divenne presto un problema: molto spesso, vogliamo che un calcolo non venga eseguito in alcune situazioni; per esempio, se il valore corrente è 0, non voglio dividerlo con un altro numero! I computer dovevano essere migliorati, e quello era un grande e (un po ') miglioramento complicato: ora il tuo computer deve essere consapevole di dove si trova nel flusso del programma corrente e agire su di esso; solo leggere l'istruzione corrente e andare al prossimo non è sufficiente.
Ciò significa che devi aggiungere le seguenti istruzioni per andare avanti:
- 11: vai all'istruzione #n, n è il valore nella prossima "istruzione"
Molto bene, ora puoi saltare le istruzioni se necessario; per esempio, puoi saltare l'istruzione della divisione se non vuoi eseguirla. Beh, in realtà, salteremo sempre, quindi questa è una dichiarazione piuttosto inutile. Riscriviamolo in questo modo:
- 11: vai all'istruzione #n, solo se il valore in A è 0
Sì, una "istruzione if", ecco dove viene effettivamente implementata: in un'istruzione macchina. È molto basso e limitato, ma in realtà non è un problema perché puoi fare tutto ciò che vuoi con esso. È difficile da usare, ma i linguaggi di alto livello lo gestiranno per te. Nota che è davvero molto potente: puoi anche implementare dei loop (i loop sono un salto indietro piuttosto che in avanti).
Scriviamo il seguente programma: leggi due numeri, sottraili. Se il risultato non è 0, leggere un terzo numero, dividerlo per il risultato e stampare il risultato complessivo.
- istruzione 1: 1
- istruzione 2: 2
- istruzione 3: 7
- istruzione 4: 11
- istruzione 5: 7
- istruzione 6: 2
- istruzione 7: 10
Beh, è piuttosto noioso scrivere programmi in questo modo, così sono stati inventati i linguaggi di assemblaggio:
- READ-A
- READ-B
- SUB
- JMP-IF-ZERO .endif
- DIVIDE
.endif:
- Stampa
Inoltre, poiché l'assembly è noioso e soggetto a errori, abbiamo inventato linguaggi di alto livello come C. Il seguente pseudo-C programma è equivalente come sopra:
a = read();
b = read();
a = a - b;
if (a != 0) {
b = read();
a = a / b;
}
print(a);
Il modo in cui if
viene tradotto dal tuo compilatore nelle istruzioni della macchina: la condizione dopo che la parola chiave if
viene trasformata come un test il cui risultato è memorizzato in A, e il numero dell'istruzione dove saltare è determinato sulla base dove si chiude la parentesi.