Uso corretto di up / down nello stack

3

Qual è la convenzione sulla descrizione della direzione dello stack, cioè su quali parole up , in basso , in alto e < em> bottom significa?

Ho notato che con l'API della struttura dati dello stack, top di solito si riferisce all'elemento aggiunto più recentemente. Non ho mai visto il linguaggio di alto livello o la documentazione della biblioteca riferirsi all'elemento appena aggiunto nello stack come qualcosa di diverso da "top".

D'altra parte, le discussioni sullo stack di chiamate del programma usano spesso la convenzione opposta, facendo riferimento ad esempio alle eccezioni che propagano up the stack (dalla funzione attualmente in esecuzione verso la funzione principale). La convenzione varia in base alla lingua o ad altri fattori?

Per chiarire: la mia domanda riguarda solo l'utilizzo nel contesto della programmazione linguistica di alto livello, non la direzione in cui la CPU / OS cresce nella memoria fisica (che varia in base alla piattaforma).

    
posta max 01.10.2016 - 18:21
fonte

2 risposte

2

Hai push elementi su e pop fuori dal top dello stack, indipendentemente da come è disposto in memoria.

La terminologia stack è pensata per rispecchiare uno stack fisico (di piatti, in particolare):

Stacks are often described by analogy to a spring-loaded stack of plates in a cafeteria. Clean plates are placed on top of the stack, pushing down any already there. When a plate is removed from the stack, the one below it pops up to become the new top (Wikipedia, Stack History)

Per quanto riguarda le eccezioni, in senso stretto, un'eccezione diffonde in basso lo stack, dalla funzione chiamata più recentemente alla funzione chiamata meno recente. Google "propagazione delle eccezioni" e uno dei primi risultati lo mostra come questo :

Tuttavia,quandoqualcunodice"si propaga nello stack", capiamo cosa intendono. Quindi, non ci preoccupiamo di questo. Se è alto o basso nella loro testa non è così rilevante come se in definitiva significhi "più recente" o "meno recente" (o "in opposto ordine di invocazione").

    
risposta data 01.10.2016 - 18:58
fonte
3

Ci sono quattro modi per osservare questo:

1) Come semplice metafora senza senso. Chiamare l'elemento più nuovo in cima, in fondo o davanti allo stack è semplicemente una scelta idiomatica. So per certo che alcune persone la pensano in questo modo. E in cima c'è la risposta popolare. E a causa loro non puoi fare affidamento sul prossimo modo di guardare questo a meno che tu non lo controlli da solo.

2) Come dettaglio di implementazione. Le pile devono cambiare il loro indirizzo man mano che crescono. Uno stack che cresce deve cambiare il suo indirizzo in un modo particolare. Una pila che cresce o scende indica se l'indirizzo aumenta o diminuisce man mano che crescono.

3) Come dettaglio di implementazione offuscato da una scelta idiomatica. Chi diavolo decide che l'indirizzo di zeroth sia nella parte superiore o inferiore della memoria? Al tuo computer di certo non interessa. Vai avanti, capovolgilo. I tuoi frammenti di memoria non cadono. Le schede madri possono essere installate con qualsiasi orientamento, quindi non ha davvero alcun significato oggettivo qui. Ho visto gli istruttori scriverlo alla lavagna in entrambi i modi. Ho visto che i libri lo depongono in entrambi i modi. Ho visto che le specifiche lo depongono in entrambi i casi. Dopo oltre 20 anni l'unica cosa che so per certo è che non mi fido.

4) I numeri più grandi salgono sempre. Cosa sei stupido? Proprio come nella grafica, dove crescono da sinistra a destra, dall'alto in basso ... ehi aspetta un secondo ...

Questa domanda dell'intervista è un buon esempio di come questo possa sembrare oggettivo, ma essere arbitrario. Con local1 allocata nel primo frame e local2 allocata nel secondo è il codice di output è:

if(local1 < &local2)
{
printf("\nStack is growing downwards.\n");
}
else
{
printf("\nStack is growing upwards.\n");
}

Eppure nel primo commento insiste che la disuguaglianza sta indicando la strada sbagliata. Il secondo insiste su dropping su / down e si riferisce a indirizzi superiori / inferiori.

Il mio consiglio, se stai scrivendo qualcosa a cui interessa e non puoi evitarlo, determina attentamente le ipotesi popolari e usale coerentemente. Cerca di chiarire le tue ipotesi.

Se stai leggendo qualcosa a cui interessa, indipendentemente dal contesto, non fidarti delle ipotesi finché non sono chiare.

Pila raffigurata con lo 0 ° indirizzo di memoria in alto:
link

Pila raffigurata con lo 0 ° indirizzo di memoria in fondo:
link

Nota come ti danno la possibilità di controllare quali sono le loro ipotesi.

Fa schifo, ma questa ambiguità è ciò che ci è rimasto. Chiunque dica qualcosa di diverso è semplicemente bloccato in un contesto ristretto.

Se vuoi eliminare tutta questa confusione puoi dire eccezioni unwind lo stack.

    
risposta data 01.10.2016 - 19:26
fonte

Leggi altre domande sui tag