Movatterモバイル変換


[0]ホーム

URL:


Vai al contenuto
WikipediaL'enciclopedia libera
Ricerca

Call stack

Da Wikipedia, l'enciclopedia libera.
Niente fonti!
Questa voce o sezione sull'argomento programmazionenon cita le fonti necessarie o quelle presenti sono insufficienti.
Esempio

Ininformatica, uncall stack (traducibile letteralmente dall'inglese come "pila delle chiamate") è una zona di memoria di un programma, organizzata in forma distack, nella quale sono immagazzinate le informazioni sullesubroutine attive in un dato momento (lesubroutine 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 disubroutine coinvolto.

Questo tipo di pila è spesso chiamato ancheexecution stack,control stack,function stack, orun-time stack, oppure, quando non vi è possibilità di confusione, semplicementestack.

L'insieme delle informazioni specifiche di unasubroutine all'interno di uncall stack è dettoframe.

Funzionamento

[modifica |modifica wikitesto]

Il motivo per cui è necessario adottare uncall stack è tenere traccia dei punti in cui ognisubroutine attiva dovrebbe restituire il controllo quando termina l'esecuzione. Se, per esempio, unasubroutineDrawSquare (disegna un quadrato) chiama lasubroutineDrawLine (disegna una linea) da quattro diversi punti, il codice diDrawLine deve poter conoscere a quale punto tornare terminata l'esecuzione. Questo compito è svolto tipicamente dal codice per ogni chiamata all'interno diDrawSquare inserendo l'indirizzo dell'istruzione dopo una particolare dichiarazione di chiamata (return address o indirizzo di ritorno) all'interno delcall stack.

Poiché ilcall stack è organizzato come una pila, lafunzione chiamante mette l'indirizzo di ritorno sopra la pila e lasubroutine chiamata, quando termina, toglie l'indirizzo di ritorno dalla pila e trasferisce il controllo a quell'indirizzo. Se unasubroutine chiamata chiama un'altrasubroutine, essa metterà l'indirizzo di ritorno sopra lacall stack e così via le informazioni vengono accatastate e rimosse come previsto dalprogramma. Se viene usato tutto lo spazio a disposizione delcall stack, si verifica un errore chiamatostack overflow. Aggiungere unasubroutine nelcall stack è definitowinding; toglierla è definitounwinding.

C'è solitamente solo uncall stack associato con unprogramma in esecuzione (o più precisamente con ognitask othread di un processo), tuttavia stack aggiuntivi possono essere creati per gestiresegnali o per ilmultitasking cooperativo. Poiché ne esiste uno solo in questo importante contesto, ci si riferisce semplicemente allo stack (implicitamente "del task").

Neilinguaggi di programmazione di alto livello, le specifiche delcall stack sono nascoste alprogrammatore. Quest'ultimo ha accesso solo alla lista delle funzioni e non alla memoria occupata dallo stack, né alla struttura interna adottata. Molti linguaggiassembly d'altra parte, richiedono ai programmatori di essere coinvolti nella gestione dello stack. I dettagli dello stack in un linguaggio di programmazione dipendono anche dalcompilatore, dal sistema operativo e dalle istruzioni disponibili.

Scopi del call stack

[modifica |modifica wikitesto]

Lo scopo primario delcall stack è:

  • immagazzinare gli indirizzi di ritorno - Quando unasubroutine 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 lesubroutine possono essere "rientranti" e quindi possono essere attive simultaneamente per task diversi che fanno cose diverse. Un altro vantaggio è che laricorsione è 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.

Uncall stack può avere scopi aggiuntivi, dipendenti dal linguaggio, dal sistema operativo e dall'ambiente della macchina. Tra questi:

  • immagazzinare dati locali - Unasubroutine frequentemente necessita di spazio di memoria per registrare i valori delle variabili locali, le variabili usate solo nellasubroutine attiva e che non devono trattenere valori dopo il ritorno (alla funzione chiamante). È spesso conveniente per allocare spazio per questo uso spostarsi semplicemente in cima allo stack in modo sufficiente ad avere lo spazio. È molto veloce paragonato, ad esempio, con l'allocazione di tipoheap. Ogni diversa attivazione di unasubroutine ha il proprio spazio separato nello stack per i dati locali.
  • passaggio di parametri - Lesubroutine spesso richiedono che i valori dei parametri siano forniti dal codice che le chiama e non è raro che lo spazio per questi parametri possa essere nelcall stack. Generalmente se ci sono solo pochi piccoli parametri, i registri delprocessore, possono essere usati per il passaggio dei valori, ma se ci sono più parametri da gestire in questo modo, è necessario spazio in memoria. Ilcall stack lavora meglio come posto per questi parametri, specialmente poiché ogni chiamata dellasubroutine, che avrà diversi valori dei parametri, avrà uno spazio separato nelcall stack per questi valori.
  • stack di valutazione - Glioperandi per operazioni aritmetiche e logiche sono spesso inseriti nelregistro e utilizzati là. Comunque, in alcune situazioni gli operandi possono essere accatastati a una profondità arbitraria, il che significa che deve essere usato qualcosa di più del registro. Lo stack di questi operandi, similmente ai calcolatori di tipoRPN, è chiamato stack di valutazione (evaluation stack) e può occupare spazio nelcall stack.
  • puntatore dell'istanza corrente - Alcuni linguaggi orientati agli oggetti (comeC++), immagazzinano questo puntatore come argomento delle funzioni nelcall 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 nellaprogrammazione orientata agli oggetti con livelli (tipi di strutture stack) dellarun-timecall stack.
  • Ambiente dei contenitori disubroutine - Alcuni linguaggi di programmazione (comePascal eAda) supportanosubroutine annidate, permettendo a unaroutine interna di accedere al contesto della sua routine contenitore, cioè ai parametri e alle variabili locali nell'ambiente dellaroutine esterna. Tali lingue generalmente permettono alleroutine di effettuare chiamate ricorsive (la funzione richiama se stessa), ottenendo multiplecall stack per le chiamate diroutine delleroutine interne, ciascuna delle quali punta sullo stesso ambiente dellaroutine esterna. Questo tipo dicall frame è anche conosciuto comedisplay.

Voci correlate

[modifica |modifica wikitesto]
  Portale Informatica: accedi alle voci di Wikipedia che trattano di informatica
Estratto da "https://it.wikipedia.org/w/index.php?title=Call_stack&oldid=141263586"
Categoria:
Categorie nascoste:

[8]ページ先頭

©2009-2025 Movatter.jp