Perché possiamo usare lo stesso nome per la variabile locale in diversi ambiti?

3

Mi chiedevo perché è possibile che possiamo usare lo stesso nome per la variabile locale in diversi ambiti?

Come possiamo avere due metodi che entrambi possono avere variabili con lo stesso nome.

Che cosa rende possibile questo e cosa succede dietro le quinte?

    
posta Akainu 30.01.2015 - 23:42
fonte

2 risposte

4

Quando il compilatore entra in un "nuovo ambito", le nuove variabili all'interno di quell'ambito vengono memorizzate per quell'ambito e quando l'ambito "scompare", quelle variabili scompaiono. Questo è, normalmente, fatto sotto forma di una sorta di pila / tipo di lista, che a sua volta contiene i nomi delle variabili e il loro tipo.

Quindi, se abbiamo:

int x;

void func()
{
   float x, y;
   int a;
}

lo stack avrà il livello 0 con {x, int} e il livello 1 con {x, double}, {y, double}, {a, int} .

Ho scritto il mio compilatore Pascal in C ++ (usando LLVM per fare la generazione del codice reale), ed ecco il mio "name-stack":

link

Usa lo StackWrapper per tenere traccia del numero di livelli.

Questo non deve essere confuso con il fatto che uno stack viene utilizzato per annidare le chiamate alle funzioni e memorizzare le variabili locali - si tratta di uno stack nell'ambiente di runtime, e mentre entrambi concettualmente sono simili, lo stack nel compilatore è lì per tenere traccia di diversi ambiti, quello nel runtime tiene traccia delle chiamate alle funzioni, degli argomenti alle funzioni e delle variabili locali.

    
risposta data 30.01.2015 - 23:58
fonte
1

Perché possiamo usare lo stesso nome per la variabile locale in diversi ambiti?

Ogni metodo ha il proprio set di variabili locali. Il compilatore converte questi nomi di variabili locali, in sostanza, in numeri univoci per metodo (stack frame offset). Dopo la compilazione, i nomi delle variabili locali vengono persi (ignorando alcune delle più recenti API di reflection).

Le variabili locali esistono solo mentre il metodo è in esecuzione e vengono ripristinate ogni volta che viene richiamato il metodo.

Che cosa rende possibile questo e cosa succede dietro le quinte?

Le variabili locali sono memorizzate nello "stack". Pertanto, ogni chiamata a un metodo ottiene la propria copia delle variabili locali. Quando i metodi restituiscono lo spazio allocato nello stack viene rilasciato.

Questo stack è anche la ragione principale per cui le chiamate al metodo possono anche essere ricorsive, in cui un metodo chiama se stesso. Ogni chiamata riceve il suo spazio in pila.

L'ulteriore ricerca di termini come "pila" e "variabile locale" potrebbe farti trovare di più.

    
risposta data 30.01.2015 - 23:49
fonte

Leggi altre domande sui tag