Call stack: differenze tra le versioni
Contenuto cancellato Contenuto aggiunto
→Scopi del call stack: correzione link heap |
m wikilink |
||
Riga 4:
Una call stack può essere usata per molti scopi, ma la ragione principale per usarla è tenere traccia dei punti in cui ogni subroutine attiva dovrebbe restituire il controllo quando termina l'esecuzione. Se, per esempio, una subroutine DrawSquare (disegna un quadrato) chiama la subroutine DrawLine (disegna una linea) da quattro diversi punti, il codice di DrawLine deve poter conoscere a quale punto tornare terminata l'esecuzione. Questo compito è svolto tipicamente dal codice per ogni chiamata all'interno di DrawSquare inserendo l'indirizzo dell'[[istruzione]] dopo una particolare dichiarazione di chiamata ("return address" o indirizzo di ritorno) all'interno del call stack.
Poiché il call stack è organizzato come una pila, la [[Funzione (informatica)|funzione]] chiamante mette l'indirizzo di ritorno sopra la pila e la subroutine chiamata, quando termina, toglie l'indirizzo di ritorno dalla pila e trasferisce il controllo a quell'indirizzo. Se una subroutine chiamata chiama un'altra subroutine, essa metterà l'indirizzo di ritorno sopra la call stack e così via le informazioni vengono accatastate e rimosse come previsto dal [[programma (informatica)|programma]]. Se viene usato tutto lo spazio a disposizione del call stack, si verifica un errore chiamato [[stack overflow]]. Aggiungere una subroutine nel call stack è definito [[winding]]; toglierla è definito unwinding.
C'è solitamente solo un call stack associato con un [[programma (informatica)|programma]] in esecuzione (o più precisamente con ogni [[task]] o [[thread]] di un processo), tuttavia stack aggiuntivi possono essere creati per gestire [[segnale|segnali]] o per il [[multitasking]] cooperativo. Poiché ne esiste uno solo in questo importante contesto, ci si riferisce semplicemente allo stack (implicitamente "del task").
Nei [[linguaggio di programmazione|linguaggi di programmazione]] di alto livello, le specifiche del call stack sono nascoste solitamente dal [[programmatore]]. Egli fornisce accesso solo alla lista delle funzioni e non alla memoria dello stack stesso. Molti linguaggi [[Assembly]] d'altra parte, richiedono ai programmatori di essere coinvolti nella gestione dello stack. I dettagli dello stack in un linguaggio di programmazione dipendono anche dal compilatore, dal sistema operativo e dalle istruzioni disponibili.
== Scopi del call stack ==
|