programmazione 2 19. nomi, bindingpages.di.unipi.it/gadducci/pr2-17/pr2-17-019.pdf ·...

35
1 PR2 2017-2018 PROGRAMMAZIONE 2 19. Nomi, binding

Upload: others

Post on 26-Apr-2020

5 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: PROGRAMMAZIONE 2 19. Nomi, bindingpages.di.unipi.it/gadducci/PR2-17/PR2-17-019.pdf · 2017-11-26 · – Program wring me – tempo di scriura del programma • binding dei soo- programmi,

1PR22017-2018

PROGRAMMAZIONE219.Nomi,binding

Page 2: PROGRAMMAZIONE 2 19. Nomi, bindingpages.di.unipi.it/gadducci/PR2-17/PR2-17-019.pdf · 2017-11-26 · – Program wring me – tempo di scriura del programma • binding dei soo- programmi,

Nomi

•  Unnomeinunlinguaggiodiprogrammazioneè…esa6amentequellocheimmaginateo lamaggiorpartedeinomisonodefini<dalprogramma(gliiden<ficatori)

o maancheisimbolispeciali(come‘+’o‘sqrt’)sononomi

•  Unnomeèunasequenzadicara6eriusataperdenotaresimbolicamenteunogge6o

PR22017-2018 2

Page 3: PROGRAMMAZIONE 2 19. Nomi, bindingpages.di.unipi.it/gadducci/PR2-17/PR2-17-019.pdf · 2017-11-26 · – Program wring me – tempo di scriura del programma • binding dei soo- programmi,

Nomieastrazioni

•  L’usodeinomirealizzaunprimomeccanismoelementarediastrazione

•  Astrazionesuida<!  ladichiarazionediunavariabileperme6ediintrodurreun

nomesimbolicoperunalocazionedimemoria,astraendosuide6aglidellages<onedellamemoria

•  Astrazionesulcontrollo!  ladichiarazionedelnomediunafunzione(procedura)è

l’aspe6oessenzialenelprocessodiastrazioneprocedurale

PR22017-2018 3

Page 4: PROGRAMMAZIONE 2 19. Nomi, bindingpages.di.unipi.it/gadducci/PR2-17/PR2-17-019.pdf · 2017-11-26 · – Program wring me – tempo di scriura del programma • binding dei soo- programmi,

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

Page 5: PROGRAMMAZIONE 2 19. Nomi, bindingpages.di.unipi.it/gadducci/PR2-17/PR2-17-019.pdf · 2017-11-26 · – Program wring me – tempo di scriura del programma • binding dei soo- programmi,

Bindingescope

•  Unbindingèunaassociazionetraunnomeeunogge6o

•  LoscopediunbindingdefiniscequellapartedelprogrammanellaqualeilbindingèaMvo

PR22017-2018 5

Page 6: PROGRAMMAZIONE 2 19. Nomi, bindingpages.di.unipi.it/gadducci/PR2-17/PR2-17-019.pdf · 2017-11-26 · – Program wring me – tempo di scriura del programma • binding dei soo- programmi,

Binding<me

•  Ilbinding>medefinisceilmomentotemporalenelqualevienedefinitaunaassociazione

•  Piùingenerale,ilbinding<medefinisceilmomentonelqualevengonopreseledecisionirela<veallages<onedelleassociazioni

PR22017-2018 6

Page 7: PROGRAMMAZIONE 2 19. Nomi, bindingpages.di.unipi.it/gadducci/PR2-17/PR2-17-019.pdf · 2017-11-26 · – Program wring me – tempo di scriura del programma • binding dei soo- programmi,

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

Page 8: PROGRAMMAZIONE 2 19. Nomi, bindingpages.di.unipi.it/gadducci/PR2-17/PR2-17-019.pdf · 2017-11-26 · – Program wring me – tempo di scriura del programma • binding dei soo- programmi,

Domanda

•  InJava,qualèilbinding<meperl’associazionetrailnomediunmetodoeilcodiceeffeMvodelmetodo?o  program<me?o  compile<me?o  run<me?

