AA 2016-2017 20. Nomi, binding - Dipartimento di...

35
20. Nomi, binding AA 2016-2017 1

Transcript of AA 2016-2017 20. Nomi, binding - Dipartimento di...

20.Nomi,binding

AA2016-2017

1

Nomi

  Unnomeinunlinguaggiodiprogrammazioneè…esa;amentequellocheimmaginateo  lamaggiorpartedeinomisonodefiniAdalprogramma(gliidenAficatori)

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

  Unnomeèunasequenzadicara;eriusataperdenotaresimbolicamenteunogge;o

Nomieastrazioni

•  L’usodeinomirealizzaunprimomeccanismoelementarediastrazione

•  AstrazionesuidaA!  ladichiarazionediunavariabileperme;ediintrodurreun

nomesimbolicoperunalocazionedimemoria,astraendosuide;aglidellagesAonedellamemoria

•  Astrazionesulcontrollo!  ladichiarazionedelnomediunafunzione(procedura)è

l’aspe;oessenzialenelprocessodiastrazioneprocedurale

EnAtàdenotabili

  EnAtàdenotabili:elemenAdiunlinguaggiodiprogrammazioneacuipossoassegnareunnome  EnAtàicuinomisonodefini0dallinguaggiodiprogrammazione(ApiprimiAvi,operazioniprimiAve,…)  EnAtàicuinomisonodefini0dall’utente(variabili,parametri,procedure,Api,costanAsimboliche,classi,oggeO,…)

Bindingescope

  Unbindingèunaassociazionetraunnomeeunogge;o  LoscopediunbindingdefiniscequellapartedelprogrammanellaqualeilbindingèaOvo

BindingAme

  Ilbinding0medefinisceilmomentotemporalenelqualevienedefinitaunaassociazione  Piùingenerale,ilbindingAmedefinisceilmomentonelqualevengonopreseledecisionirelaAveallagesAonedelleassociazioni

EsempidibindingAme

o  Languagedesign0me–proge;azionedellinguaggio! bindingdelleoperazioniprimiAve,Api,costanA

o  Programwri0ng0me–tempodiscri;uradelprogramma! bindingdeiso;oprogrammi,delleclassi,…

o  Compile0me–tempodicompilazione! associazioniperlevariabiliglobali

o  Run0me–tempodiesecuzione! associazionitravariabilielocazioni,associazioniperleenAtàdinamiche

Domanda

  InJava,qual’èilbindingAmeperl’associazionetrailnomediunmetodoeilcodiceeffeOvodelmetodo?o  programAme?o  compileAme?o  runAme?

StaAco&dinamico

  Ilterminesta0c(dynamic)bindingèsolitamenteuAlizzatoperfareriferimentoaunaassociazioneaOvataprimadimandare(dopoavermandato)ilprogrammainesecuzioneMoltedellecara;erisAchedeilinguaggidiprogrammazionedipendonodallasceltadelbindingAmestaAcoodinamico  Ilinguaggi“compilaA”cercanodirisolvereilbindingstaAcamente  Ilinguaggi“interpretaA”devonorisolvereilbindingdinamicamente

Ambiente

  L’ambienteèdefinitocomel’insiemedelleassociazioninome-ogge;oesistenAarunAmeinunospecificopuntodelprogrammaeinunospecificomomentodell’esecuzione  Nellamacchinaastra.adellinguaggio,perogninomeeperognisezionedelprogrammal’ambientedeterminal’associazionecorre.a

Ambienteedichiarazioni

  Ledichiarazionisonoilcostru;olinguisAcocheperme;ediintrodurreassociazioninell’ambiente

intx;intf(){return0;}

Dichiarazionediunavariabile

Dichiarazionediunafunzione

typeBoolExp=|True|False|NotofBoolExp|AndofBoolExp*BoolExp

Dichiarazionedi0po

Ambienteedichiarazioni

{intx;x=22;{charx;x='a';}}

lostessonome,lavariabilex,denotadueoggeOdifferenA

Ambienteedichiarazioni

ClassA{…}Aa1=newA();Aa2=newA();:a1=a2;

Aliasing:nomidiversiperlostessooggeWo

Blocchi

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

  Bloccoassociatoaunaprocedura:corpodellaproceduraconledichiarazionideiparametriformali  Bloccoin-line:meccanismoperraggrupparecomandi

Blocchi

A:{intaVar;aVar=2;B:{charaVar;

aVar='a';}}

Icambiamen9dell’ambienteavvengonoall’entrataeall’uscitadaiblocchi(ancheannida9)

bloccoin-line apribloccoA;apribloccoB;

chiudibloccoB;chiudibloccoA;

poli0cadiaccessoaiblocchi:LIFO

Tipidiambiente

  Ambientelocale:l’insiemedelleassociazionidichiaratelocalmente,compresoleeventualiassociazionirelaAveaiparametri  Ambientenonlocale:associazionideinomichesonovisibiliall’internodelbloccomanondichiaraAnelbloccostesso  Ambienteglobale:associazioniperinomiusabilidatu;elecomponenAchecosAtuisconoilprogramma

#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); } } }}

AmbientelocalediCassociazionipercedquellapercdisaOvaquelladiBAmbientenonlocaleperCassociazioneperbereditatadaBassociazioneglobaleperaAmbienteGlobaleassociazioneperaCosastampa?

Tipidiambiente:esempioinC

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

