Warning: is_file(): open_basedir restriction in effect. File(/etc/wordpress/config.ini) is not within the allowed path(s): (/var/www/vhosts/spiegato.com/:/tmp/) in /var/www/vhosts/spiegato.com/httpdocs/Spiegato.com/wp-content/mu-plugins/ionos-assistant/inc/config.php on line 213
Che cos'è una chiamata di coda? - Spiegato

Che cos’è una chiamata di coda?

Nella programmazione del computer, una chiamata in coda è una situazione specifica all’interno del codice sorgente del programma in cui una funzione, una subroutine o una procedura restituisce un valore atteso chiamando un’altra funzione invece di passare semplicemente una variabile che contiene il valore restituito. Il nome stesso indica che la funzione chiamata per calcolare il valore da restituire si trova alla fine, o coda, della funzione che la chiama per fornire un valore restituito. Una chiamata in coda è interessante per alcuni programmatori perché, con determinate ottimizzazioni o comportamenti del compilatore, non viene utilizzato spazio aggiuntivo nello stack per memorizzare le posizioni del codice della funzione principale; la funzione tail invece viene utilizzata per generare i report del valore di ritorno direttamente al punto di chiamata in cui è stata invocata la funzione originale. L’uso di una chiamata in coda è particolarmente utile in situazioni in cui viene impiegata la ricorsione, perché la quantità di spazio dello stack utilizzata per memorizzare gli indirizzi del chiamante nei casi in cui le chiamate ricorsive si annidano molto profondamente potrebbe esaurirsi rapidamente e interrompere l’esecuzione del programma. Sebbene l’utilizzo di chiamate in coda possa aiutare ad aumentare la velocità, l’utilizzo della memoria e l’efficienza in un programma, può anche portare a situazioni in cui il codice sorgente viene ristrutturato per utilizzare le chiamate in un modo che rende difficile il debug e il monitoraggio, specialmente con casi di ricorsione.

L’esistenza di una chiamata in coda è dovuta in gran parte al funzionamento dello stack di chiamate all’interno della maggior parte dei programmi per computer e delle architetture di sistema. La pila, che è come una pila di lastre, è una struttura dati first-in, last-out. Quando viene chiamata una funzione, una subroutine o una procedura, l’indirizzo da cui viene effettuata la chiamata, chiamato stack frame, viene memorizzato nello stack. Ciò significa che un programma che chiama la funzione A, che quindi chiama la funzione B, avrà due stack frame, uno per la funzione B e un altro sotto di esso per la funzione A. Al termine dell’esecuzione della funzione B, il suo stack frame viene estratto dalla parte superiore del lo stack e l’esecuzione ritornano alla funzione A, il cui frame viene rimosso dallo stack al termine, restituendo infine il controllo del programma al punto da cui è stata originariamente chiamata la prima funzione.

Quando viene utilizzata una chiamata in coda, l’istruzione return in una funzione utilizza direttamente il valore restituito di un’altra funzione come dati da inviare al codice chiamante. Nell’esempio precedente, se la funzione A chiama la funzione B direttamente con l’istruzione return, è stata formata una chiamata di coda. All’interno dello stack di chiamate, invece di avere uno stack frame per entrambe le funzioni A e B, la funzione B riceverà l’indirizzo di ritorno dalla funzione A e lo stack frame della funzione A verrà estratto ed eliminato, il che significa che la funzione B passerà il suo valore restituito direttamente indietro alla posizione che ha chiamato la funzione A senza dover prima restituire il controllo alla funzione A. Ciò aumenta la velocità delle chiamate di funzione e aiuta a contenere la quantità di informazioni nello stack.

Le proprietà di una chiamata in coda possono renderle un’opzione molto interessante per le funzioni ricorsive. Una funzione ricorsiva è una funzione che richiama se stessa ripetutamente per calcolare un valore, come può essere il caso quando si attraversa una struttura di dati di elenco. Non vengono creati stack frame aggiuntivi per le chiamate di funzione nidificate, quindi livelli di ricorsione molto profondi possono essere eseguiti in modo sicuro senza la minaccia immediata di un overflow dello stack e la possibile chiusura del programma.