Call stack: differenze tra le versioni
Contenuto cancellato Contenuto aggiunto
Gac (discussione | contributi) meglio Etichetta: Ripristino manuale |
m Sostituito l'immagine relativa all'esempio di una call stack con la relativa versione SVG nell'introduzione |
||
(5 versioni intermedie di 5 utenti non mostrate) | |||
Riga 1:
{{F|programmazione|febbraio 2013}}
In [[informatica]], un '''''call stack''''' (traducibile letteralmente dall'[[Lingua inglese|inglese]] come "pila delle chiamate") è una zona di memoria di un programma, organizzata in forma di [[Pila (informatica)|stack]], nella quale sono immagazzinate le informazioni sulle ''[[subroutine]]'' attive in un dato momento (le ''subroutine'' attive sono quelle che sono state invocate ma la cui esecuzione non è terminata). Può essere tradotto come
Questo tipo di pila è spesso chiamato anche '''execution stack''', '''control stack''', '''function stack''', o '''run-time stack'''
L'insieme delle informazioni specifiche di una ''subroutine'' all'interno di un ''call stack'' è detto ''frame''.
== Funzionamento ==
Il motivo per cui è necessario adottare un ''call stack'' è tenere traccia dei punti in cui ogni ''subroutine'' attiva dovrebbe restituire il controllo quando termina l'esecuzione. Se, per esempio, una ''subroutine'' <code>DrawSquare</code> (disegna un quadrato) chiama la ''subroutine'' <code>DrawLine</code> (disegna una linea) da quattro diversi punti, il codice di <code>DrawLine</code> deve poter conoscere a quale punto tornare terminata l'esecuzione. Questo compito è svolto tipicamente dal codice per ogni chiamata all'interno di <code>DrawSquare</code> inserendo l'indirizzo dell'[[istruzione]] dopo una particolare dichiarazione di chiamata (
▲[[File:Call stack layout.png|thumb|Esempio]]
▲Il motivo per cui è necessario adottare un ''call stack'' è 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
C'è solitamente solo un ''call stack'' associato con un [[programma (informatica)|programma]] in esecuzione (o più precisamente con ogni [[task]] o [[thread (informatica)|thread]] di un processo), tuttavia stack aggiuntivi possono essere creati per gestire [[segnale (informatica)|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 al [[programmatore]]. Quest'ultimo ha accesso solo alla lista delle funzioni e non alla memoria occupata dallo stack, né alla struttura interna adottata. 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 ==
Lo scopo primario del ''call stack'' è:
*
Un ''call stack'' può avere scopi aggiuntivi, dipendenti dal linguaggio, dal sistema operativo e dall'ambiente della macchina. Tra questi:
*
*
*
*
*
== Voci correlate ==
|