a cosa servono? - pages.di.unipi.itpages.di.unipi.it/ferrari/corsi/pr2/lezioni2016/l021.pdf · 1...

33
1 20. Da’ AA 2015-2016 1 A cosa servono? Livello di proge,o: organizzano l’informazione o :pi diversi per conce= diversi o meccanismi esplici: dei linguaggi per l’astrazione sui da: (ad esempio classi e ogge=) Livello di programma: iden:ficano e prevengono errori o i :pi sono controllabili automa:camente o cos:tuiscono un “controllo dimensionale” ü l’espressione 3+“pippo” deve essere sbagliata Livello di implementazione: permeFono alcune o=mizzazioni o bool richiede meno bit di real o strumen: per fornire informazioni necessarie alla macchina astraFa per allocare spazio di memoria 2

Upload: lykhanh

Post on 15-Feb-2019

215 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: A cosa servono? - pages.di.unipi.itpages.di.unipi.it/ferrari/CORSI/PR2/LEZIONI2016/L021.pdf · 1 20. Da’ AA 2015-2016 1 A cosa servono? Livello di progeo: organizzano l’informazione

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

Page 2: A cosa servono? - pages.di.unipi.itpages.di.unipi.it/ferrari/CORSI/PR2/LEZIONI2016/L021.pdf · 1 20. Da’ AA 2015-2016 1 A cosa servono? Livello di progeo: organizzano l’informazione

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

Page 3: A cosa servono? - pages.di.unipi.itpages.di.unipi.it/ferrari/CORSI/PR2/LEZIONI2016/L021.pdf · 1 20. Da’ AA 2015-2016 1 A cosa servono? Livello di progeo: organizzano l’informazione

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

Page 4: A cosa servono? - pages.di.unipi.itpages.di.unipi.it/ferrari/CORSI/PR2/LEZIONI2016/L021.pdf · 1 20. Da’ AA 2015-2016 1 A cosa servono? Livello di progeo: organizzano l’informazione

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

Page 5: A cosa servono? - pages.di.unipi.itpages.di.unipi.it/ferrari/CORSI/PR2/LEZIONI2016/L021.pdf · 1 20. Da’ AA 2015-2016 1 A cosa servono? Livello di progeo: organizzano l’informazione

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

Page 6: A cosa servono? - pages.di.unipi.itpages.di.unipi.it/ferrari/CORSI/PR2/LEZIONI2016/L021.pdf · 1 20. Da’ AA 2015-2016 1 A cosa servono? Livello di progeo: organizzano l’informazione

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

Page 7: A cosa servono? - pages.di.unipi.itpages.di.unipi.it/ferrari/CORSI/PR2/LEZIONI2016/L021.pdf · 1 20. Da’ AA 2015-2016 1 A cosa servono? Livello di progeo: organizzano l’informazione

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

Page 8: A cosa servono? - pages.di.unipi.itpages.di.unipi.it/ferrari/CORSI/PR2/LEZIONI2016/L021.pdf · 1 20. Da’ AA 2015-2016 1 A cosa servono? Livello di progeo: organizzano l’informazione

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

Page 9: A cosa servono? - pages.di.unipi.itpages.di.unipi.it/ferrari/CORSI/PR2/LEZIONI2016/L021.pdf · 1 20. Da’ AA 2015-2016 1 A cosa servono? Livello di progeo: organizzano l’informazione

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

Page 10: A cosa servono? - pages.di.unipi.itpages.di.unipi.it/ferrari/CORSI/PR2/LEZIONI2016/L021.pdf · 1 20. Da’ AA 2015-2016 1 A cosa servono? Livello di progeo: organizzano l’informazione

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

Page 11: A cosa servono? - pages.di.unipi.itpages.di.unipi.it/ferrari/CORSI/PR2/LEZIONI2016/L021.pdf · 1 20. Da’ AA 2015-2016 1 A cosa servono? Livello di progeo: organizzano l’informazione

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

Page 12: A cosa servono? - pages.di.unipi.itpages.di.unipi.it/ferrari/CORSI/PR2/LEZIONI2016/L021.pdf · 1 20. Da’ AA 2015-2016 1 A cosa servono? Livello di progeo: organizzano l’informazione

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

Page 13: A cosa servono? - pages.di.unipi.itpages.di.unipi.it/ferrari/CORSI/PR2/LEZIONI2016/L021.pdf · 1 20. Da’ AA 2015-2016 1 A cosa servono? Livello di progeo: organizzano l’informazione

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

Page 14: A cosa servono? - pages.di.unipi.itpages.di.unipi.it/ferrari/CORSI/PR2/LEZIONI2016/L021.pdf · 1 20. Da’ AA 2015-2016 1 A cosa servono? Livello di progeo: organizzano l’informazione

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

Page 15: A cosa servono? - pages.di.unipi.itpages.di.unipi.it/ferrari/CORSI/PR2/LEZIONI2016/L021.pdf · 1 20. Da’ AA 2015-2016 1 A cosa servono? Livello di progeo: organizzano l’informazione

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

