Call stack: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
Nessun oggetto della modifica
Riga 1:
In [[informatica]], un '''call stack''' (dall'ingleseè ''pilauna zona di chiamate'')memoria èdi unoun programma, organizzata in forma di [[stack]], (ovveronella unaquale speciesono diimmagazzinate pila) che immagazzinale informazioni sulle [[subroutine]] attive delin [[computer]]un dato momento (le subroutine attive sono quelle che sono state chiamateinvocate ma la cui esecuzione non è terminata). Può essere tradotto come ''stack delle invocazioni a funzione'' (o ''chiamate a funzione'') o ''stack delle invocazioni a metodo'' (o ''chiamate a metodo'') a seconda del tipo di subroutine coinvolto.
 
Questo tipo di pila è spesso chiamato anche '''execution stack''', '''control stack''', '''function stack''', o '''run-time stack''' , eoppure, spessoquando non vi è possibilità di confusione, semplicemente "'''stack"'''.
 
L'insieme delle informazioni specifiche di una subroutine all'interno di un ''call stack'' è detto ''frame''.
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.
 
UnaIl call stack può essere usatamotivo per molticui scopi,è manecessario laadottare ragioneun principale''call per usarlastack'' è 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.
Riga 9 ⟶ 11:
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 dalal [[programmatore]]. EgliQuest'ultimo fornisceha accesso solo alla lista delle funzioni e non alla memoria dellooccupata dallo stack, né alla struttura interna stessoadottata. Molti linguaggi [[Assemblyassembly]] 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 ==