CambiamenAdell’ambiente

  L’ambientepuòcambiarearunAme,maicambiamenAavvengonodinormainprecisimomenAo  entrandoinunblocco

! creazionedelleassociazionifrainomilocalialbloccoeglioggeOdenotaA

! disaOvazionedelleassociazioniperinomiridefiniAo  uscendodalblocco

! distruzionedelleassociazionifrainomilocalialbloccoeglioggeOdenotaA

! riaOvazionedelleassociazioniperinomicheeranostaAridefiniA

OperazionisuambienA

  Naming:creazionediassociazionefranomeeogge;odenotato(dichiarazionelocalealbloccooparametro)

  Referencing:riferimentoaunogge;odenotatomedianteilsuonome(usodelnomeperaccedereall’ogge;odenotato)Disa^vazionediassociazionefranomeeogge;odenotato(lanuovaassociazioneperunnomemascheralavecchiaassociazione,cherimanedisaOvatafinoall’uscitadalblocco)Ria^vazionediassociazionefranomeeogge;odenotato(unavecchiaassociazionecheeramascherataèriaOvataall’uscitadaunblocco)Unnaming:distruzionediassociazionefranomeeogge;odenotato(esempio:ambientelocaleall’uscitadiunblocco)

  NB.iltempodivitadeglioggeOdenotaAnonènecessariamenteugualealtempodivitadiun’associazione

Implementazionedell’ambiente

21

Ambiente(env)

  Tipo(polimorfo)uAlizzatonellasemanAcaenelleimplementazionipermantenereilbindingtranomievaloridiunopportunoApo  LaspecificadefinisceilApocomefunzione  L’implementazionechevedremouAlizzaleliste

22

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

23

Ambiente:semanAca

# 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

24

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

end25

Scope

  LoscopediunbindingdefiniscequellapartedelprogrammanellaqualeilbindingèaOvoo  scopesta0coolessicale:èdeterminatodallastru;urasintaOcadelprogramma

o  scopedinamico:èdeterminatodallastru;uraatempodiesecuzione

  Comevedremo,differisconosoloperl’ambientenonlocale

A: { int x = 0; void proc( ){ x = 1; }

B: { int x; proc( );

} printf("%d\n", x);

}qualevaloredixvienestampato?

Regolediscope(C)

IlChascopesta0co,quindilavariabilexnelcorpodiprocèlegataalladichiarazionechelaprecedesintaOcamente,cioèquellainA

Regoledivisibilità

Unadichiarazionelocaleinunbloccoèvisibileo  inquelbloccoo  intuOiblocchiinessoannidaA

o salvori-dichiarazionidellostessonome(mascheramento,shadowing)

  Laregoladivisibilità(cioèl’annidamento)èbasatao  sultestodelprogramma(scopesta0co)o  sulflussodiesecuzione(scopedinamico)

ScopestaAco

  LedichiarazionilocaliinunbloccoincludonosoloquellepresenAnelblocco,enonquelledeiblocchiinessoannidaA

  Sesiusaunnomeinunblocco,l’associazionevalidaèquellalocalealblocco;senonesiste,siprendelaprimaassociazionevalidaaparAredalbloccoimmediatamenteesterno,dalpiùvicinoalpiùlontano;senonesiste,siconsideral’ambientepredefinitodellinguaggio;senonesiste,errore

  Seilbloccohaunnome,allorailnomefapartedell’ambientelocaledelbloccoimmediatamenteesterno(comeperleprocedure)

intmain(){intx=0;voidproc(intn){x=n+1;}proc(2);prino("%d\n",x);{intx=0;proc(3);prino("%d\n",x);}prino("%d\n",x);}

Stampa3

Stampa0

Stampa4

Cosastampa?

ScopestaAco:esempioinC

Scopesta0co:discussione

31

errore:elementoèusatoprimadiesseredefinito;inPascalsipuòfare,masolo

conipuntatori

inADAsiusanodichiarazioniincomplete

typelista=ptr^elemento;typeelemento=record

informazione:intero; successivo:lista end

typeelemento;typelista=accesselemento;typeelementoisrecord

informazione:intero; successivo:lista end

Dueesempi…

inPascalsiusanodefinizioniincompleteperlefunzioni

mutuamentericorsive;inCsipuòfareliberamente

procedurepippo(A:integer);forward;procedurepluto(B:integer)beginpippo(3);endprocedurepippobeginpluto(4)end

…piùuno!

Discussione

  LoscopestaAcoperme;edideterminaretuOgliambienAdiunprogrammastaAcamente,osservandolastru;urasintaOcadelprogrammao  controllidicorre;ezzaacompileAmeo  oOmizzazionedelcodiceacompileAmeo  possibileilcontrollostaAcodeiApi

GesAonearunAmearAcolatao  gliambienAnonlocalidifunzionieprocedureevolvonodiversamentedalflussodiaOvazioneedisaOvazionedeiblocchi

Scopedinamico

L’associazionevalidaperunnomex,inunpuntoPdiunprogramma,èlapiùrecenteassociazionecreata(insensotemporale)perxchesiaancoraaOvaquandoilflussodiesecuzionearrivaaP  Comevedremo,loscopedinamicohaunagesAonearunAmesempliceo  vantaggi:flessibilitàneiprogrammio  svantaggi:difficilecomprensionedellechiamatedelleprocedureecontrollostaAcodeiApinonpossibile