PR22017-2018 8

Page 9: PROGRAMMAZIONE 2 19. Nomi, bindingpages.di.unipi.it/gadducci/PR2-17/PR2-17-019.pdf · 2017-11-26 · – Program wring me – tempo di scriura del programma • binding dei soo- programmi,

Sta<co&dinamico

•  Ilterminesta>c(dynamic)bindingèu<lizzatoperfareriferimentoaunaassociazioneaMvataprimadimandare(dopoavermandato)ilprogrammainesecuzione

•  Moltecara6eris<chedeilinguaggidiprogrammazionedipendonodallasceltadelbindingsta<coodinamico

•  Ilinguaggi“compila<”cercanodirisolvereilbindingsta<camente

•  Ilinguaggi“interpreta<”devonorisolvereilbindingdinamicamente

PR22017-2018 9

Page 10: PROGRAMMAZIONE 2 19. Nomi, bindingpages.di.unipi.it/gadducci/PR2-17/PR2-17-019.pdf · 2017-11-26 · – Program wring me – tempo di scriura del programma • binding dei soo- programmi,

Ambiente

•  L’ambienteèdefinitocomel’insiemedelleassociazioninome-ogge6oesisten<arun<meinunospecificopuntodelprogrammaeinunospecificomomentodell’esecuzione

•  Nellamacchinaastra.adellinguaggio,perogninomeeperognisezionedelprogrammal’ambientedeterminal’associazionecorre.a

PR22017-2018 10

Page 11: PROGRAMMAZIONE 2 19. Nomi, bindingpages.di.unipi.it/gadducci/PR2-17/PR2-17-019.pdf · 2017-11-26 · – Program wring me – tempo di scriura del programma • binding dei soo- programmi,

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

Page 12: PROGRAMMAZIONE 2 19. Nomi, bindingpages.di.unipi.it/gadducci/PR2-17/PR2-17-019.pdf · 2017-11-26 · – Program wring me – tempo di scriura del programma • binding dei soo- programmi,

Ambienteedichiarazioni

{ int x; x = 22; { char x; x = 'a'; }}

lostessonome,lavariabilex,denotadueoggeMdifferen<

PR22017-2018 12

Page 13: PROGRAMMAZIONE 2 19. Nomi, bindingpages.di.unipi.it/gadducci/PR2-17/PR2-17-019.pdf · 2017-11-26 · – Program wring me – tempo di scriura del programma • binding dei soo- programmi,

Ambienteedichiarazioni

Class A { ... }

A a1 = new A( );A a2 = new A( );:a1 = a2;

Aliasing:nomidiversiperlostessooggeRo

PR22017-2018 13

Page 14: PROGRAMMAZIONE 2 19. Nomi, bindingpages.di.unipi.it/gadducci/PR2-17/PR2-17-019.pdf · 2017-11-26 · – Program wring me – tempo di scriura del programma • binding dei soo- programmi,

Blocchi

•  Unbloccoèunaregionetestualedelprogrammachepuòconteneredichiarazionio  C,Java:{…}o OCaML:let…in

•  Bloccoassociatoaunaprocedura:corpodellaproceduraconledichiarazionideiparametriformali

•  Bloccoin-line:meccanismoperraggrupparecomandi

PR22017-2018 14

Page 15: PROGRAMMAZIONE 2 19. Nomi, bindingpages.di.unipi.it/gadducci/PR2-17/PR2-17-019.pdf · 2017-11-26 · – Program wring me – tempo di scriura del programma • binding dei soo- programmi,

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

Page 16: PROGRAMMAZIONE 2 19. Nomi, bindingpages.di.unipi.it/gadducci/PR2-17/PR2-17-019.pdf · 2017-11-26 · – Program wring me – tempo di scriura del programma • binding dei soo- programmi,

Tipidiambiente

•  Ambientelocale:l’insiemedelleassociazionidichiaratelocalmente,compresoleeventualiassociazionirela<veaiparametri

