Call stack: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
m evasione
Etichetta: Rollback
Domenique43 (discussione | contributi)
piccole modifiche stlistiche
Etichette: Ripristino manuale Annullato
Riga 1:
{{F|programmazione|febbraio 2013}}
In [[informatica]], unUn '''call stack''' (traducibile letteralmente dall'[[Lingua inglese|inglese]] come "pila delle chiamate", detta anche '''execution stack''', '''control stack''', '''function stack''', o '''run-time stack'''), èin [[informatica]], indica 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 12 ⟶ 10:
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'è solitamentegeneralmente 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 è:
 
* ''immagazzinare gli indirizzi di ritorno'' - Quando una subroutine viene chiamata, l'indirizzo dell'istruzione di ritorno deve essere salvato da qualche parte. Utilizzando una pila per salvare gli indirizzi di ritorno si hanno importanti vantaggi rispetto alle alternative. Uno di questi è che ogni task ha il proprio stack e pertanto le subroutine possono essere "rientranti" e quindi possono essere attive simultaneamente per task diversi che fanno cose diverse. Un altro vantaggio è che la [[ricorsione]] è automaticamente supportata. Quando una funzione chiama sé stessa ricorsivamente, un indirizzo di ritorno necessita di essere registrato per ogni attivazione della funzione così da poter essere usato per il ritorno da ogni attivazione della funzione. Questa capacità è automatica con un stack.
 
Riga 28 ⟶ 27:
 
== Voci correlate ==
* [[Allocazione dinamica della memoria]]
* [[Pila (informatica)]]
* [[Subroutine]]
* [[Allocazione dinamica della memoria]]
* [[Stack trace]]