250 likes | 340 Views
L1 Lezione3. Parametri :’interfaccia tra la procedura chiamante e quella chiamata. Parametri: mezzo di comunicazione esplicita dell’ informazione fra l’unità di esecuzione chiamante e la procedura chiamata. Domanda: qual è la differenza fra i parametri e i”data Object” globali?
E N D
L1 Lezione3 eliana minicozzi linguaggi1 2005-2006
Parametri :’interfaccia tra la procedura chiamante e quella chiamata • Parametri: mezzo di comunicazione esplicita dell’ informazione fra l’unità di esecuzione chiamante e la procedura chiamata. Domanda:qual è la differenza fra i parametri e i”data Object” globali? • 3 categorie di parametri: In,Out, IN OUT. eliana minicozzi linguaggi1 2005-2006
Ovvio significato dei parametri • In: contengono l’ informazione che l’ unità di esecuzione chiamante passa alla procedura nel momento della chiamata: solitamente passati per valore. • Out : Informazione dalla procedura chiamata alla chiamante nel momento in cui avviene il ritorno del controllo alla chiamante. • In Out: che hanno funzioni sia dell’ IN che dell’ Out • Out e In Out sono solitamente passati per indirizzo : cioè i parametri attuali sono il nome del data object in cui va messo l’ eventuale valore di ritorno. eliana minicozzi linguaggi1 2005-2006
Ancora sui parametri • I parametri devono essere specificati sia nell’unità che chiama la procedura (statement di chiamata) sia nella definizione della procedura chiamata. • I Parametri nell’unità che chiama si chiamano parametri reali (attuali), nella procedura chiamata si chiamano parametri formali. I parametri attuali e i parametri formali corrispondenti devono essere dello stesso tipo nei linguaggi fortemente tipati. eliana minicozzi linguaggi1 2005-2006
Legame parametri con il tipo REGOLA: avviene a compile time. Eccezioni: • - I parametri formali vengono legati al tipo a run-time quando la procedura è chiamata. Questo naturalmente non permette un controllo dei tipi a compile time. • - I parametri formali vengono legati a run-time con sottotipi di qualche tipo di base a cui si è legato il parametro a tempo di compilazione. • Quest’ultima alternativa ovviamente permette il controllo dei tipi a compile-time. eliana minicozzi linguaggi1 2005-2006
Associazione:Parametri attuali con parametri formali • − per posizione: a seconda della posizione relativa nella sequenza dei parametri; • − per nome: il nome del parametro formale è aggiunto come prefisso al parametro attuale; eliana minicozzi linguaggi1 2005-2006
Esempio di Associazione • Esempio: supponiamo l’intestazione della seguente procedura (ADA): procedure TEST (A: in Atype; b: in out Btype; C: out Ctype) invocazione con associazione per posizione : TEST(X, Y, Z); • Invocazione con associazione per nome: TEST(A=>X, C=>Z, b=>Y); • Una ulteriore tecnica `e la cosiddetta associazione di default. Essa permette di specificare valori di default ai parametri formali che non sono statilegati a valori da parametri attuali (valida ovviamente solo per parametri In) eliana minicozzi linguaggi1 2005-2006
Implementazione dei Parametri • Tutti i tipi di parametri possono essere implementati per indirizzo o per copia : Per capire al volo le diapositive seguenti ricordate che gli IN contengono informazione mandata, per essere usata, dalla procedura chiamante, gli OUT devono riportare alla chiamante i risultati della computazione che si è svolta nella procedura chiamata eliana minicozzi linguaggi1 2005-2006
Parametri IN implementati per indirizzo • il parametro IN è trattato come una costante con nome: • il compilatore controllerà che il parametro formale non sia modificato dalla procedura: • non appaia nella parte sinistra di uno statement di assegnazione , • non sia usato, nella procedura, come parametro reale di OUT o di IN OUT in uno statement di chiamata di un’ altra procedura …….... eliana minicozzi linguaggi1 2005-2006
Parametri IN implementati per copia • Il parametro attuale è trattato come valore di una variabile locale alla procedura chiamata (il cui nome è il nome del parametro formale). Può essere modificato durante l’esecuzione della procedura e la sua modifica non ha chiaramente effetti sul parametro reale . Il Pascal usa per default questa implementazione eliana minicozzi linguaggi1 2005-2006
Parametri OUT implementati per indirizzo • Per distinguerli dai parametri IN OUT, spesso i compilatori, quando sono passati per indirizzo, permettono l’accesso solo per modificarne il valore e non per usarlo: parametri OUT sempre alla sinistra degli eventuali statement di assegnazione! Nell’implementazione per copia, il parametro formale è usato come una variabile locale il cui valore iniziale è indefinito. Al termine della procedura il suo valore è passato al parametro reale. eliana minicozzi linguaggi1 2005-2006
Parametri OUT implementati per copia • Nell’implementazione per copia, il parametro formale è usato come una variabile locale il cui valore iniziale è indefinito. Al termine della procedura il suo valore è passato al parametro reale eliana minicozzi linguaggi1 2005-2006
Parametri IN OUT implementati per indirizzo • Non ci sono restrizioni del parametro formale dentro la procedura. • In Pascal questo è il modello usato per i parametri VAR. eliana minicozzi linguaggi1 2005-2006
Parametri IN OUT implementati per copia Ritroviamo tutto quello che abbiamo nelle implementazioni per copia degli IN e degli OUT: Si crea una variabile locale per il parametro formale e il parametro reale viene copiato nella variabile locale. Quando la procedura termina, il valore finale del parametro formale viene copiato nella locazione del parametro reale. L’implementazione IN OUT per copia è comunemente chiamato: value-result parameter passing. eliana minicozzi linguaggi1 2005-2006
Ancora IN OUT • Nel caso degli IN-OUT l’unica differenza nel passaggio per copia o per indirizzo è che nel secondo caso il parametro reale è modificato ogni volta che il parametro formale è modificato; nel primo caso, gli effetti delle modifiche si hanno solo alla fine della procedura eliana minicozzi linguaggi1 2005-2006
ALIASING • Aliasing è la possibilità di riferirsi con nomi differenti alla stessa locazione. • Esempio: • program main; • var A : integer; • procedure test ( var X, Y : integer ); • begin • X : = A + Y; • writeln (A, X, Y); • end; • begin • A : = 1; • Test (A,A); • end Il risultato in Pascal è 2 2 2 Contrariamente a quello che Ci si aspetta Poiché “var” in Pascal è implementatoper indirizzo qui A, Y e X sono legati alla stessa locazione eliana minicozzi linguaggi1 2005-2006
Discussione esempio aliasing • L’invocazione Test (A, A) produce che A, Y e X sono legati alla stessa locazione producendo aliasing. • L’aliasing diminuisce molto la comprensibilità della procedura e forza il programmatore a dipendere a livelli profondi dall’implementazione del linguaggio. • Per esempio nell’implementazione del Pascal dei parametri definiti VAR, il programma scriverà 2 2 2; • Se (cosa che non è) i VAR fossero implementati per copia, il risultato del writeln sarà 1 2 1. Cosa che uno si aspetta. Ma anche in questo caso al termine di TEST la locazione identificata da A, potrà contenere 1 o 2, in dipendenza dall’ordine in cui i parametri formali saranno scritti in A eliana minicozzi linguaggi1 2005-2006
Riassumendo: Aliasing avviene quando • a) variabili non locali e parametri formali implementati per indirizzo condividono lo stesso indirizzo • b) quando due parametri reali condividono la stessa locazione. • c) quando c’è il trasferimento di valori in locazioni diverse. • In ogni caso anche quando i parametri sono implementati per copia, può ancora verificarsi ambiguità quando due OUT o IN OUT parametri reali si riferiscono alla stessa entità dato. eliana minicozzi linguaggi1 2005-2006
Definizione di funzioni o “VRP: value-returning-procedure” • Esempio di definizione in Pascal e in Modula 2: • In Pascal function F (X: Xtype; Y: Ytype) : Result type; • In Modula 2 procedure F (X: Xtype ; Y: Ytype) : Result type; eliana minicozzi linguaggi1 2005-2006
Funzioni: esecuzione. • Sono procedure che restituiscono un valore alla unità chiamante: esse quindi hanno bisogno, in aggiunta a tutto quello che riguarda le procedure, di aver definito il tipo del valore che ritornano. Sono realizzate • • o creando, senza previa definizione, nell’ambiente locale della procedura chiamata, una pseudovariabile legata al nome della VRP, a cui si può accedere solo per modifiche (per es. deve apparire solo alla sinistra di uno statement di assegnazione).Il cui valore viene ritornato all’ unità chiamante quando finisce l’ esecuzione della VPR. • • o utilizzando uno statement di ritorno,contenente Return seguito da un’ espressione, per restituire esplicitamente il controllo alla procedura chiamante inviandole allo stesso tempo il valore dell’espressione sopracitata. • Nota che: tutti i tipi di parametri che pure si possono implementare possono avere effetti indesiderabili in quanto l’ espressione che astrae la VRP non dovrebbe cambiare implicitamente nessun valore dell’ ambiente in cui viene invocata. eliana minicozzi linguaggi1 2005-2006
Overloading • E’ permessa la definizione di due procedure (funzioni) con lo stesso nome a patto che il numero di parametri e/o il tipo di essi (nel caso di funzione e/o il tipo del valore di ritorno) siano diversi . eliana minicozzi linguaggi1 2005-2006
Esempio di overloading in ADA • procedure MAIN is • R: FLOAT:= 0.0; • I: INTEGER:= 0; • function F(X: FLOAT) return INTEGER is • begin • return 1; • end; • function F(X: INTEGER) return INTEGER is • begin • return 2; • end; • function F(X: FLOAT; Y: INTEGER) return INTEGER is • begin • return 3; • end; eliana minicozzi linguaggi1 2005-2006
Segue Esempio di overloading in Ada • function F(X: INTEGER; Y: FLOAT) return INTEGER is • begin • return 4; • end; • function F(X: INTEGER) return FLOAT is • begin • return 5.0; • end; • begin • put (F(R)); -- Stampa 1 • put (F(I)); -- Stampa 2 • put (F(R,I)); -- Stampa 3 • put (F(I,R)); -- Stampa 4 • R:= F(I); • put (Integer(R)); -- Stampa 5 • end MAIN; eliana minicozzi linguaggi1 2005-2006
Riassunto Astrazione Procedurale • Nell’astrazione procedurale abbiamo visto due importanti proprietà: • INCAPSULAMENTO e PARAMETRIZZAZIONE • Incapsulamento: è la proprietà di nascondere i dettagli dell’ implementazione di una procedura p e quindi anche dell’ ambiente locale, all’unità di esecuzione che usa p, ovvero è la possibilità di isolare l’implementazione di p dall’ambiente in cui viene usato. • Parametrizzazione: è la proprietà mediante la quale una procedura può effettuare attività diverse al variare dei ‘valori’ dei suoi parametri. • Per esempio “ordinamento su array”, può ordinare ogni array di ogni grandezza purché corrisponda alla definizione dei parametri eliana minicozzi linguaggi1 2005-2006
Esercizi • ESERCIZIParadigmaImperativoProcedure.doc eliana minicozzi linguaggi1 2005-2006