•  Ambientenonlocale:associazionideinomichesonovisibiliall’internodelbloccomanondichiara<nelbloccostesso

•  Ambienteglobale:associazioniperinomiusabilidatu6elecomponen<checos<tuisconoilprogramma

PR22017-2018 16

Page 17: PROGRAMMAZIONE 2 19. Nomi, bindingpages.di.unipi.it/gadducci/PR2-17/PR2-17-019.pdf · 2017-11-26 · – Program wring me – tempo di scriura del programma • binding dei soo- programmi,

#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

Page 18: PROGRAMMAZIONE 2 19. Nomi, bindingpages.di.unipi.it/gadducci/PR2-17/PR2-17-019.pdf · 2017-11-26 · – Program wring me – tempo di scriura del programma • binding dei soo- programmi,

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

Page 19: PROGRAMMAZIONE 2 19. Nomi, bindingpages.di.unipi.it/gadducci/PR2-17/PR2-17-019.pdf · 2017-11-26 · – Program wring me – tempo di scriura del programma • binding dei soo- programmi,

Cambiamen<dell’ambiente

•  L’ambientepuòcambiarearun<me,maicambiamen<avvengonodinormainprecisimomen<–  entrandoinunblocco

•  creazionedelleassociazionifrainomilocalialbloccoeglioggeMdenota<

•  disaMvazionedelleassociazioniperinomiridefini<–  uscendodalblocco

•  distruzionedelleassociazionifrainomilocalialbloccoeglioggeMdenota<

•  riaMvazionedelleassociazioniperinomicheeranosta<ridefini<

PR22017-2018 19

Page 20: PROGRAMMAZIONE 2 19. Nomi, bindingpages.di.unipi.it/gadducci/PR2-17/PR2-17-019.pdf · 2017-11-26 · – Program wring me – tempo di scriura del programma • binding dei soo- programmi,

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

Page 21: PROGRAMMAZIONE 2 19. Nomi, bindingpages.di.unipi.it/gadducci/PR2-17/PR2-17-019.pdf · 2017-11-26 · – Program wring me – tempo di scriura del programma • binding dei soo- programmi,

Implementazionedell’ambiente

21 PR22017-2018

Page 22: PROGRAMMAZIONE 2 19. Nomi, bindingpages.di.unipi.it/gadducci/PR2-17/PR2-17-019.pdf · 2017-11-26 · – Program wring me – tempo di scriura del programma • binding dei soo- programmi,

Ambiente(env)

•  Tipo(polimorfo)u<lizzatonellaseman<caenelleimplementazionipermantenereilbindingtranomievaloridiunopportuno<po

•  Laspecificadefinisceil<pocomefunzione•  L’implementazionechevedremou<lizzaleliste

22PR22017-2018

Page 23: PROGRAMMAZIONE 2 19. Nomi, bindingpages.di.unipi.it/gadducci/PR2-17/PR2-17-019.pdf · 2017-11-26 · – Program wring me – tempo di scriura del programma • binding dei soo- programmi,

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

Page 24: PROGRAMMAZIONE 2 19. Nomi, bindingpages.di.unipi.it/gadducci/PR2-17/PR2-17-019.pdf · 2017-11-26 · – Program wring me – tempo di scriura del programma • binding dei soo- programmi,

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

Page 25: PROGRAMMAZIONE 2 19. Nomi, bindingpages.di.unipi.it/gadducci/PR2-17/PR2-17-019.pdf · 2017-11-26 · – Program wring me – tempo di scriura del programma • binding dei soo- programmi,

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

Page 26: PROGRAMMAZIONE 2 19. Nomi, bindingpages.di.unipi.it/gadducci/PR2-17/PR2-17-019.pdf · 2017-11-26 · – Program wring me – tempo di scriura del programma • binding dei soo- programmi,

Scope

•  LoscopediunbindingdefiniscequellapartedelprogrammanellaqualeilbindingèaMvoo  scopesta>coolessicale:èdeterminatodallastru6urasintaMcadelprogramma

