programmazione 2 19. nomi, bindingpages.di.unipi.it/gadducci/pr2-17/pr2-17-019.pdf ·...
TRANSCRIPT
1PR22017-2018
PROGRAMMAZIONE219.Nomi,binding
Nomi
• Unnomeinunlinguaggiodiprogrammazioneè…esa6amentequellocheimmaginateo lamaggiorpartedeinomisonodefini<dalprogramma(gliiden<ficatori)
o maancheisimbolispeciali(come‘+’o‘sqrt’)sononomi
• Unnomeèunasequenzadicara6eriusataperdenotaresimbolicamenteunogge6o
PR22017-2018 2
Nomieastrazioni
• L’usodeinomirealizzaunprimomeccanismoelementarediastrazione
• Astrazionesuida<! ladichiarazionediunavariabileperme6ediintrodurreun
nomesimbolicoperunalocazionedimemoria,astraendosuide6aglidellages<onedellamemoria
• Astrazionesulcontrollo! ladichiarazionedelnomediunafunzione(procedura)è
l’aspe6oessenzialenelprocessodiastrazioneprocedurale
PR22017-2018 3
En<tàdenotabili
• En<tàdenotabili:elemen<diunlinguaggiodiprogrammazioneacuipossoassegnareunnome
• En<tàicuinomisonodefini>dallinguaggiodiprogrammazione(<pieoperatoriprimi<vi,…)
• En<tàicuinomisonodefini>dall’utente(variabili,parametri,procedure,<pi,costan<simboliche,classi,oggeM,…)
PR22017-2018 4
Bindingescope
• Unbindingèunaassociazionetraunnomeeunogge6o
• LoscopediunbindingdefiniscequellapartedelprogrammanellaqualeilbindingèaMvo
PR22017-2018 5
Binding<me
• Ilbinding>medefinisceilmomentotemporalenelqualevienedefinitaunaassociazione
• Piùingenerale,ilbinding<medefinisceilmomentonelqualevengonopreseledecisionirela<veallages<onedelleassociazioni
PR22017-2018 6
Esempidibinding<me
– Languagedesign>me–proge6azionedellinguaggio• bindingdelleoperazioniprimi<ve,<pi,costan<
– Programwri>ng>me–tempodiscri6uradelprogramma• bindingdeiso6o-programmi,delleclassi,…
– Compile>me–tempodicompilazione• associazioniperlevariabiliglobali
– Run>me–tempodiesecuzione• associazionitravariabilielocazioni,associazioniperleen<tàdinamiche
PR22017-2018 7
Domanda
• InJava,qualèilbinding<meperl’associazionetrailnomediunmetodoeilcodiceeffeMvodelmetodo?o program<me?o compile<me?o run<me?
PR22017-2018 8
Sta<co&dinamico
• Ilterminesta>c(dynamic)bindingèu<lizzatoperfareriferimentoaunaassociazioneaMvataprimadimandare(dopoavermandato)ilprogrammainesecuzione
• Moltecara6eris<chedeilinguaggidiprogrammazionedipendonodallasceltadelbindingsta<coodinamico
• Ilinguaggi“compila<”cercanodirisolvereilbindingsta<camente
• Ilinguaggi“interpreta<”devonorisolvereilbindingdinamicamente
PR22017-2018 9
Ambiente
• L’ambienteèdefinitocomel’insiemedelleassociazioninome-ogge6oesisten<arun<meinunospecificopuntodelprogrammaeinunospecificomomentodell’esecuzione
• Nellamacchinaastra.adellinguaggio,perogninomeeperognisezionedelprogrammal’ambientedeterminal’associazionecorre.a
PR22017-2018 10
Ambienteedichiarazioni
• Ledichiarazionisonoilcostru6olinguis<cocheperme6ediintrodurreassociazioninell’ambiente
int x;int f( ) { return 0;}
Dichiarazionediunavariabile
Dichiarazionediunafunzione
type BoolExp = | True | False | Not of BoolExp | And of BoolExp*BoolExp
Dichiarazionedi>po
PR22017-2018 11
Ambienteedichiarazioni
{ int x; x = 22; { char x; x = 'a'; }}
lostessonome,lavariabilex,denotadueoggeMdifferen<
PR22017-2018 12
Ambienteedichiarazioni
Class A { ... }
A a1 = new A( );A a2 = new A( );:a1 = a2;
Aliasing:nomidiversiperlostessooggeRo
PR22017-2018 13
Blocchi
• Unbloccoèunaregionetestualedelprogrammachepuòconteneredichiarazionio C,Java:{…}o OCaML:let…in
• Bloccoassociatoaunaprocedura:corpodellaproceduraconledichiarazionideiparametriformali
• Bloccoin-line:meccanismoperraggrupparecomandi
PR22017-2018 14
Blocchi
A: { int aVar; aVar = 2; B: { char aVar;
aVar = 'a'; } }
Icambiamen9dell’ambienteavvengonoall’entrataeall’uscitadaiblocchi(ancheannida9)
bloccoin-line apribloccoA;apribloccoB;chiudibloccoB;chiudibloccoA;
poli>cadiaccessoaiblocchi:LIFO
PR22017-2018 15
Tipidiambiente
• Ambientelocale:l’insiemedelleassociazionidichiaratelocalmente,compresoleeventualiassociazionirela<veaiparametri
• Ambientenonlocale:associazionideinomichesonovisibiliall’internodelbloccomanondichiara<nelbloccostesso
• Ambienteglobale:associazioniperinomiusabilidatu6elecomponen<checos<tuisconoilprogramma
PR22017-2018 16
#include <stdio.h>
int main( ) { A:{ int a = 1 ; B:{ int b = 2; int c = 2; C:{ int c = 3; int d; d = a + b + c;
printf("%d\n", d); } D:{ int e; e = a + b + c; printf("%d\n", e); } } }}
AmbientelocalediCassociazionipercedquellapercdisaMvaquelladiBAmbientenonlocaleperCassociazioneperbereditatadaBassociazioneglobaleperaAmbienteGlobaleassociazioneperaCosastampa?
Tipidiambiente:esempioinC
PR22017-2018 17
public class Prova { public static void main(String[ ] args) { A:{ int a =1 ; B:{ int b = 2; int c = 2; C:{ int c = 3; int d; d = a + b + c; System.out.println(d); } D:{ int e; e = a + b + c; System.out.println(e); } } } } }
NB.inJavanonèpossibileri-dichiarareunavariabilegiàdichiaratainunbloccopiùesterno
$ javac Prova.javaProva.java:7: c is already defined in main(java.lang.String[])
C:{ int c = 3; ^
Tipidiambiente:esempioinJava
Cambiamen<dell’ambiente
• L’ambientepuòcambiarearun<me,maicambiamen<avvengonodinormainprecisimomen<– entrandoinunblocco
• creazionedelleassociazionifrainomilocalialbloccoeglioggeMdenota<
• disaMvazionedelleassociazioniperinomiridefini<– uscendodalblocco
• distruzionedelleassociazionifrainomilocalialbloccoeglioggeMdenota<
• riaMvazionedelleassociazioniperinomicheeranosta<ridefini<
PR22017-2018 19
Operazionisuambien<
• Naming:creazionediassociazionefranomeeogge6odenotato(dichiarazionelocalealbloccooparametro)
• Referencing:riferimentoaunogge6odenotatomedianteilsuonome(usodelnomeperaccedereall’ogge6odenotato)
• DisaZvazionediassociazionefranomeeogge6odenotato(lanuovaassociazioneperunnomemascheralavecchiaassociazione,cherimanedisaMvatafinoall’uscitadalblocco)
• RiaZvazionediassociazionefranomeeogge6odenotato(unavecchiaassociazionecheeramascherataèriaMvataall’uscitadaunblocco)
• Unnaming:distruzionediassociazionefranomeeogge6odenotato(esempio:ambientelocaleall’uscitadiunblocco)
• NB.iltempodivitadeglioggeMdenota<nonènecessariamenteugualealtempodivitadiun’associazione
PR22017-2018 20
Implementazionedell’ambiente
21 PR22017-2018
Ambiente(env)
• Tipo(polimorfo)u<lizzatonellaseman<caenelleimplementazionipermantenereilbindingtranomievaloridiunopportuno<po
• Laspecificadefinisceil<pocomefunzione• L’implementazionechevedremou<lizzaleliste
22PR22017-2018
Ambiente:interfaccia
# module type Env = sig type 't env val emptyenv : 't -> 't env val bind : 't env * string * 't -> 't env val bindlist : 't env * (string list) * ('t list)
-> 't env val applyenv : 't env * string -> 't exception WrongBindlist end
23PR22017-2018
Ambiente:seman<ca
# module FunEnv: Env = struct type 't env = string -> 't exception WrongBindlist let emptyenv(x) = function (y: string) -> x
(* x: valore default *) let applyenv(x, y) = x y let bind(r, l, e) = function lu -> if lu = l then e else applyenv(r, lu) let rec bindlist(r, il, el) = match (il, el) with | ([], []) -> r
| (i::il1, e::el1) -> bindlist (bind(r, i, e), il1, el1)| _ -> raise WrongBindlist
end
24PR22017-2018
Ambiente:implementazione
# module ListEnv: Env = struct type 't env = (string * 't) list exception WrongBindlist let emptyenv(x) = [("", x)] let rec applyenv(x, y) = match x with | [(_, e)] -> e | (i1, e1) :: x1 -> if y = i1 then e1
else applyenv(x1, y) | [] -> failwith("wrong env") let bind(r, l, e) = (l, e) :: r let rec bindlist(r, il, el) = match (il, el) with | ([], []) -> r
| (i::il1, e::el1) -> bindlist (bind(r, i, e), il1, el1)| _ -> raise WrongBindlist
end
25PR22017-2018
Scope
• LoscopediunbindingdefiniscequellapartedelprogrammanellaqualeilbindingèaMvoo scopesta>coolessicale:èdeterminatodallastru6urasintaMcadelprogramma
o scopedinamico:èdeterminatodallastru6uraatempodiesecuzione
• Comevedremo,differisconosoloperl’ambientenonlocale
PR22017-2018 26
A: { int x = 0; void proc( ){ x = 1; }
B: { int x; proc( ); } printf("%d\n", x);
}qualevaloredixvienestampato?
Regolediscope(C)
IlChascopesta>co,quindilavariabilexnelcorpodiprocèlegataalladichiarazionechelaprecedesintaMcamente,cioèquellainA
PR22017-2018 27
Regoledivisibilità
• Unadichiarazionelocaleinunbloccoèvisibileo inquelbloccoo intuMiblocchiinessoannida<
o salvori-dichiarazionidellostessonome(mascheramento,shadowing)
• Laregoladivisibilità(cioèl’annidamento)èbasatao sultestodelprogramma(scopesta>co)o sulflussodiesecuzione(scopedinamico)
PR22017-2018 28
Scopesta<co
• Ledichiarazionilocaliinunbloccoincludonosoloquellepresen<nelblocco,enonquelledeiblocchiinessoannida<
• Sesiusaunnomeinunblocco,l’associazionevalidaèquellalocalealblocco;senonesiste,siprendelaprimaassociazionevalidaapar<redalbloccoimmediatamenteesterno,dalpiùvicinoalpiùlontano;senonesiste,siconsideral’ambientepredefinitodellinguaggio;senonesiste,errore
• Seilbloccohaunnome,allorailnomefapartedell’ambientelocaledelbloccoimmediatamenteesterno(comeperleprocedure)
PR22017-2018 29
int main( ) { int x = 0; void proc(int n) { x = n+1; } proc(2); printf("%d\n", x); { int x = 0; proc(3); printf("%d\n", x); } printf("%d\n", x);}
Stampa3
Stampa0
Stampa4
Cosastampa?
Scopesta<co:esempioinC
PR22017-2018 30
Scopesta>co:discussione
31 PR22017-2018
errore:elementoèusatoprimadiesseredefinito;inPascalsipuòfare,masolocon
ipuntatori
inADAsiusanodichiarazioniincomplete
type lista = ptr^elemento;type elemento = record
informazione: intero;successivo: listaend
type elemento;type lista = access elemento;type elemento is record
informazione: intero;successivo: listaend
Dueesempi…
PR22017-2018 32
inPascalsiusanodefinizioniincompleteperlefunzionimutuamentericorsive;inCsipuòfareliberamente
procedure pippo (A: integer); forward;
procedure pluto (B: integer)begin pippo(3);end
procedure pippobegin pluto(4)end
…piùuno!
PR22017-2018 33
Discussione
• Loscopesta<coperme6edideterminaretuMgliambien<diunprogrammasta<camente,osservandolastru6urasintaMcadelprogramma– controllidicorre6ezzaacompile<me– oMmizzazionedelcodiceacompile<me– possibileilcontrollosta<codei<pi
• Ges<onearun<mear<colata– gliambien<nonlocalidifunzionieprocedureevolvonodiversamentedalflussodiaMvazioneedisaMvazionedeiblocchi
PR22017-2018 34
Scopedinamico
• L’associazionevalidaperunnomex,inunpuntoPdiunprogramma,èlapiùrecenteassociazionecreata(insensotemporale)perxchesiaancoraaMvaquandoilflussodiesecuzionearrivaaP
• Comevedremo,loscopedinamicohaunages<onearun<mesempliceo vantaggi:flessibilitàneiprogrammio svantaggi:difficilecomprensionedellechiamatedelleprocedureecontrollosta<codei<pinonpossibile
PR22017-2018 35