a cosa servono? - pages.di.unipi.itpages.di.unipi.it/ferrari/corsi/pr2/lezioni2016/l021.pdf · 1...
TRANSCRIPT
1
20.Da'AA2015-2016
1
Acosaservono?
Livellodiproge,o:organizzanol’informazioneo :pidiversiperconce=diversio meccanismiesplici:deilinguaggiperl’astrazionesuida:(adesempio
classieogge=)
Livellodiprogramma:iden:ficanoeprevengonoerrorio i:pisonocontrollabiliautoma:camenteo cos:tuisconoun“controllodimensionale”
ü l’espressione3+“pippo”deveesseresbagliata
Livellodiimplementazione:permeFonoalcuneo=mizzazionio boolrichiedemenobitdirealo strumen:perfornireinformazioninecessarieallamacchinaastraFa
perallocarespaziodimemoria
2
2
Da::classificazione
Denotabili:sepossonoessereassocia:adunnome letplusone=(funx->x+1);;
Esprimibili:sepossonoessereilrisultatodellavalutazionediunaespressionecomplessa(diversadalsemplicenome) letpick_onen=ifn=0thenfunx->x+1 elsefunx->x-1;;
Memorizzabili:sepossonoesserememorizza:inunavariabile
Obj.val=Obj.val+10;
3
Esempio:lefunzioniinML(puro)
Denotabilio letplus(x,y)=x+y
Esprimibilio letplus=func:on(x:int)->func:on(y:int)->x+y
Memorizzabilio NO
4
3
Tipi
Un:poèunacollezionedivaloridotatadiuninsiemedioperazionipermanipolaretalivalorio ladis:nzionetracollezionidivalorichesono:piononsono:pièunanozionechedipendedallinguaggiodiprogrammazione
L
Sistemadi:pi
Ilinguaggimoderniprevedonodiassociare:piconivalorimanipola:daicostru=linguis:ciSistemadi4pi:ilcomplessodelleinformazionicheregolanoi:pinellinguaggiodiprogrammazioneo :pipredefini:o meccanismiperdefinireeassociareun:poaicostru=
o regoleperdefinireequivalenza,compa:bilitàeinferenza
6
4
Sistemadi:pi
Unsistemadi:piperunlinguaggioèdeFotypesafequandonessunprogrammapuòviolareledis:nzionitrai:pidellinguaggioo nessunprogrammadurantel’esecuzionepuògenerareunerrorechederividaunaviolazionedi:po
7
Typechecking
Strumentocheassicuracheunprogrammasegueleregoledicompa:bilitàdei:po Unlinguaggioèstronglytypedseevital’usononconformeai:pirichies:delleoperazionidellinguaggi Unlinguaggioèsta4callytypedseèstronglytypedeilcontrollodei:pivienefaFosta:camente Unlinguaggioèdynamicallytypedseilcontrollodei:pivienefaFoarun:me
8
5
Regoleditypechecking
Regoledi4podefinisconoquandouncostruFodellinguaggiosoddisfairequis:di:po
9
tenv ehrs⇒ tval tenv[tval / x] ebody⇒ ttenv Let x = erhs in ebody⇒ t
Inferenzadi:po
Typeinference:ilmeccanismodiinferenzadi:piconsentedidedurreil:poassociatoaunprogrammasenzabisognodidichiarazioniesplicite OCaml# let revPair (x, y) = (y, x);; val revPair : 'a * 'b -> 'b * 'a = <fun>
10
6
Comeoperal’inferenza?#letfx=2+x;;valf:int->int=<fun>1. Qualeèil:podif?2. L’operatore+hadue:pi
int→int→int, real→real→real,
3. Lacostante2èdi:point4. QuestocipermeFediconcludereche+:int→int→int5. Dalcontestodiusoderiviamochex:int6. Inconclusionef(x:int)=2+xha:point→intL’ALGORITMOEFFETTIVODIMLÈPIÙCOMPLESSO
11
Storiapiùar:colata
¡ L’algoritmodiinferenzadi:poèstatointrodoFodaHaskellCurryeRobertFeysperillambdacalcolo:patosemplicenel1958
¡ Nel1969,RogerHindleyhaestesol’algoritmodimostrandocheres:tuisceil:popiùgenerale
¡ Nel1978RobertMilnerintroduceinmodoindipendenteunalgoritmo,denominatoW,perillinguaggioML;l’algoritmoèinseguitodimostratoessereequivalenteaquellopropostodaHindley
¡ Nel1982LuisDamasdimostralacompletezzadell’algoritmoperML
12
7
Inferenzadi:poetypechecking
Java,C,andC++,C#u:lizzanounmeccanismoditypecheckingo leannotazionidi:posonoesplici: ML,OCaml,F#,Haskellu:lizzanol’inferenzadi:po(malousanoancheC#3.0eVisualBasic.Net9.0)o Ilcompilatoredeterminail:popiùgenerale(themostgeneraltype)
13
Sta:covsdinamico
¡ JavaScript:controllodi:podinamico
¡ ML:controllodi:posta:cof(x)f:A→B<fun>ex:A
8
Controllista:ciedinamici
Controllodinamico:lamacchinaastraFadevecontrollarecheognioperazionesiaapplicataaoperandidel:pocorreFoo overheadinesecuzioneControllosta4co:icontrollivengonoeffeFua:dalcompilatoreprimadellagenerazionedelcodiceo efficienzadovutaall’analisista:cao prezzodapagare:progeFazionedellinguaggioecompilazionepiùlenta
15
Ancorasta:covs.dinamico
Consideriamoilseguenteframmentodiprogramma(ML-like)letx=1inif(0=1)thenx=“errore”elsex=5
16
• Ilframmentononcausaalcunerroreperl’usoscorreFodellavariabilex
• ilsistemadi:pidiMLinvecelosegnalacomenoncorreFo
9
Decidibilità
Esisteunmetodogeneraleperstabilireseunprogrammadeterminaunerroredi:po?
Seesistesse,lopotremmoapplicarealnostrosempliceprogramma… …eciòimplicherebbepoterdecideredella“terminazione”diP,cheNONèdecidibile
17
int X;P; //invocazione della procedura PX = “errore”;
Linguaggie:pi
OCaml:stronglytypedelamaggiorpartedeicontrollièsta:ca Java:stronglytypedmaconcontrolliarun-:me Cdifficilmentefacontrolliarun-:me Ilinguaggidiscrip:ngmoderni(Python,JavaScript)sonofortemen::pa:concontrollodinamico
18
10
Polimorfismo
Ideadibaseèfareinmodocheunaoperazionepossaessereapplicataauninsiemedi:pi OCamlsupportailpolimorfismoparametricosta:camentemedianteunmeccanismoperl’inferenzadi:po PolimorfismodisoFo:po:unavariabilexdi:poTpuòessereusataintu=queicontes:neiqualièprevistoun:poT’derivatodaTo C++,Java,Eiffel,C#
19
Analisi
¡ Polimorfismoparamerico(ML)o unostessoalgoritmo(codice)puòaveremol::pi(bastarimpiazzarelevariabilidi:po)ü sef:t→talloraf:int→int,f:bool→bool,...
¡ PolimorfismodasoFo:poo unostessosimbolopuòfareriferimentoaalgoritmidifferen:
o lasceltadell’algoritmoeffe=vodaeseguireèdeterminatadalcontestodei:pi
o :piassocia:ainomipossonoesseredifferen:ü +ha:point*int→int,real*real→real
20
11
Tipididatodisistemaediprogramma
InunamacchinaastraFa(einunaseman:ca)sipossonovederedueclassidi:pididato(odominiseman:ci)o i6pididatodisistema
ü definisconolostatoelestruFureda:u:lizzatenellasimulazionedicostru=dicontrollo
o i6pididatodiprogrammaü dominicorrisponden:ai:piprimi:videllinguaggioeai:pichel’utentepuòdefinire(seillinguaggioloconsente)
TraFeremoinsiemeledueclassiancheseilcomponente“da:”dellinguaggiocomprendeovviamentesoloi:pididatodiprogramma
21
Cos’èun:podidatoecosavogliamosaperedilui
UnTDèunacollezionedivalorio rappresenta:daopportunestruFureda:euninsiemedioperazionipermanipolarli
Comesempreciinteressanoduelivellio seman:cao implementazione
22
12
IdescriForididato
Obie=vo:rappresentareunacollezionedivaloriu:lizzandoquantocivienefornitodaunlinguaggiomacchinao unpo’di:pinumerici,caraFerio sequenzedicelledimemoria
Qualunquevaloredellacollezioneèallafineunastringadibit Problema:perpoterriconoscereilvaloreeinterpretarecorreFamentelastringadibito ènecessario(inviadiprincipio)associareallastringaun’altrastruFura
checon:eneladescrizionedel:po(descri,oredidato),chevieneusatoogniqualvoltasiapplicaaldatoun’operazioneü percontrollarecheil:podeldatosiaquelloprevistodall’operazione(typechecking“dinamico”)
ü perselezionarel’operatoregiustopereventualioperazionioverloaded
23
DescriFori
24
typeexp=(*AST*)|Eintofint|Eboolofbool
IdescriForidei:pididatosonoespressitramiteicostruForiInteBool
typeeval=(*Valorirun-:me*)
|Intofint|Boolofbool
13
UsodeidescriFori
25
let plus(x, y) = if typecheck("int", x) & typecheck("int", y) then (match (x, y) with
|(Int(u), Int(w)) -> Int(u + w)) else failwith ("type error")
let typecheck (x, y) = match x with | "int" -> (match y with
| Int(u) -> true | _ -> false)
Tipiatempodicompilazioneeatempodiesecuzione
1. Sel’informazionesui:pièconosciutacompletamente“atempodicompilazione”(OCaml)1. sipossonoeliminareidescriForididato2. iltypecheckingèeffeFuatototalmentedalcompilatore(type
checkingsta:co)2. Sel’informazionesui:piènotasolo“atempodiesecuzione”(JavaScript)
1. sononecessariidescriForipertu=i:pididato2. iltypecheckingèeffeFuatototalmenteatempodiesecuzione(type
checkingdinamico)3. Sel’informazionesui:pièconosciutasoloparzialmente“atempodi
compilazione”(Java)1. idescriForididatocontengonosolol’informazione“dinamica”2. iltypecheckingèeffeFuatoinpartedalcompilatoreeinpartedal
supportoatempodiesecuzione26
14
Tipiscalari
27
Tipiscalari(esempi)
Booleanio val: true,falseo op: or,and,not,condizionalio repr: unbyteo note: Cnonhaun:pobool
CaraFerio val: a,A,b,B,…,è,é,ë,;,‘,…o op: uguaglianza;code/decode;dipendonodallinguaggioo repr: unbyte(ASCII)oduebyte(UNICODE)
28
15
Tipiscalari(esempi)
Interio val: 0,1,-1,2,-2,…,maxinto op: +,-,*,mod,div,…o repr: alcunibyte(2o4);complementoadueo note: interieinterilunghi(anche8byte);limita:probleminella
portabilitàquandolalunghezzanonèspecificatanelladefinizionedellinguaggio
Realio val: valorirazionaliinuncertointervalloo op: +,-,*,/,…o repr: alcunibyte(4);virgolamobileo note: realierealilunghi(8byte);problemidiportabilitàquando
lalunghezzanonèspecificatanelladefinizionedellinguaggio29
Tipiscalari(esempi)
Il:povoid o haunsolovaloreo nessunaoperazioneo serveperdefinireil:podioperazionichemodificanolostatosenzares:tuirealcunvalore
void f (…) {…}
o ilvaloreres:tuitodafdi:povoidèsempreilsolito(edunquenoninteressa)
30
16
Tipicompos:
Recordo collezionedicampi(field),ciascunodiun(diverso):poo uncampoèselezionatocolsuonome
Recordvarian:o recorddovesoloalcunicampi(mutuamenteesclusivi)sonoa=viaun
datoistante Arrayo funzionedaun:poindice(scalare)adunaltro:poo arraydicaraFerisonochiama:stringhe;operazionispecialiInsiemeo soFoinsiemediun:pobasePuntatoreo riferimento(reference)adunoggeFodiunaltro:po
31
Record
o Introdo=permanipolareinmodounitarioda:di:poeterogeneo
o C,C++,CommonLisp,Ada,Pascal,Algol68o Java:nonha:pirecord,sussun:dalleclassio EsempioinC
struct studente { char nome[20]; int matricola; };
o Selezionedicampo studente s; s.matricola = 343536;
o Recordpossonoessereannida:o Memorizzabili,esprimibiliedenotabili
ü Pascalnonhamododiesprimere“unvalorerecordcostante”ü Clopuòfare,masolonell’inizializzazione(ini:alizer)ü uguaglianzageneralmentenondefinita(contra:Ada)
32
17
Record:implementazione
Memorizzazionesequenzialedeicampi Allineamentoallaparola(16/32/64bit)o sprecodimemoria
Puddingopackedrecordo disallineamentoo accessopiùcostoso
33
Record:implementazione
34
struct x_{ char a; // 1 byte int b; // 4 byte short c; // 2 byte char d; // 1 byte};
L’allineamentoallaparoladeterminaunosprecodioccupazionedimemoria
18
Record:implementazione
35
// effettivo “memory layout” (C COMPILER)struct x_{ char a; // 1 byte char _pad0[3]; // padding 'b' su 4 byteint b; // 4 byte short c; // 2 byte char d; // 1 byte char _pad1[1]; // padding sizeof(x_)
// multiplo di 4}
record:Ocaml-impl
typelabel=Labofstringtypeexpr=…
|Recordof(label*expr)list|Selectofexpr*label
Record[(Lab"size",Int7);(Lab"weight",Int255)]
36
19
Funzionidivalutazione
letreclookupRecordbody(Labl)=matchbodywith|[]->raiseFieldNotFound|(Labl',v)::t->
ifl=l'thenvelselookupRecordt(Labl)
37
Interprete
38
letrecevale=matchewith...
|Record(body)->Record(evalRecordbody)|Select(e,l)->matchevalewith
|Record(body)->lookupRecordbodyl|_->raiseTypeMismatch
evalRecordbody=matchbodywith
|[]->[]|(Labl,e)::t->(Labl,evale)::evalRecordt
20
Array
Collezionidida:omogeneio funzionedaun:poindiceal:podeglielemen:o indice:ingenerediscretoo elemento:“qualsiasi:po”(raramenteun:pofunzionale)Dichiarazionio C: intvet[30]; :poindicetra0e29
Arraymul:dimensionaliPrincipaleoperazionepermessao selezionediunelemento:vet[3],mat[10,’c’]o aFenzione:lamodificanonèun’operazionesull’array,masullalocazionemodificabilechememorizzaun(elementodi)array
39
Array:implementazione
Elemen:memorizza:inlocazionicon:gue:o ordinediriga:V[1,1];V[1,2];…;V[1,10];V[2,1];…
ü maggiormenteusatoo ordinedicolonna:V[1,1];V[2,1];V[3,1];…;V[10,1];V[1,2];… Formuladiaccesso(casolineare)o veForeV[N]ofelem_typeo V[I]=base+c*I,dovece’ladimensionepermemorizzareunelem_type
Unformuladiaccesso(piùar:colata)puòesserestabilitaanchepergliarraymul:dimensionali(deFaglinellibroditesto)
40
21
Accessoarray:esempio
41
V[0]
V[1]
V[4]
V[2]
V[3]
int V[5]BASE
V[I] = BASE + I * DD
INDIRIZZODIBASE+OFFSET
Ddimensioneinbytedel'podibase
Accessoarray:esempio
42
V[0]
V[1]
V[4]
V[2]
V[3]
int V[5]BASE=1000
V[4] = 1000+ 4 * 4 = 1016
D
INDIRIZZODIBASE+OFFSET
Ddimensioneinbytedel'podibase=4byte
22
IlcasodelC
IlCnonprevedecontrolliarun:mesullacorreFezzadegliindicidiarray Esempio:unarraydi20elemen:didimensione2byteallocatoall'indirizzo1000,l'ul:macellavalida(indice19)èallocataall’indirizzo1038 Seilprogramma,pererrore,tentadiaccedereilveForeall’indice40,ilrun:menonrileveràl'erroreeforniràunaccessoscorreFoallalocazionedimemoria1080
43
Puntatori
Valori:riferimen:;costantenull(nil)Operazionio creazione
ü funzionidilibreriacheallocaeres:tuisceunpuntatore(e.g.,malloc)
o dereferenziazioneü accessoaldato“puntato”:*p
o testdiuguaglianzaü inspecietestdiuguaglianzaconnull
44
23
ArrayepuntatoriinC
ArrayepuntatorisonointercambiabiliinC(!!)int n; int *a; // puntatore a interi int b[10]; // array di 10 interi … a = b; // a punta all’elemento iniziale di b n = a[3]; // n ha il valore del terzo elemento di b n = *(a+3); // idem n = b[3]; // idem n = *(b+3); // idem
Maa[3] = a[3]+1; modificheràancheb[3](èlastessacosa!)
45
Tipididatodisistema
46
24
Pilanonmodificabile:interfaccia
# module type PILA = sig
type 'a stack val emptystack : int * 'a -> 'a stack val push : 'a * 'a stack -> 'a stack val pop : 'a stack -> 'a stack val top : 'a stack -> 'a val empty : 'a stack -> bool val lungh : 'a stack -> int exception Emptystack exception Fullstack end 47
Pilanonmodificabile:seman:ca#moduleSemPila:PILA=struct
type'astack=Emptyofint|Pushof'astack*'a(*'poalgebrico*)excep:onEmptystack
excep:onFullstack letemptystack(n,x)=Empty(n) letrecmax=func:on |Emptyn->n
|Push(p,a)->maxpletreclungh=func:on
|Emptyn->0 |Push(p,a)->1+lungh(p)
letpush(a,p)=iflungh(p)=max(p)thenraiseFullstackelsePush(p,a) letpop=func:on |Push(p,a)->p |Emptyn->raiseEmptystack
lettop=func:on |Push(p,a)->a |Emptyn->raiseEmptystack
letempty=func:on |Push(p,a)->false |Emptyn->trueend
48
25
Seman:caalgebrica
'astack=Emptyofint|Pushof'astack*'aemptystack(n,x)=Empty(n)lungh(Emptyn)=0lungh(Push(p,a))=1+lungh(p)push(a,p)=Push(p,a)pop(Push(p,a))=ptop(Push(p,a))=aempty(Emptyn)=trueempty(Push(p,a))=false
49
Seman:ca“isomorfa”aunaspecificains:lealgebrico
Seman:cadelleoperazionidefinitadainsiemidiequazionifratermini
Il:podidatoèun’algebra(iniziale)
Pilanonmodificabile:implementazione
#moduleImpPila:PILA= struct type'astack=Pilaof('aarray)*int .......... end
Ilcomponenteprincipaledell’implementazioneèunarrayo (astrazionedella)memoriafisicainunaimplementazioneinlinguaggiomacchina
Classicaimplementazionesequenzialeo u:lizzataancheperaltri:pididatosimiliallepile(code)
50
26
Pilanonmodificabile:implementazione
# module ImpPila: PILA = struct type 'a stack = Pila of ('a array) * int exception Emptystack exception Fullstack let emptystack (nm,x) = Pila(Array.create nm x, -1) let push(x, Pila(s,n)) = if n = (Array.length(s) - 1) then raise Fullstack else (Array.set s (n +1) x; Pila(s, n +1)) let top(Pila(s,n)) = if n = -1 then raise Emptystack else Array.get s n let pop(Pila(s,n)) = if n = -1 then raise Emptystack else Pila(s, n -1) let empty(Pila(s,n)) = if n = -1 then true else false let lungh(Pila(s,n)) = n end
51
Lista(nonpolimorfa):interfaccia
# module type LISTAINT = sig type intlist val emptylist : intlist val cons : int * intlist -> intlist val tail : intlist -> intlist val head : intlist -> int val empty : intlist -> bool val length : intlist -> int exception Emptylist end 52
27
Heap,listalibera,allocazione
53
heads tails
next
newpoint := next; next := tails[next];heads[newpoint] := n; tails[newpoint] := l; newpoint
cons(n, l)
Lista:implementazioneaheap# module ImpListaInt: LISTAINT = struct
type intlist = int let heapsize = 100
let heads = Array.create heapsize 0let tails = Array.create heapsize 0let next = ref(0)let emptyheap = let index = ref(0) in while !index < heapsize do Array.set tails !index (!index + 1); index := !index + 1 done; Array.set tails (heapsize - 1) (-1); next := 0exception Fullheapexception Emptylistlet emptylist = -1
let empty l = if l = -1 then true else false let cons (n, l) = if !next = -1 then raise Fullheap else
(let newpoint = !next in next := Array.get tails !next; Array.set heads newpoint n; Array.set tails newpoint l; newpoint)
let tail l = if empty l then raise Emptylist else Array.get tails llet head l = if empty l then raise Emptylist else Array.get heads llet rec length l = if l = -1 then 0 else 1 + length (tail l)
end54
28
Pilamodificabile:interfaccia
# module type MPILA = sig
type 'a stack val emptystack : int * 'a -> 'a stack val push : 'a * 'a stack -> unit val pop : 'a stack -> unit val top : 'a stack -> 'a val empty : 'a stack -> bool val lungh : 'a stack -> int
val svuota : 'a stack -> unit val access : 'a stack * int -> 'a
exception Emptystack exception Fullstack
exception Wrongaccess end
55
Pilamodificabile:seman:ca# module SemMPila: MPILA = struct
type 'a stack = ('a SemPila.stack) refexception Emptystack
exception Fullstack exception Wrongaccess
let emptystack (n, a) = ref(SemPila.emptystack(n, a) )
let lungh x = SemPila.lungh(!x) let push (a, p) = p := SemPila.push(a, !p)
let pop x = x := SemPila.pop(!x) let top x = SemPila.top(!x)
let empty x = SemPila.empty !xlet rec svuota x = if empty(x) then () else (pop x; svuota x)
let rec faccess (x, n) = if n = 0 then SemPila.top(x) else faccess(SemPila.pop(x), n-1)let access (x, n) = let nofpops = lungh(x) - 1 - n in if nofpops < 0 then raise Wrongaccess else faccess(!x, nofpops)
end56
29
Pilamodificabile:implementazione
module ImpMPila: MPILA = struct type 'x stack = ('x array) * int ref exception Emptystack exception Fullstack exception Wrongaccess let emptystack(nm,(x: 'a)) = ((Array.create nm x, ref(-1)): 'a stack) let push(x,((s,n): 'x stack)) = if !n = (Array.length(s) - 1) then raise Fullstack else (Array.set s (!n +1) x; n := !n +1) let top(((s,n): 'x stack)) = if !n = -1 then raise Emptystack else Array.get s !n let pop(((s,n): 'x stack)) = if !n = -1 then raise Emptystack else n:= !n -1 let empty(((s,n): 'x stack)) = if !n = -1 then true else false let lungh( (s,n): 'x stack) = !n let svuota (((s,n): 'x stack)) = n := -1 let access (((s,n): 'x stack), k) = (* if not(k > !n) then *) Array.get s k (* else raise Wrongaccess *) end 57
Programmicomeda:
LacaraFeris:cafondamentaledellamacchinadiVonNeumanno iprogrammisonounpar:colare:podidatorappresentatonellamemoria
dellamacchinapermeFe,inlineadiprincipio,che,oltreall’interprete,unqualunqueprogrammapossaoperaresudiessiPossibilesempreinlinguaggiomacchinaPossibileneilinguaggiadaltolivelloo selarappresentazionedeiprogrammièvisibilenellinguaggioo eillinguaggiofornisceoperazionipermanipolarla
Ditu=ilinguaggicheabbiamonominato,gliunicichehannoquestacaraFeris:casonoLISPePROLOGo unprogrammaLISPèrappresentatocomeS-espressioneo unprogrammaPROLOGèrappresentatodauninsiemeditermini
58
30
Metaprogrammazione
Unmetaprogrammaèunprogrammacheoperasualtriprogrammi Esempi:interpre:,analizzatori,debugger,o=mizzatori,compilatori,etc. Lametaprogrammazioneèu:lesopraFuFoperdefinire,nellinguaggiostesso,o strumen:disupportoallosviluppoo estensionidellinguaggio
59
Definizionedi:pididato
Laprogrammazionediapplicazioniconsisteingranpartenelladefinizionedi“nuovi:pididato” Unqualunque:podidatopuòesseredefinitoinqualunquelinguaggioo ancheinlinguaggiomacchina Gliaspe=importan:o quantocosta?o esisteil:po?o il:poèastraFo?
60
31
Quantocosta?,1
Ilcostodellasimulazionediun“nuovo:podidato”dipendedalrepertoriodistruFureda:primi:vefornitedallinguaggioo inlinguaggiomacchina,lesequenzedicelledimemoriao inFORTRANeALGOL’60,gliarrayo inPASCALeC,lestruFureallocatedinamicamenteeipuntatori
o inLISP,les-espressionio inMLeProlog,lelisteediterminio inC++eJava,gliogge=
61
Quantocosta?,2
Èu:lepoterdisporredio struFureda:sta:chesequenziali,comegliarrayeirecord
o unmeccanismopercrearestruFuredinamicheü :podidatodinamico(lista,termine,s-espressione)
ü allocazioneesplicitaconpuntatori(àlaPascal-C,ogge=)
62
32
Esisteil:po?
Ancheseabbiamorealizzatounaimplementazionedelleliste(conheap,listalibera,etc.)inFORTRANoALGOLo nonabbiamoveramenteadisposizioneil:poPoichèi:pinonsonodenotabilio nonpossiamo“dichiarare”ogge=di:polistaStessasituazioneinLISPeProlog InPascal,ML,Javai:pisonodenotabili,ancheseconmeccanismidiversio dichiarazionidi:poo dichiarazionidiclasse
63
Dichiarazionidiclasse
IlmeccanismodiC++eJava(ancheOCaml) Il:poèlaclasseo parametrico,conrelazionidisoFo:po
Ivaloridelnuovo:po(ogge=)sonocrea:conun’operazionediistanziazionedellaclasseo nonconunadichiarazione
LapartestruFurada:degliogge=ècos:tuitadauninsiemedivariabiliistanza(ofield)alloca:sulloheap
64
33
Il:poèastraFo?
Un:poastraFoèuninsiemedivalorio dicuinonsiconoscelarappresentazione(implementazione)o chepossonoesseremanipola:soloconleoperazioniassociate
Sono:piastra=tu=i:piprimi:viforni:dallinguaggioo lalororappresentazioneeffe=vanonciènotaenonècomunque
accessibilesenonconleoperazioniprimi:ve Perrealizzare:pididatoastra=servonoo unmeccanismochepermeFedidareunnomealnuovo:po
(dichiarazionedi:poodiclasse)o unmeccanismodi“protezione”oinforma:onhidingcherendala
rappresentazionevisibilesoltantoalleoperazioniprimi:veü variabilid’istanzaprivateinunaclasseü modulieinterfacceinCeML
65