programmazione ii - lezione 6groups.di.unipi.it/~daniele/teaching/pr2-10/pr2-06.pdf ·...
TRANSCRIPT
Programmazione IILezione 6
Daniele Sgandurra
5/11/2010
1/54 Programmazione II Lezione 6 5/11/2010
Sommario
1 Nomi e AmbienteAmbiente
2 Esercizi
3 Esercitazione: EclipseEclipse
4 Java
2/54 Programmazione II Lezione 6 5/11/2010
Nomi e Ambiente
Parte I
Nomi e Ambiente
3/54 Programmazione II Lezione 6 5/11/2010
Nomi e Ambiente Ambiente
Blocco: Annidamento e Sovrapposizione
Spesso i blocchi sono annidabili:
la definizione di un blocco inclusa in quella di un altro:
in C: i blocchi associati a sottoprogrammi non possono essereannidati;in Pascal e Ada e possibile avere blocchi di sottoprogrammiall’interno di altri sottoprogrammi.
Mai sovrapponibili:
l’ultimo blocco aperto deve essere il primo a essere chiuso;vale pressoche per tutti i linguaggi che prevedono i blocchi.
4/54 Programmazione II Lezione 6 5/11/2010
Nomi e Ambiente Ambiente
Blocchi: Visibilita
Una dichiarazione locale a un blocco e visibile in un altro blocco se ilbinding creato dalla dichiarazione vale anche per l’ambiente del secondoblocco.
Dichiarazione locale a un blocco visibile nel blocco e in tutti i blocchi
annidati tranne ove compaia una nuova dichiarazione per quel nome:
in tal caso la nuova dichiarazione oscura la prima (buco di visibilita);osservazione: non c’e visibilita dall’esterno verso l’interno (bindinginterni non attivi).
Due blocchi allo stesso livello hanno visibilita separate.
5/54 Programmazione II Lezione 6 5/11/2010
Nomi e Ambiente Ambiente
Tipi d’Ambiente
Tipi d’Ambiente
L’ambiente associato a un blocco e composto da:
ambiente locale: costituito dal binding per nomi locali; per i blocchi diprocedure, l’ambiente locale contiene anche i binding per iparametri formali (come se fossero variabili dichiaratelocalmente);
ambiente non-locale: costituito dai binding per nomi visibili nel blocco ma nondichiarati localmente;
ambiente globale: costituito dai binding creati all’inizio dell’esecuzione delprogramma; nomi usabili in tutti i blocchi.
6/54 Programmazione II Lezione 6 5/11/2010
Nomi e Ambiente Ambiente
Tipi d’Ambiente: Esempio
1 A :{ i n t a = 1 ;23 B :{ i n t b = 2 ;4 i n t c = 2 ;56 C :{ i n t c = 3 ;7 i n t d ;8 d = a+b+c ;9 write ( d ) ;
10 }1112 D :{ i n t e ;13 e = a+b+c ;14 write ( e ) ;15 }16 }17 }
7/54 Programmazione II Lezione 6 5/11/2010
Nomi e Ambiente Ambiente
Tipi d’Ambiente: Esempio
A: blocco che introduce l’ambiente globale:
contiene il binding per a;
B: ambiente locale:
contiene due variabili locali b e c;eredita il binding per a dall’ambiente globale;C: ambiente locale annidato in quello di B:
contiene due variabili locali c (che nasconde l’altra) e d;eredita il binding per b dall’ambiente non-locale e a
dall’ambiente globale di A.
D: ambiente locale annidato in quello di B:
contiene la variabile locale e;eredita il binding per b, c dall’ambiente non-locale di B e a
dall’ambiente globale di A.
8/54 Programmazione II Lezione 6 5/11/2010
Nomi e Ambiente Ambiente
Operazioni sull’Ambiente
Entrata in un blocco:
create associazioni per i nomi locali;disattivate le associazioni per nomi con binding non localipreesistenti.
Uscita da un blocco:
distruzione delle associazioni per nomi locali;riattivate le associazioni per nomi oscurati.
9/54 Programmazione II Lezione 6 5/11/2010
Nomi e Ambiente Ambiente
Operazioni su Nomi e Ambiente
Creazione binding nome-oggetto (naming).
Distruzione binding nome-oggetto (unnaming)
Riferimento a oggetto mediante il nome (referencing).
Disattivazione binding nome-oggetto.
Riattivazione binding nome-oggetto
10/54 Programmazione II Lezione 6 5/11/2010
Nomi e Ambiente Ambiente
Operazioni su Oggetti Denotabili
Creazione: allocazione di memoria necessaria.
Accesso: nome → binding → locazione → valore:
le regole rendono l’associazione univoca.
Modifica: nome → binding → locazione:
e modifica del valore nella locazione.
Distruzione: deallocazione delle risorse.
11/54 Programmazione II Lezione 6 5/11/2010
Nomi e Ambiente Ambiente
Operazioni su Oggetti Denotabili
Creazione e binding spesso contemporanee:
es.: dichiarazioni di variabili (int x;).
Non vale sempre: lifetime(oggetto) <> lifetime(binding):
>: variabile passata per riferimento (parametro formale);<: riferimento “dangling”.
12/54 Programmazione II Lezione 6 5/11/2010
Nomi e Ambiente Ambiente
Scope (Visibilita)
La visibilita di un’associazione e il segmento di istruzioni per il quale essae visibile.
Gli ambienti possono cambiare in base alle operazioni definite sugli
ambienti:
ambienti non locali piu difficili da trattare.
13/54 Programmazione II Lezione 6 5/11/2010
Nomi e Ambiente Ambiente
Scope: Esempio
Quale valore viene stampato?
1 A :{ i n t x = 0 ;23 v o i d foo ( )4 {5 x = 1 ;6 }78 B :{ i n t x ;9 foo ( ) ;
10 }1112 write ( x ) ;13 }
14/54 Programmazione II Lezione 6 5/11/2010
Nomi e Ambiente Ambiente
Regole di visibilita
Determinano la validita dei binding nel passaggio da un ambiente
all’altro.
es.: “una dichiarazione locale a un blocco e visibile in esso e in tuttii blocchi annidati”.
Si possono intendere:
staticamente: sorgente;dinamicamente: esecuzione.
15/54 Programmazione II Lezione 6 5/11/2010
Nomi e Ambiente Ambiente
Scope Statico
Basato sulla struttura sintattica del sorgente: l’associazione e stabilita dalcompilatore. Regola dello scope statico (dello scope annidato piu vicino):
1 le dichiarazioni locali di un blocco definiscono l’ambiente locale (esclusequelle in blocchi annidati);
2 l’uso di un nome in un blocco comporta l’utilizzo del bindingdell’ambiente locale, se esiste; altrimenti risalire all’ambiente dei blocchicontenitori (un livello alla volta) fino a trovare un binding valido (ambitopiu esterno: parole predefinite del linguaggio); altrimenti, errore;
3 il nome di un blocco fa parte dell’ambiente locale del blocco contenitoreimmediatamente esterno al blocco (es., blocchi associati a procedure).
16/54 Programmazione II Lezione 6 5/11/2010
Nomi e Ambiente Ambiente
Scope Statico: Esempio
Quale valore viene stampato?
1 { i n t x = 0 ;23 v o i d incr ( i n t n )4 {5 x = n+1;6 }78 incr ( 3 ) ;9 write ( x ) ;
10 { i n t x = 0 ;11 incr ( 3 ) ;12 write ( x ) ;13 }14 write ( x ) ;15 }
17/54 Programmazione II Lezione 6 5/11/2010
Nomi e Ambiente Ambiente
Scope Statico
Vantaggi:
leggibilita e comprensibilita:
basta scorrere le dichiarazioni nel sorgente.
ottimizzazione:
il compilatore puo decidere (quasi) tutto.
usata dalla maggior parte dei linguaggi:
Algol, Pascal, C, C++, Ada, Java, Scheme, ...
Svantaggi:
relativamente complicata gestione a run-time;gerarchia degli ambienti non locali evolve diversamente dallagerarchia di attivazione dei blocchi.
18/54 Programmazione II Lezione 6 5/11/2010
Nomi e Ambiente Ambiente
Scope Dinamico
Basato sulle sequenze di chiamata delle unita di programma e non sucome appaiono nel sorgente.
Criterio temporale anziche spaziale.
Usata in alcuni dialetti di Lisp, APL, Snobol, Perl.
19/54 Programmazione II Lezione 6 5/11/2010
Nomi e Ambiente Ambiente
Scope Dinamico: Esempio
Quale valore viene stampato?
1 { c o n s t x = 0 ;23 v o i d stampa1 ( )4 {5 write ( x ) ;6 }78 v o i d stampa2 ( )9 {
10 c o n s t x = 1 ;11 stampa1 ( ) ;12 }1314 stampa2 ( ) ;15 }
20/54 Programmazione II Lezione 6 5/11/2010
Nomi e Ambiente Ambiente
Scope Dinamico: Regole di Visibilita
L’associazione per un nome non locale X in un punto P del programma e
la piu recente tra quelle create per X a essere attiva quando il flusso di
controllo raggiunge P:
implementata con ricerca nella pila dei blocchi di attivazione deiblocchi/sottoprogrammi che hanno fatto raggiungere P;per l’ambiente locale la regola e identica al caso dello scope statico.
21/54 Programmazione II Lezione 6 5/11/2010
Nomi e Ambiente Ambiente
Scope Dinamico: Esempio
Quale valore viene stampato?
1 { c o n s t x = 0 ;23 v o i d stampa1 ( )4 {5 write ( x ) ;6 }78 v o i d stampa2 ( )9 {
10 c o n s t x = 1 ;11 { c o n s t x = 2 ; }12 stampa1 ( ) ;13 }1415 stampa2 ( ) ;1617 }
22/54 Programmazione II Lezione 6 5/11/2010
Nomi e Ambiente Ambiente
Scope Dinamico
Vantaggi:
flessibilita:
stesso sottoprogramma si comporta diversamente a secondadel momento in cui viene invocato.
Svantaggi:
minor leggibilita e comprensibilita;
difficile ricostruire le dichiarazioni dal sorgente.
gestione a run-time inefficiente;poco usata nei linguaggi general-purpose.
23/54 Programmazione II Lezione 6 5/11/2010
Nomi e Ambiente Ambiente
Problemi di Scope
Dove possono essere introdotte le dichiarazioni?
Qual e l’esatta visibilita delle variabili locali:
regole restrittive in Pascal:
(i) dichiarazioni a inizio blocco e prima dell’uso;(ii) binding valevoli da inizio a fine blocco (possibili “buchi”);(iii) dichiarazioni prima dell’uso.
piu rilassate in C e Ada:
valevoli dalla dichiarazione a fine blocco;eccezioni (alla iii) per i tipi ricorsivi (es. liste);sottoprogrammi forward Pascal e nomi funzioni C.
Java: disciplina mista:
dichiarazioni ovunque e valide fino a fine blocco;dichiarazione membro valide per tutta la classe.
24/54 Programmazione II Lezione 6 5/11/2010
Esercizi
Parte II
Esercizi
25/54 Programmazione II Lezione 6 5/11/2010
Esercizi
Esercizio 1
Si calcoli la computazione del comando c:
X := 1; while (X == 1) do X := 2;
nello stato σ = [(X , 3)].
26/54 Programmazione II Lezione 6 5/11/2010
Esercizi
Esercizio 2Si consideri il seguente frammento di programma, scritto con un linguaggio a scopestatico. Si dica quali valori sono stampati dalla primitiva write().
1 i n t x = 0 , y = 0 ;23 v o i d foo ( ) {4 x++;5 }6 v o i d bar ( ) {7 foo ( ) ;8 x=x ∗2 ;9 }
1011 read ( y ) ;1213 i f ( y > 0) {14 i n t x = 3 ;15 bar ( ) ;16 write ( x ) ;17 }18 e l s e bar ( ) ;1920 write ( x ) ;
27/54 Programmazione II Lezione 6 5/11/2010
Esercizi
Esercizio 3Si consideri il seguente frammento di programma, scritto con un linguaggio a scopedinamico. Si dica quali valori sono stampati dalla primitiva write().
1 i n t x = 2 , y = 0 ;23 v o i d foo ( ) {4 i n t x = 1 ;5 }6 v o i d bar ( ) {7 foo ( ) ;8 x=x ∗2 ;9 }
1011 read ( y ) ;1213 i f ( y > 0) {14 i n t x = 3 ;15 bar ( ) ;16 write ( x ) ;17 }18 e l s e bar ( ) ;1920 write ( x ) ;
28/54 Programmazione II Lezione 6 5/11/2010
Esercizi
Esercizio 4
Si consideri il seguente frammento di programma: inserire del codice al posto di/*...*/, tale che usando un linguaggio a scope statico la variabile x nei due cicliassuma lo stesso valore, mentre usando un linguaggio a scope dinamico la variabile xassuma valori diversi. (Il codice deve compilare sempre.)
1 i n t i ;23 i n t foo ( ) { /∗ . . . ∗/ }45 f o r ( i = 0 ; i <= 1 ; i++){6 i n t x ;7 /∗ . . . ∗/8 x = foo ( ) ;9 }
**E possibile usare un solo comando nel ciclo for?
29/54 Programmazione II Lezione 6 5/11/2010
Esercitazione: Eclipse
Parte III
Esercitazione: Eclipse
30/54 Programmazione II Lezione 6 5/11/2010
Esercitazione: Eclipse Eclipse
Installare Eclipse
In http://www.eclipse.org/downloads/ selezionare “Eclipse Classic”.
31/54 Programmazione II Lezione 6 5/11/2010
Esercitazione: Eclipse Eclipse
Installare Eclipse
Scompattare l’archivio:
$ tar zxvf eclipse-SDK-3.6.1-linux-gtk.tar.gz
Spostarsi nella directory di installazione:
$ cd eclipse/
Eseguire Eclipse:
$ ./eclipse
(In alternativa, muovere la directory in una directory di sistema eaggiornare il path per puntare ad essa).
32/54 Programmazione II Lezione 6 5/11/2010
Esercitazione: Eclipse Eclipse
Installare Eclipse
Scegliere il workspace:
33/54 Programmazione II Lezione 6 5/11/2010
Esercitazione: Eclipse Eclipse
Creare un Progetto Java con Eclipse
Creare un progetto Java:
34/54 Programmazione II Lezione 6 5/11/2010
Esercitazione: Eclipse Eclipse
Creare un Progetto Java con Eclipse
35/54 Programmazione II Lezione 6 5/11/2010
Esercitazione: Eclipse Eclipse
Aggiungere una classe
Aggiungere una classe:
36/54 Programmazione II Lezione 6 5/11/2010
Esercitazione: Eclipse Eclipse
Aggiungere una classe
37/54 Programmazione II Lezione 6 5/11/2010
Esercitazione: Eclipse Eclipse
Aggiungere una classe
38/54 Programmazione II Lezione 6 5/11/2010
Esercitazione: Eclipse Eclipse
Scrivere il Programma
Scrivere il programma:
39/54 Programmazione II Lezione 6 5/11/2010
Esercitazione: Eclipse Eclipse
Eseguire il Programma
Eseguire il programma (eseguire la build se non e automatica):
40/54 Programmazione II Lezione 6 5/11/2010
Esercitazione: Eclipse Eclipse
Eseguire il Programma
41/54 Programmazione II Lezione 6 5/11/2010
Esercitazione: Eclipse Eclipse
Eseguire il Programma
42/54 Programmazione II Lezione 6 5/11/2010
Esercitazione: Eclipse Eclipse
Eseguire il Programma
43/54 Programmazione II Lezione 6 5/11/2010
Esercitazione: Eclipse Eclipse
Eseguire il Programma
44/54 Programmazione II Lezione 6 5/11/2010
Esercitazione: Eclipse Eclipse
Eseguire il Programma
In alternativa, per compilare ed eseguire il programma da shell:
~$ cd workspace/Hello/src/
~/workspace/Hello/src$ javac Hello.java
~/workspace/Hello/src$ java Hello
Hello World!
In alternativa, dopo aver fatto la build da Eclipse, se si e scelto di averedirectory separate per gli eseguibili (bin) e sorgenti (src), si puo eseguire ilprogramma dalla directory bin:
~$ cd workspace/Hello/
~/workspace/Hello$ ls
~/workspace/Hello$ bin src
~/workspace/Hello$ cd bin/
~/workspace/Hello/bin$ java Hello
Hello World!
45/54 Programmazione II Lezione 6 5/11/2010
Java
Parte IV
Java
46/54 Programmazione II Lezione 6 5/11/2010
Java
Java
Java e un linguaggio object-oriented, con le seguenti caratteristiche:
fortemente tipato (strongly typed): ogni espressione ha un tipo, che ilcompilatore usa per controllare la correttezza delle operazioni eseguite;
tutti gli errori sono rilevati al momento in cui avvengono, non sono
possibili errori non catturati (unchecked error):
es., non e consentito l’accesso diretto alla memoria (puntatorivoid*);
gestione automatica della memoria a heap, con garbage collection:
la deallocazione non e gestita dal programmatore: la JVM si occupadi liberare la memoria non piu usata.
47/54 Programmazione II Lezione 6 5/11/2010
Java
Sintassi di Base
La sintassi del frammento imperativo di Java e simile a quella del C/C++:
comandi (if, while, ...);
le dichiarazioni di metodi (analoghi alle funzioni) e variabili;
si usano le graffe ({...}) per indicare l’apertura e la chiusura dei blocchi;
i caratteri di spazio/tabulazione/a capo non sono importanti;
come in C, un metodo main e utilizzato come punto di partenza del
programma:
invocato dalla JVM all’inizio dell’esecuzione.
48/54 Programmazione II Lezione 6 5/11/2010
Java
Hello World!
1 p u b l i c c l a s s Hello {2 // e n t r y p o i n t d e l programma3 p u b l i c s t a t i c v o i d main ( String [ ] args ) {4 System . out . println ( ” H e l l o World ! ” ) ;5 }6 }
Dichiarazione della classe Hello:
e necessario che il file relativo al codice sorgente abbia lo stessonome della classe pubblica corrispondente, seguito dall’estensionejava.
Un solo metodo, main:
il punto di ingresso nel programma, invocato all’iniziodell’esecuzione;stampa sulla console la stringa Hello World!
49/54 Programmazione II Lezione 6 5/11/2010
Java
Analisi di Hello World
Riga 1: dichiarazione della classe Hello;
Riga 2: commento, ignorato dal compilatore. Un’altra sintassi per icommenti e:
/∗ commento ∗/
Riga 3: dichiarazione del metodo main:
un parametro, args, di tipo String[] (array di stringhe);args contiene gli argomenti (es., passati dalla riga di comando).
Riga 4: stampa la stringa Hello World! sulla console:
System: classe standard di Java;out: variabile associata alla classe System (contiene un riferimentoad un oggetto che rappresenta lo standard output);println: metodo di out per stampare una stringa (sullo standardoutput).
50/54 Programmazione II Lezione 6 5/11/2010
Java
Dichiarazione di Variabili e Assegnamento
Ogni variabile locale utilizzata in un programma deve essere dichiarata primadel suo uso:
deve esserne indicato il tipo, cioe l’insieme dei valori che potramemorizzare e le operazioni possibili;
<tipo> <ide>; // d i c h i a r a z i o n e<ide> = <espressione >; // assegnamento<tipo> <ide> = <espr>; // d i c h i a r a z i o n e e assegnamento
Ad esempio:
1 i n t x ;2 f l o a t phi = 1 . 6 1 8 0 3 3 9 8 8 7 ;3 String msg = ” c i a o ”
La dichiarazione crea una associazione nell’ambiente locale tra il nome
della variabile e il valore:
se non e inizializzata, viene associata ad un valore di default.
51/54 Programmazione II Lezione 6 5/11/2010
Java
Tipi di Dato: Esempio
Esempio: il tipo int:
contiene i valori {. . . ,−2,−1, 0, 1, 2, 3, . . . }
fornisce le operazioni:
+ somma,* moltiplicazione,- sottrazione,/ divisione intera,
e ognuna di queste operazioni puo essere applicata ad una coppia di valoriint e ritorna un singolo valore int.
52/54 Programmazione II Lezione 6 5/11/2010
Java
Dichiarazione di Variabili e Assegnamento: Esempio
1 i n t x = 1 0 ;2 i n t y = 2 0 ;3 x = y ;4 x = x ∗ 3 ;
Riga 1: dichiarazione della variable x di tipo int:
a cui e assegnato il valore 10.
Riga 2: dichiarazione della variable y di tipo int:
a cui e assegnato il valore 20.
Riga 3: assegnamento alla variabile x del valore associato alla variabile y:
x assume il valore 20.
Riga 4: assegnamento alla variabile x del valore di x * 3:
x assume il valore 60.
53/54 Programmazione II Lezione 6 5/11/2010
Java
Riferimenti
[1] Linguaggi di programmazione: principi e paradigmi (Cap. 4).
Maurizio Gabbrielli, Simone Martini.
[2] Core Java 2. Vol. 1: Fondamenti (Cap. 3).
Horstmann Cay S., Cornell Gary.
54/54 Programmazione II Lezione 6 5/11/2010