o  scopedinamico:èdeterminatodallastru6uraatempodiesecuzione

•  Comevedremo,differisconosoloperl’ambientenonlocale

PR22017-2018 26

Page 27: PROGRAMMAZIONE 2 19. Nomi, bindingpages.di.unipi.it/gadducci/PR2-17/PR2-17-019.pdf · 2017-11-26 · – Program wring me – tempo di scriura del programma • binding dei soo- programmi,

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

Page 28: PROGRAMMAZIONE 2 19. Nomi, bindingpages.di.unipi.it/gadducci/PR2-17/PR2-17-019.pdf · 2017-11-26 · – Program wring me – tempo di scriura del programma • binding dei soo- programmi,

Regoledivisibilità

•  Unadichiarazionelocaleinunbloccoèvisibileo  inquelbloccoo  intuMiblocchiinessoannida<

o salvori-dichiarazionidellostessonome(mascheramento,shadowing)

•  Laregoladivisibilità(cioèl’annidamento)èbasatao  sultestodelprogramma(scopesta>co)o  sulflussodiesecuzione(scopedinamico)

PR22017-2018 28

Page 29: PROGRAMMAZIONE 2 19. Nomi, bindingpages.di.unipi.it/gadducci/PR2-17/PR2-17-019.pdf · 2017-11-26 · – Program wring me – tempo di scriura del programma • binding dei soo- programmi,

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

Page 30: PROGRAMMAZIONE 2 19. Nomi, bindingpages.di.unipi.it/gadducci/PR2-17/PR2-17-019.pdf · 2017-11-26 · – Program wring me – tempo di scriura del programma • binding dei soo- programmi,

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

Page 31: PROGRAMMAZIONE 2 19. Nomi, bindingpages.di.unipi.it/gadducci/PR2-17/PR2-17-019.pdf · 2017-11-26 · – Program wring me – tempo di scriura del programma • binding dei soo- programmi,

Scopesta>co:discussione

31 PR22017-2018

Page 32: PROGRAMMAZIONE 2 19. Nomi, bindingpages.di.unipi.it/gadducci/PR2-17/PR2-17-019.pdf · 2017-11-26 · – Program wring me – tempo di scriura del programma • binding dei soo- programmi,

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

Page 33: PROGRAMMAZIONE 2 19. Nomi, bindingpages.di.unipi.it/gadducci/PR2-17/PR2-17-019.pdf · 2017-11-26 · – Program wring me – tempo di scriura del programma • binding dei soo- programmi,

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

Page 34: PROGRAMMAZIONE 2 19. Nomi, bindingpages.di.unipi.it/gadducci/PR2-17/PR2-17-019.pdf · 2017-11-26 · – Program wring me – tempo di scriura del programma • binding dei soo- programmi,

Discussione

•  Loscopesta<coperme6edideterminaretuMgliambien<diunprogrammasta<camente,osservandolastru6urasintaMcadelprogramma–  controllidicorre6ezzaacompile<me–  oMmizzazionedelcodiceacompile<me–  possibileilcontrollosta<codei<pi

•  Ges<onearun<mear<colata–  gliambien<nonlocalidifunzionieprocedureevolvonodiversamentedalflussodiaMvazioneedisaMvazionedeiblocchi

PR22017-2018 34

Page 35: PROGRAMMAZIONE 2 19. Nomi, bindingpages.di.unipi.it/gadducci/PR2-17/PR2-17-019.pdf · 2017-11-26 · – Program wring me – tempo di scriura del programma • binding dei soo- programmi,

Scopedinamico

•  L’associazionevalidaperunnomex,inunpuntoPdiunprogramma,èlapiùrecenteassociazionecreata(insensotemporale)perxchesiaancoraaMvaquandoilflussodiesecuzionearrivaaP

•  Comevedremo,loscopedinamicohaunages<onearun<mesempliceo  vantaggi:flessibilitàneiprogrammio  svantaggi:difficilecomprensionedellechiamatedelleprocedureecontrollosta<codei<pinonpossibile

PR22017-2018 35