Upload
others
View
5
Download
0
Embed Size (px)
Citation preview
Programmazione IILezione 14
Daniele Sgandurra
7/12/2010
1/29 Programmazione II Lezione 14 7/12/2010
Sommario
1 Astrarre sul ControlloSottoprogrammiPassaggio Parametri
2/29 Programmazione II Lezione 14 7/12/2010
Astrarre sul Controllo
Parte I
Astrarre sul Controllo
3/29 Programmazione II Lezione 14 7/12/2010
Astrarre sul ControlloSottoprogrammiPassaggio Parametri
Astrazione
Concetto di astrazione:
es., macchina astratta:
“astratto” in opposizione a “fisico”;la macchina astratta nasconde la macchina sottostante.
Astrarre = nascondere qualcosa.
Presente in ogni disciplina scientifica:
descrizione di un fenomeno concentrandosi solo su alcuni suoiaspetti.
Nei linguaggi di programmazione:
astrazione sul controllo:
nascondere dettagli procedurali.
astrazione sui dati:
definire e utilizzare tipi di dato sofisticati senza far riferimentoall’implementazione.
4/29 Programmazione II Lezione 14 7/12/2010
Astrarre sul ControlloSottoprogrammiPassaggio Parametri
Sottoprogrammi
Scomposizione di un problema in sottoproblemi.
soluzione di un problema piu semplice;comporre in modo opportuno le soluzioni ai sottoproblemi;deve esserci supporto da parte del linguaggio di programmazione.
Sottoprogramma, procedura o funzione:
sezione di codice:
identificata da un nome;dotata di un proprio ambiente locale;capace di scambiare informazioni col resto del codice permezzo di parametri.
meccanismi linguistici:
definizione:uso (chiamata).
5/29 Programmazione II Lezione 14 7/12/2010
Astrarre sul ControlloSottoprogrammiPassaggio Parametri
Sottoprogrammi: Esempio
i n t foo ( i n t a , i n t b ) {i n t tmp = b ;i f ( tmp == 0) r e t u r n a ;e l s e r e t u r n a + 1 ;
}
Definizione di una funzione:
di nome foo (questo nome fa parte dell’ambiente non locale dellafunzione);il cui ambiente locale e costituto da a, b, tmp.
La prima linea e l’intestazione.
Le restanti linee costituiscono il corpo.
Una funzione scambia informazioni con il resto del programma mediante
tre meccanismi:
i parametri;i valori di ritorno;l’ambiente non locale.
6/29 Programmazione II Lezione 14 7/12/2010
Astrarre sul ControlloSottoprogrammiPassaggio Parametri
Sottoprogrammi: Parametri
Parametri formali nella definizione del sottoprogramma:
nomi (ambiente: come per le variabili locali);si comportano come variabili legate (bound);
la ridenominazione non ha effetti sulla semantica.
Parametri attuali (effettivi) nella chiamata del sottoprogramma:
nomi o anche espressioni:
dipende anche dai passaggi consentiti dal linguaggio.
Regola generale: numero e tipo devono coincidere:
compatibilita dei tipi;sottoprogrammi con un numero variabile di parametri.
7/29 Programmazione II Lezione 14 7/12/2010
Astrarre sul ControlloSottoprogrammiPassaggio Parametri
Sottoprogrammi: Valore di Ritorno e Ambiente non Locale
Funzioni: sottoprogrammi che restituiscono un valore:
scambio di informazioni non solo tramite parametri;meccanismo linguistico per la restituzione del valore:
return (C e derivati).
Procedure: sottoprogrammi che non restituiscono un valore:
funzioni di tipo void (C e derivati).
Ambiente non locale: meccanismo meno sofisticato (e pericoloso) colquale un sottoprogramma scambia informazioni col resto del programma.
8/29 Programmazione II Lezione 14 7/12/2010
Astrarre sul ControlloSottoprogrammiPassaggio Parametri
Astrazione Funzionale
Dal punto di vista pragmatico: sottoprogramma = meccanismo chepermette al progettista di ottenere astrazione funzionale.
Componente software: entita che fornisce un servizio all’ambiente:
non importa come si realizza il servizio;basta conoscere l’interfaccia per richiederli:
una funzione per ogni servizio.
Separazione:
come richiedere il servizio (interfaccia);come e implementato.
Astrazione funzionale: principio metodologico:
specifica, implementazione e uso sono indipendenti (anche dalcontesto);
il cliente non dipende dal corpo ma solo dall’intestazione(interazione limitata al passaggio dei parametri).
trasparenza: sostituzione con altro corpo ha la stessa semantica.
9/29 Programmazione II Lezione 14 7/12/2010
Astrarre sul ControlloSottoprogrammiPassaggio Parametri
Passaggio Parametri
Modalita di legame tra parametri attuali e parametri formali:
fissata al momento della definizione del sottoprogramma;puo essere specifica per ogni singolo parametro;vale per ogni uso (chiamata) del sottoprogramma.
Semantica (comunicazione):
ingresso: dal chiamante al chiamato;uscita: dal chiamato al chiamante;ingresso/uscita: bidirezionale.
Specifiche tecniche implementative:
tipo di comunicazione;forma di parametro;semantica della modalita;implementazione canonica;costo.
10/29 Programmazione II Lezione 14 7/12/2010
Astrarre sul ControlloSottoprogrammiPassaggio Parametri
Passaggio Parametri per Valore (1)
Meccanismo semplice, default in molti linguaggi:
Pascal, C, Java.
Modalita: parametro in ingresso.
Ambiente locale esteso con il binding tra il parametro formale e unanuova variabile.
Parametro attuale:
espressione (r-value) nella chiamata da valutare prima della stessa;il valore viene assegnato al parametro formale.
Durante l’esecuzione:
nessun rapporto tra parametro formale e parametro attuale.
Al termine:
il parametro viene distrutto insieme all’ambiente locale.
11/29 Programmazione II Lezione 14 7/12/2010
Astrarre sul ControlloSottoprogrammiPassaggio Parametri
Passaggio Parametri per Valore (2)
Se modello di allocazione a pila:
parametro formale nel RdA;alla chiamata si copia il valore (sequenza di chiamata).
Costo:
per strutture dati molto grandi, copia dispendiosa;accesso a costo minimo (come le altre variabili del corpo).
i n t y = 1 ;v o i d foo ( i n t x ) {
x = x + 1 ;}. . .y = 1 ;foo ( y + 1) ;// y v a l e 1
12/29 Programmazione II Lezione 14 7/12/2010
Astrarre sul ControlloSottoprogrammiPassaggio Parametri
Passaggio Parametri per Riferimento (1)
Meccanismo a basso livello presente in molti linguaggi:
Pascal (modificatore var);altri (C e derivati): dipende dalle strutture dati e presenza puntatori.
Modalita: parametro di ingresso/uscita.
Parametro attuale: l-valore.
Alla chiamata:
valutazione dell’l-valore;estensione dell’ambiente locale con un binding tra il parametroformale e questo l-valore (alias).
All’uscita:
distruzione del legame, non della variabile.
13/29 Programmazione II Lezione 14 7/12/2010
Astrarre sul ControlloSottoprogrammiPassaggio Parametri
Passaggio Parametri per Riferimento (2)
Se modello di allocazione a pila:
parametro formale nel RdA;si copia l’l-valore del parametro attuale (sequenza di chiamata).
Costo: abbastanza basso:
sia per la memorizzazione dell’indirizzo;sia per l’accesso: costo di un indirizzamento indiretto.
Il parametro attuale puo essere un’espressione di cui si riesce a calcolarel’l-valore al momento della chiamata.
i n t y = 0 ;v o i d foo ( reference i n t x ) {
x = x + 1 ;}. . .y = 0 ;foo ( y ) ;// y v a l e 1
i n t [ ] V = new V [ 1 0 ] ;i n t i = 0 ;v o i d foo ( reference i n t x ) {
x = x + 1 ;}. . .V [ 1 ] = 1 ;foo ( V [ i+1]) ;// V [ 1 ] v a l e 2
14/29 Programmazione II Lezione 14 7/12/2010
Astrarre sul ControlloSottoprogrammiPassaggio Parametri
Swap in C e Java
Il C ammette solo il passaggio per valore:ma permette la manipolazione di puntatori e indirizzi, per cui e possibilesimulare il passaggio per riferimento:
v o i d swap ( i n t ∗a , i n t ∗b ) {i n t tmp = ∗a ; ∗a = ∗b ; ∗b = tmp ;
}i n t v1 = . . . ;i n t v2 = . . . ;swap(&v1 , &v2 ) ;
In Java, la funzione swap non si puo scrivere:Java adotta il modello delle variabili a riferimento (per i tipi classe);possibile comunicazione bidirezionale (se oggetti mutabili e variabilipubbliche):
c l a s s A {i n t v ;
}
v o i d swap ( A a , A b ) {i n t tmp = a . v ; a . v = b . v ; b . v = tmp ;
}
15/29 Programmazione II Lezione 14 7/12/2010
Astrarre sul ControlloSottoprogrammiPassaggio Parametri
Passaggio Parametri per Costante
Modalita in ingresso (altro nome: read-only):
compromesso tra passaggio per valore e per riferimento.
Parametro attuale: espressioni generiche.
Vincolo statico: nessuna modifica permessa nel corpo:
ne diretta: assegnazione;ne indiretta: passaggio a sottoprogrammi che li modifichino.
Semantica: come quella del passaggio per valore.
Implementazione: dipende dalla macchina astratta:
piccole dimensioni: come nel passaggio per valore (copia);grandi dimensioni: come nel passaggio per riferimento.
Spesso, indicato tramite un modificatore (parola riservata):
in Java: final;in C/C++: const.
16/29 Programmazione II Lezione 14 7/12/2010
Astrarre sul ControlloSottoprogrammiPassaggio Parametri
Passaggio Parametri per Risultato (1)
Modalita di sola uscita (duale del passaggio per costante):
ambiente locale esteso aggiungendo un binding tra il parametroformale e una nuova variabile;parametro attuale: espressione dotata di l-value.
Durante l’esecuzione:
nessun legame tra i due parametri (nessuna informazione puotransitare in ingresso).
Al termine del sottoprogramma:
prima della distruzione dell’ambiente locale, copia del valore delparametro formale nella locazione indicata da quello attuale.
17/29 Programmazione II Lezione 14 7/12/2010
Astrarre sul ControlloSottoprogrammiPassaggio Parametri
Passaggio Parametri per Risultato (2)
Implementazione:
come per il passaggio per valore.
Utilita:
sottoprogrammi che restituiscono piu valori.
v o i d foo ( result i n t x ) {x = 8 ;
}. . .i n t y = 1 ;foo ( y ) ;// y v a l e 8
18/29 Programmazione II Lezione 14 7/12/2010
Astrarre sul ControlloSottoprogrammiPassaggio Parametri
Passaggio Parametri per Valore-Risultato (1)
Modalita bidirezionale combinata valore-risultato:
il parametro formale e una variabile locale;parametro attuale: espressione dotata di l-value.
Alla chiamata:
parametro attuale valutato e l’r-valore ottenuto viene assegnato allalocazione del parametro formale.
Al termine del sottoprogramma:
prima della distruzione dell’ambiente locale copia del valore delparametro formale nella locazione indicata dal parametro attuale.
19/29 Programmazione II Lezione 14 7/12/2010
Astrarre sul ControlloSottoprogrammiPassaggio Parametri
Passaggio Parametri per Valore-Risultato (2)
Implementazione:
come per il passaggio per valore:
ma in Ada e come per riferimento per strutture grandi anchese non semanticamente corretta.
v o i d foo ( valueresult i n t x ) {x = x + 1 ;
}. . .i n t y = 8 ;foo ( y ) ;// y v a l e 9
20/29 Programmazione II Lezione 14 7/12/2010
Astrarre sul ControlloSottoprogrammiPassaggio Parametri
Passaggio Parametri per Valore-Risultato (3)
v o i d foo ( reference/valueresult i n t x
reference/valueresult i n t y
reference i n t z ) {y = 2 ;x = 4 ;i f ( x == y ) z = 1 ;}
. . .i n t a = 3 ;i n t b = 0 ;foo (a , a , b ) ;
Nel passaggio valore-risultato non c’e aliasing:
se x e y distinti, z e quindi b non viene modificato:
vale 0.
altrimenti (passaggio di x e y per riferimento):
alla fine b varrebbe 1.
21/29 Programmazione II Lezione 14 7/12/2010
Astrarre sul ControlloSottoprogrammiPassaggio Parametri
Passaggio Parametri per Nome (1)
Modalita simile a quella per riferimento, ma semanticamente piu precisa:
viene da Algol.
Regola di copia (semantica ridotta a sintassi):
sia f una funzione con un unico parametro formale x e a
un’espressione compatibile con x;una chiamata a f con parametro attuale a e semanticamenteequivalente all’esecuzione del corpo di f nel quale tutte leoccorrenze di x sono sostituite con a.
22/29 Programmazione II Lezione 14 7/12/2010
Astrarre sul ControlloSottoprogrammiPassaggio Parametri
Passaggio Parametri per Nome (2)
Caso: presenza di piu variabili con lo stesso nome:
i n t x = 0 ;i n t foo ( name i n t y ) {
i n t x = 2 ;r e t u r n x + y ;
}. . .i n t a = foo ( x + 1) ;
1 valutando il return nell’ambiente locale di foo, si avrebbe return
x+x+1; cioe si restituisce 5 (cattiva applicazione della regola dicopia: risultato dipendente dal nome della variabile locale);
2 se il corpo fosse int z = 2; return z+y; si avrebbe return
z+x+1; cioe si restituisce 3.
23/29 Programmazione II Lezione 14 7/12/2010
Astrarre sul ControlloSottoprogrammiPassaggio Parametri
Passaggio Parametri per Nome (3)
Caso: presenza di piu variabili con lo stesso nome:
1 variabile catturata dalla dichiarazione locale;2 sostituzione senza cattura di variabile:
si richiede che la valutazione del parametro formale avvenganell’ambiente del chiamante anziche del chiamato.
Quindi, nel passaggio per nome:
semantica: regola di copia;sostituzione: senza cattura:
viene sostituito sempre il parametro attuale piu il suoambiente (fissato a momento della chiamata).
24/29 Programmazione II Lezione 14 7/12/2010
Astrarre sul ControlloSottoprogrammiPassaggio Parametri
Passaggio Parametri per Nome (4)
Caso: valutazione del parametro attuale a ogni sua occorrenza del
parametro formale:
secondo la regola di copia;conseguenze per gli effetti collaterali:
i n t i = 2 ;i n t fie ( name i n t y ) {
r e t u r n y + y ;}. . .i n t a = fie ( i++) ;// i v a l e 4 e a v a l e 5
la regola di copia impone la valutazione di i++ per due volte:
la prima restituisce 2 e porta il valore di i a 3;la seconda restituisce 3 e porta il valore di i a 4.
25/29 Programmazione II Lezione 14 7/12/2010
Astrarre sul ControlloSottoprogrammiPassaggio Parametri
Passaggio Parametri per Nome (5)
Differenza con la modalita valore-risultato:
v o i d fiefoo ( valueresult/name i n t x
valueresult/name i n t y ) {x = x + 1 ;y = 1 ;
}. . .i n t i = 1 ;i n t [ ] A = new i n t [ 5 ] ;A [ 1 ] = 4 ;fiefoo (i , A [ i ] ) ;
Per valore-risultato (ma anche per riferimento): A[1] vale 1 e i vale 2 eil resto dell’array A intatto;
Per nome: A[1] vale 4 e i vale 2 ma modifica anche A[2] che vale 1.
26/29 Programmazione II Lezione 14 7/12/2010
Astrarre sul ControlloSottoprogrammiPassaggio Parametri
Passaggio Parametri per Nome (6)
Implementazione:
occorre passare:
espressione testuale (nome);ambiente:
almeno tutte le variabili libere, cioe non associate,nell’espressione.
chiusura = (espressione, ambiente);
alla chiamata: passaggio della chiusura:
quando il chiamato incontra il parametro formale risolve ilriferimento valutando la prima componente secondo la secondacomponente della chiusura.
27/29 Programmazione II Lezione 14 7/12/2010
Astrarre sul ControlloSottoprogrammiPassaggio Parametri
Passaggio Parametri per Nome (7)
Chiusura: coppia di puntatori:
(i) al codice di valutazione dell’espressione;(ii) di catena statica al blocco dell’ambiente locale nel quale valutare
l’espressione.
Alla chiamata:
costruzione della chiusura da parte del chiamante;associata al parametro formale nel RdA del chiamato (x).
Modalita di passaggio parametri molto costosa.
28/29 Programmazione II Lezione 14 7/12/2010
Astrarre sul ControlloSottoprogrammiPassaggio Parametri
Riferimenti
[1] Linguaggi di programmazione: principi e paradigmi (Cap. 7).
Maurizio Gabbrielli, Simone Martini.
29/29 Programmazione II Lezione 14 7/12/2010