Page 16: A cosa servono? - pages.di.unipi.itpages.di.unipi.it/ferrari/CORSI/PR2/LEZIONI2016/L021.pdf · 1 20. Da’ AA 2015-2016 1 A cosa servono? Livello di progeo: organizzano l’informazione

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

Page 17: A cosa servono? - pages.di.unipi.itpages.di.unipi.it/ferrari/CORSI/PR2/LEZIONI2016/L021.pdf · 1 20. Da’ AA 2015-2016 1 A cosa servono? Livello di progeo: organizzano l’informazione

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

Page 18: A cosa servono? - pages.di.unipi.itpages.di.unipi.it/ferrari/CORSI/PR2/LEZIONI2016/L021.pdf · 1 20. Da’ AA 2015-2016 1 A cosa servono? Livello di progeo: organizzano l’informazione

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

Page 19: A cosa servono? - pages.di.unipi.itpages.di.unipi.it/ferrari/CORSI/PR2/LEZIONI2016/L021.pdf · 1 20. Da’ AA 2015-2016 1 A cosa servono? Livello di progeo: organizzano l’informazione

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

Page 20: A cosa servono? - pages.di.unipi.itpages.di.unipi.it/ferrari/CORSI/PR2/LEZIONI2016/L021.pdf · 1 20. Da’ AA 2015-2016 1 A cosa servono? Livello di progeo: organizzano l’informazione

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

Page 21: A cosa servono? - pages.di.unipi.itpages.di.unipi.it/ferrari/CORSI/PR2/LEZIONI2016/L021.pdf · 1 20. Da’ AA 2015-2016 1 A cosa servono? Livello di progeo: organizzano l’informazione

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

Page 22: A cosa servono? - pages.di.unipi.itpages.di.unipi.it/ferrari/CORSI/PR2/LEZIONI2016/L021.pdf · 1 20. Da’ AA 2015-2016 1 A cosa servono? Livello di progeo: organizzano l’informazione

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

Page 23: A cosa servono? - pages.di.unipi.itpages.di.unipi.it/ferrari/CORSI/PR2/LEZIONI2016/L021.pdf · 1 20. Da’ AA 2015-2016 1 A cosa servono? Livello di progeo: organizzano l’informazione

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

Page 24: A cosa servono? - pages.di.unipi.itpages.di.unipi.it/ferrari/CORSI/PR2/LEZIONI2016/L021.pdf · 1 20. Da’ AA 2015-2016 1 A cosa servono? Livello di progeo: organizzano l’informazione

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

Page 25: A cosa servono? - pages.di.unipi.itpages.di.unipi.it/ferrari/CORSI/PR2/LEZIONI2016/L021.pdf · 1 20. Da’ AA 2015-2016 1 A cosa servono? Livello di progeo: organizzano l’informazione

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

Page 26: A cosa servono? - pages.di.unipi.itpages.di.unipi.it/ferrari/CORSI/PR2/LEZIONI2016/L021.pdf · 1 20. Da’ AA 2015-2016 1 A cosa servono? Livello di progeo: organizzano l’informazione

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

Page 27: A cosa servono? - pages.di.unipi.itpages.di.unipi.it/ferrari/CORSI/PR2/LEZIONI2016/L021.pdf · 1 20. Da’ AA 2015-2016 1 A cosa servono? Livello di progeo: organizzano l’informazione

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

Page 28: A cosa servono? - pages.di.unipi.itpages.di.unipi.it/ferrari/CORSI/PR2/LEZIONI2016/L021.pdf · 1 20. Da’ AA 2015-2016 1 A cosa servono? Livello di progeo: organizzano l’informazione

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

Page 29: A cosa servono? - pages.di.unipi.itpages.di.unipi.it/ferrari/CORSI/PR2/LEZIONI2016/L021.pdf · 1 20. Da’ AA 2015-2016 1 A cosa servono? Livello di progeo: organizzano l’informazione

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

Page 30: A cosa servono? - pages.di.unipi.itpages.di.unipi.it/ferrari/CORSI/PR2/LEZIONI2016/L021.pdf · 1 20. Da’ AA 2015-2016 1 A cosa servono? Livello di progeo: organizzano l’informazione

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

Page 31: A cosa servono? - pages.di.unipi.itpages.di.unipi.it/ferrari/CORSI/PR2/LEZIONI2016/L021.pdf · 1 20. Da’ AA 2015-2016 1 A cosa servono? Livello di progeo: organizzano l’informazione

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

Page 32: A cosa servono? - pages.di.unipi.itpages.di.unipi.it/ferrari/CORSI/PR2/LEZIONI2016/L021.pdf · 1 20. Da’ AA 2015-2016 1 A cosa servono? Livello di progeo: organizzano l’informazione

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

Page 33: A cosa servono? - pages.di.unipi.itpages.di.unipi.it/ferrari/CORSI/PR2/LEZIONI2016/L021.pdf · 1 20. Da’ AA 2015-2016 1 A cosa servono? Livello di progeo: organizzano l’informazione

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