Call stack: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
m Annullate le modifiche di Domenique43 (discussione), riportata alla versione precedente di Gac
Etichetta: Rollback
m fix wl
Riga 2:
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 ''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''' , oppure, quando non vi è possibilità di confusione, semplicemente '''stack'''.
 
L'insieme delle informazioni specifiche di una subroutine all'interno di un ''call stack'' è detto ''frame''.
Riga 10:
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 [[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 (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").
Riga 25:
* ''stack di valutazione'' - Gli [[operandi]] per operazioni aritmetiche e logiche sono spesso inseriti nel [[registro (informatica)|registro]] e utilizzati là. Comunque, in alcune situazioni gli operandi possono essere accatastati ad una profondità arbitraria, il che significa che deve essere usato qualcosa di più del registro. Lo stack di questi operandi, similmente ai calcolatori di tipo RPN, è chiamato stack di valutazione (evaluation stack) e può occupare spazio nel call stack.
* ''puntatore dell'istanza corrente'' - Alcuni linguaggi orientati agli oggetti (come [[C++]]), immagazzinano questo puntatore come argomento delle funzioni nel call stack quando invocano un metodo. Questo puntatore punta all'istanza dell'oggetto a cui è associato il metodo invocato. È una parte essenziale del contesto di esecuzione di linguaggi orientati agli oggetti, poiché fornisce accesso ai dati posseduti dall'oggetto corrente. Questo puntatore è collegato a livelli utilizzati nella programmazione orientata agli oggetti con livelli (tipi di strutture stack) della run-time call stack.
* ''Ambiente dei contenitori di subroutine'' - Alcuni linguaggi di programmazione (come [[Pascal (programmazione)|Pascal]] e [[Ada (linguaggio di programmazione)|Ada]]) supportano [[FunzioniAnnidamento annidate(informatica)|subroutine annidate]], permettendo ad una routine interna di accedere al contesto della sua routine contenitore, cioè ai parametri e alle variabili locali nell'ambiente della routine esterna. Tali lingue generalmente permettono alle routine di effettuare chiamate ricorsive (la funzione richiama se stessa), ottenendo multiple call stacks per le chiamate di routine delle routine interne, ciascuna delle quali punta sullo stesso ambiente della routine esterna. Questo tipo di call frame è anche conosciuto come ''display''.
 
== Voci correlate ==