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.