20/12/16 17:45
Godrek
Provo a cercarlo di spiegare passo passo:
Le regole sono le seguenti:
Come viene rappresentata (attraverso la pila di frame) l'esecuzione di un blocco:
- Quando si entra in un blocco si aggiunge un frame vuoto in cima alla pila
- Le dichiarazioni del blocco aggiungono associazioni sul frame in cima alla pila
- All'uscita del blocco si cancella il frame in cima alla pila
Come viene rappresentata (attraverso la pila di frame) quando una funzione viene chiamata:
- Se la funzione chiamata ha dei parametri formali viene aggiunto un frame in testa alla pila contenente i nomi dei parametri formali con associati i valori degli argomenti passati attraverso la chiamata di funzione
- Si esegue il corpo (il blocco) che definisce la funzione (quindi si aggiunge un frame vuoto in cima, .... , si cancella il frame in cima)
- Al termine della funzione si cancella il frame in testa alla pila (ovvero il frame contenente i parametri della funzione)
int a = 10;
int somma(int b)
{
return a + b;
}
int main()
{
int x = 15;
x = somma(x);
return 0;
}
Supponendo di partire da una pila vuota, secondo le regole elencate, la rappresentazione attraverso una pila di frame di tale programma è la seguente:
1° passo: int a = 10; - aggiungo un frame in testa alla pila contenente l'associazione: (a, 10)
2° passo: int somma(int b) - aggiungo una associazione sul frame in testa alla pila contenente l'associazione (un po astratta): (somma, definizione)
3° passo: int main() - aggiungo un frame vuoto in testa alla pila
4° passo: int x = 5; aggiungo una associazione sul frame in testa alla pila contenente l'associazione: (x, 15)
5° passo: x = somma(x) (chiamata della funzione somma) - aggiungo un frame in testa alla pila contenente i parametri di somma...
Questo è il punto:
- int somma (){...}
- int main(){...}
hanno entrambi la sintassi di una definizione di funzione, soltanto che quando dichiaro la funzione somma aggiungo prima una associazione: (somma, definizione) e solamente quando tale funzione viene chiamata aggiungo un frame in testa alla pila contenente le sue variabili locali, mentre quando dichiaro la funzione main non viene aggiunta una associazione: (main, definizione) ma viene aggiunto direttamente un frame contenente le sue variabili locali.
Quindi è come se il compilatore avesse bisogno di sapere (prima del suo uso) quali sono le variabili locali che appartengono alla funzione somma, mentre per quanto riguarda le variabili locali della funzione main non ne ha bisogno.
Le regole sono le seguenti:
Come viene rappresentata (attraverso la pila di frame) l'esecuzione di un blocco:
- Quando si entra in un blocco si aggiunge un frame vuoto in cima alla pila
- Le dichiarazioni del blocco aggiungono associazioni sul frame in cima alla pila
- All'uscita del blocco si cancella il frame in cima alla pila
Come viene rappresentata (attraverso la pila di frame) quando una funzione viene chiamata:
- Se la funzione chiamata ha dei parametri formali viene aggiunto un frame in testa alla pila contenente i nomi dei parametri formali con associati i valori degli argomenti passati attraverso la chiamata di funzione
- Si esegue il corpo (il blocco) che definisce la funzione (quindi si aggiunge un frame vuoto in cima, .... , si cancella il frame in cima)
- Al termine della funzione si cancella il frame in testa alla pila (ovvero il frame contenente i parametri della funzione)
int a = 10;
int somma(int b)
{
return a + b;
}
int main()
{
int x = 15;
x = somma(x);
return 0;
}
Supponendo di partire da una pila vuota, secondo le regole elencate, la rappresentazione attraverso una pila di frame di tale programma è la seguente:
1° passo: int a = 10; - aggiungo un frame in testa alla pila contenente l'associazione: (a, 10)
2° passo: int somma(int b) - aggiungo una associazione sul frame in testa alla pila contenente l'associazione (un po astratta): (somma, definizione)
3° passo: int main() - aggiungo un frame vuoto in testa alla pila
4° passo: int x = 5; aggiungo una associazione sul frame in testa alla pila contenente l'associazione: (x, 15)
5° passo: x = somma(x) (chiamata della funzione somma) - aggiungo un frame in testa alla pila contenente i parametri di somma...
Questo è il punto:
- int somma (){...}
- int main(){...}
hanno entrambi la sintassi di una definizione di funzione, soltanto che quando dichiaro la funzione somma aggiungo prima una associazione: (somma, definizione) e solamente quando tale funzione viene chiamata aggiungo un frame in testa alla pila contenente le sue variabili locali, mentre quando dichiaro la funzione main non viene aggiunta una associazione: (main, definizione) ma viene aggiunto direttamente un frame contenente le sue variabili locali.
Quindi è come se il compilatore avesse bisogno di sapere (prima del suo uso) quali sono le variabili locali che appartengono alla funzione somma, mentre per quanto riguarda le variabili locali della funzione main non ne ha bisogno.
Ultima modifica effettuata da Godrek 20/12/16 18:36
aaa