Lo stack di chiamate inizia in basso o in alto?

8

Uno stack è qualcosa che si accumula dal basso verso l'alto.

Quindi uno stack di chiamate aggiunge nuovi elementi nello stack quando le funzioni vengono chiamate con gli elementi rimossi dallo stack mentre ciascuna funzione termina finché lo stack non è vuoto e quindi il programma termina.

Se quanto sopra è corretto, perché le persone si riferiscono al controllo spostando "su" lo stack delle chiamate? Certamente controlla sposta in basso lo stack di chiamate fino a raggiungere il fondo.

    
posta CJ7 01.05.2012 - 09:59
fonte

4 risposte

7

Ci sono due possibili ragioni per questo utilizzo:

  • Nel contesto delle eccezioni, il controllo passa alla funzione / metodo di chiamata e questa gerarchia di chiamate viene in genere visualizzata con il metodo principale in alto e le chiamate di metodo che formano una gerarchia verso il basso, con un livello decrescente di astrazioni. In questa gerarchia, un'eccezione si sposta verso l'alto.

  • Lo stack di programma effettivo in una normale applicazione x86 è invertito, cioè cresce verso il basso. Le istruzioni del codice macchina PUSH / PUSHW / PUSHD riducono il puntatore dello stack. Altre architetture potrebbero condividere questo modello.

risposta data 01.05.2012 - 10:28
fonte
1

Tutto dipende dalla definizione delle parole; cosa intendi esattamente con le parole "top" e "bottom" in questo contesto, e anche sull'implementazione del sistema operativo o dell'architettura del computer.

Ricordo quanto segue da molto tempo fa, quando stavo programmando sul Commodore 64. La memoria tra l'indirizzo $ 0800 (2048) e $ 9FFF (40959) era riservata ai programmi BASIC. Il codice del tuo programma BASIC è stato memorizzato a partire dall'indirizzo più basso ($ 0800, crescendo verso l'alto da lì). Lo stack, per la memorizzazione di variabili e gli indirizzi di ritorno delle subroutine, è iniziato nella parte superiore ($ 9FFF) di tale intervallo e è cresciuto verso indirizzi più bassi. Quindi in questo contesto era logico vedere lo stack come crescente verso il basso e quando si ritorna da una subroutine il frame dello stack della subroutine è stato scartato incrementando il puntatore dello stack, in modo da poter dire che si stava "spostando verso l'alto lo stack" quando di ritorno da una subroutine.

Non so come funzioni sulle versioni moderne di processori Windows o Intel x86. Forse lo stack funziona in senso inverso, cioè cresce da indirizzi inferiori a superiori. Se così fosse, probabilmente useresti le parole "top", "bottom" e "up", "down" esattamente al contrario.

    
risposta data 01.05.2012 - 11:54
fonte
0

To call a function such as foo(6, x+1)...

  1. Evaluate the actual parameter expressions, such as the x+1, in the caller's context.
  2. Allocate memory for foo()'s locals by pushing a suitable "local block" of memory onto a runtime "call stack" dedicated to this purpose. For parameters but not local variables, store the values from step (1) into the appropriate slot in foo()'s local block.
  3. Store the caller's current address of execution (its "return address") and switch execution to foo().
  4. foo() executes with its local block conveniently available at the end of the call stack.
  5. When foo() is finished, it exits by popping its locals off the stack and "returns" to the caller using the previously stored return address. Now the caller's locals are on the end of the stack and it can resume executing.

Riferimento:

link (p15)

    
risposta data 01.05.2012 - 11:23
fonte
0

Se concettualizzi una pila come una cosa dal basso verso l'alto, come un cilindro con palline da tennis in essa nella realtà gravitazionale normale, il controllo allora sale sulla pila quando vengono chiamate le funzioni. Quando le funzioni sono completate, il controllo si sposta in basso nella pila.

Se concettualizzi una pila come una cosa dall'alto in basso, come lo stesso cilindro di palle da tennis ma con gravità invertita, il controllo si sposta verso il basso nello stack quando le funzioni vengono richiamate e su per lo stack quando le funzioni sono complete.

Questi sono solo dei modelli nella tua testa e sono essenzialmente totalmente arbitrari. Puoi concettualizzarlo come una cosa da lato a lato se preferisci, ma potresti avere problemi a comunicare con le persone. Personalmente penso che se A chiama B e B chiama C che C è il fondo dello stack (realtà gravitazionale invertita) e se si verifica un'eccezione in C, si vuole far passare quell'eccezione "su" ad A. Penso che questo possa essere il uso più comune della lingua perché la sensazione è che C sia in profondità e A sia il massimo. La prima funzione è intuitivamente la parte superiore per me e le funzioni si approfondiscono su ogni chiamata.

    
risposta data 27.04.2017 - 16:23
fonte

Leggi altre domande sui tag