Upload
ngothuan
View
215
Download
0
Embed Size (px)
Citation preview
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
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
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
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