37
Parte 1 Tipizzazione dei dati Linguaggi dinamici – A.A. 2009/2010 1

T4 tipizzazione

Embed Size (px)

Citation preview

Page 1: T4 tipizzazione

Parte 1

Tipizzazione dei datip

Linguaggi dinamici – A.A. 2009/20101

Page 2: T4 tipizzazione

Entità di un programma� In un programma, ad ogni entità è associato:

Nome identificatore unico nel programma (o in� Nome, identificatore unico nel programma (o in una porzione)

Tipo per indicare l'insieme dei valori e delle� Tipo, per indicare l insieme dei valori e delle operazioni

Valore tra quelli ammessi dal tipo� Valore, tra quelli ammessi dal tipo

� Indirizzo, riferimento alla memoria che la contienecontiene

� Tempo di vita, durata di esistenza nel programmaprogramma

� Visibilità (scope) del nome nel programma

Linguaggi dinamici – A.A. 2009/20102

Page 3: T4 tipizzazione

Definizione di tipizzazione� Ciascun linguaggio di programmazione è

dotato di un sistema per la tipizzazione dei datidotato di un sistema per la tipizzazione dei dati

� Tipizzazione dei dati: meccanismo trattabile di analisi sintattica che classifica una porzioneanalisi sintattica che classifica una porzione del codice in base ai valori che essa calcola

M lt iù i f l t il il t� Molto più informalmente: il compilatore cerca di capire di che categoria (o tipo) è un valore

d tt (t h ki )prodotto (type checking)

� Il tipo caratterizza le operazioni che si possono compiere sul valore prodotto, i suoi limiti, la sua “precisione”

Linguaggi dinamici – A.A. 2009/20103

Page 4: T4 tipizzazione

Porzioni di codice� A quali porzioni di codice viene solitamente

associato un tipo?associato un tipo?� Valori in memoria (costanti)

V i bili li i� Variabili semplici

� Variabili complesse (strutture dati)

� Espressioni

� L'associazione di un tipo di dati ad una pporzione di codice informa il compilatore, l'interprete ed il programmatore su come tale p p gporzione di codice possa essere utilizzata

Linguaggi dinamici – A.A. 2009/20104

Page 5: T4 tipizzazione

Tipi di dato� Quali sono i tipi che si possono associare alle

porzioni di codice?porzioni di codice?

� I tipi associabili sono classificabili in due distinte categoriedistinte categorie� Tipi di dato semplici: caratterizzano un dato

i iti i i ff ttprimitivo, su cui si possono effettuare operazioni “semplici” (numero, caratteri, booleani)booleani)

� Tipi di dato complessi: caratterizzano un dato composto da più dati semplici su cui sicomposto da più dati semplici, su cui si possono effettuare operazioni “complesse” (stringhe struttura dati classe)

Linguaggi dinamici – A.A. 2009/20105

(stringhe, struttura dati, classe)

Page 6: T4 tipizzazione

Tipi di dato� Esempi di tipi di dato semplici

Int Integer Float double Char String Boolean� Int, Integer, Float, double, Char, String, Boolean

� Puntatori

� Esempi di tipi di dato complessi� Struct, union

� Class

Linguaggi dinamici – A.A. 2009/20106

Page 7: T4 tipizzazione

Obiettivi della tipizzazione:SafetySafety

� L'uso dei tipi permette al compilatore di scoprire il più presto possibile (a livello discoprire il più presto possibile (a livello di compilazione) codice privo di senso/illecito

Si consideri l'espressione 3 / “Hi World”� Si consideri l espressione 3 / Hi World

� Tale espressione (che non ha alcun senso) è ibil l t dscomponibile nel seguente modo:

� Operando 1: tipo semplice intero 3

� Operando 2: tipo stringa “Hi World”

� Operatore: divisione /p

� L'operatore divisione non prevede le stringhe!

Il compilatore emette un syntax errorLinguaggi dinamici – A.A. 2009/2010

7

� Il compilatore emette un syntax error

Page 8: T4 tipizzazione

Obiettivi della tipizzazione:SafetySafety

� Ma attenzione!

Si consideri l'espressione ‘ ’ / 5� Si consideri l'espressione ‘a’ / 5

� Anche in questo caso non avrebbe senso di id tt il C id tdividere un carattere, ma il C considera questa espressione come ASCII(‘a’) / 5

� Si consideri l'espressione 70 / “2”

� È sempre una operazione che potrebbe non avere senso, ma un compilatore/interprete potrebbe considerarla come 70 / 2 convertendo l t i “2” ll’i t h tla stringa “2” nell’intero che rappresenta

� Naturalmente se si ha una generica variabile

Linguaggi dinamici – A.A. 2009/20108

stringa non è detto che rappresenti un numero

Page 9: T4 tipizzazione

Obiettivi della tipizzazione:OttimizzazioneOttimizzazione

� Le operazioni di type checking, se eseguite in uno stadio iniziale (compilazione) possonouno stadio iniziale (compilazione) possono fornire informazioni utilissime

Ad esempio se ad una analisi sintattica segue� Ad esempio, se ad una analisi sintattica segue l'immediato type checking, si può scoprire che una variabile è un puntatoreuna variabile è un puntatore

� Se tale indirizzo è allineato (su architetture a 32 bit lti l di 4 b t ) l' i32 bit, un multiplo di 4 byte), l'accesso in memoria è molto più rapido

� Sapendo ciò in anticipo, il compilatore può utilizzare istruzioni efficienti per accedere al

Linguaggi dinamici – A.A. 2009/20109

dato

Page 10: T4 tipizzazione

Obiettivi della tipizzazione:DocumentazioneDocumentazione

� Nei sistemi di tipizzazione più espressivi, i tipi possono servire quale utile fonte dipossono servire quale utile fonte di documentazione del codice

Il tipo di dato illustra la natura di una variabile� Il tipo di dato illustra la natura di una variabile, ed in ultima analisi l'intento del programmatore

Ad i ti t ( t� Ad esempio, un timestamp (marcatore temporale) è, solitamente, un intero a 32/64 bit

� Dal punto di vista della comprensione del codice, è ben diverso leggere int a = 32;oppure timestamp a=32;

� Definizione di nuovi tipi di dato (typedef in C)

Linguaggi dinamici – A.A. 2009/201010

p ( yp )per aumentare l'espressività del linguaggio

Page 11: T4 tipizzazione

Obiettivi della tipizzazione:AstrazioneAstrazione

� Il meccanismo dei tipi permette di produrre programmi ad un livello di astrazione più altoprogrammi ad un livello di astrazione più alto di quello nativo della macchina (bit, byte)

Ad esempio una stringa di caratteri può� Ad esempio, una stringa di caratteri può essere vista a basso livello come una sequenza di byte (o di bit)sequenza di byte (o di bit)

� Per l'essere umano, è molto più intuitivo d t i dpensare ad una stringa come ad una

concatenazione di caratteri� Java: operatore + applicato alle stringhe

Linguaggi dinamici – A.A. 2009/201011

Page 12: T4 tipizzazione

Obiettivi della tipizzazione:ModularitàModularità

� L'uso appropriato dei tipi di dato costituisce uno strumento semplice e robusto per definireuno strumento semplice e robusto per definire interfacce di programmazione (API)

Le funzionalità di una data API sono descritte� Le funzionalità di una data API sono descritte dalle signature (i prototipi) delle funzioni pubbliche che la compongonopubbliche che la compongono

� Leggendo tali signature, il programmatore ( t ) i f i di t t 'id di(esperto) si fa immediatamente un'idea di cosa può (o non può) fare

Linguaggi dinamici – A.A. 2009/201012

Page 13: T4 tipizzazione

Un avvertimento� Attenzione! I meccanismi che garantiscono le

proprietà ora viste non sono una panacea!proprietà ora viste non sono una panacea!

� Tali proprietà aiutano a catturare errori di natura per lo più sintatticanatura per lo più sintattica

� Il meccanismo di tipizzazione (ma anche il il t l'i t t ) ò llcompilatore, o l'interprete) non può nulla

contro la programmazione sloppy (sciatta) che d i di t tiproduce errori di natura semantica

� Un ciclo non viene mai terminato

� Il flusso del programma è sballato

� Una risorsa acquisita non viene mai rilasciata

Linguaggi dinamici – A.A. 2009/201013

q

Page 14: T4 tipizzazione

Type checking� L'operazione di type checking ha l'obiettivo di

verificare e di stabilire il tipo di dato associatoverificare e di stabilire il tipo di dato associato ad una determinata porzione di codice

Tale operazione può avvenire:� Tale operazione può avvenire:� a tempo di compilazione (compile time)

di i ( i )� a tempo di esecuzione (run time)

� Tale operazione può:� Garantire la non perdita di informazione durante

le operazioni di conversione

� Non garantire la perdita di informazione durante le operazioni di conversione

Linguaggi dinamici – A.A. 2009/201014

p

Page 15: T4 tipizzazione

Type checking statico� Un linguaggio di programmazione utilizza un

meccanismo di type checking statico se lemeccanismo di type checking statico se le operazioni di type checking sono eseguite solo a tempo di compilazionea te po d co p a o e

� Linguaggi a type checking statico:C C++ C# Java Fortran Pascal� C, C++, C#, Java, Fortran, Pascal

� Il type checking statico:� è inteso come una forma primitiva di verifica di

un programma

� permette di individuare parecchi errori con largo anticipo (early)

Linguaggi dinamici – A.A. 2009/201015

� permette una migliore ottimizzazione del codice

Page 16: T4 tipizzazione

Type checking statico� Osservazioni:

i tipi delle espressioni sono determinati durante� i tipi delle espressioni sono determinati durante il processo di compilazione

il t ò li d ti à� un compilatore non può sapere quali dati avrà in ingresso/genererà il programma eseguibile

Il t h ki t ti è ti� Il type checking statico è conservativo

� Esempio: if ('A' == 65) printf(“ok\n”);

� L'if è vero, tuttavia il solo meccanismo di tipizzazione, senza un meccanismo di p ,conversione dei tipi, non potrebbe stabilire se 'A' == 65, e dovrebbe fallire

Linguaggi dinamici – A.A. 2009/201016

,

Page 17: T4 tipizzazione

Type checking dinamico� Un linguaggio di programmazione utilizza un

meccanismo di type checking dinamico se lameccanismo di type checking dinamico se la maggior parte delle operazioni di type checking sono eseguite a tempo di esecuzionec ec g so o esegu te a te po d esecu o e

� Linguaggi a type checking dinamico:Javascript LISP Perl PHP Python Ruby� Javascript, LISP, Perl, PHP, Python, Ruby

� Il type checking dinamico è più flessibile di ll t tiquello statico

� Ad esempio, un programma può costruire strutture dati di forma mutevole a run time; pertanto, il tipo di dato cambia a run time, e va

Linguaggi dinamici – A.A. 2009/201017

controllato a run time!

Page 18: T4 tipizzazione

Type checking dinamico� Godendo di un meccanismo di tipizzazione a

run time si possono effettuare glirun time, si possono effettuare gli assegnamenti più strani

Ad esempio: $var = <token letto da file>;� Ad esempio: $var = <token letto da file>;

� Il token può avere un qualunque tipo (intero, t i )stringa)

� Il type checker dinamico assegna il tipo corretto a run time

� Provate a scrivere una cosa simile in C!

Linguaggi dinamici – A.A. 2009/201018

Page 19: T4 tipizzazione

Type checking dinamico� Ovviamente, la flessibilità si paga

Un type checker dinamico dà minori garanzie a� Un type checker dinamico dà minori garanzie a priori rispetto ad un type checker statico, proprio perché non può operare (solamente) aproprio perché non può operare (solamente) a tempo di compilazione

$� Se, nell'esempio precedente, $var è intesa essere una variabile intera che va sommata ad

fun'altra variabile, ed a run time fornite una stringa, l'interprete non potrà fare altro che

i ( i i i!)uscire (con tanti improperi!)

� Il type checker dinamico non poteva sapere

Linguaggi dinamici – A.A. 2009/201019

dell'errore commesso in seguito dall'utente

Page 20: T4 tipizzazione

Type checking dinamico� Un type checker dinamico fa alcuni controlli a

tempo di compilazionetempo di compilazione

� I controlli si limitano alla correttezza sintattica degli operatoridegli operatori

� I controlli a tempo di esecuzione sono, di lit lt iù fi ti ti i l ilsolito, molto più sofisticati, e coinvolgono il

processo di identificazione di un tipo di una iespressione

� I linguaggi con type checking dinamico hanno bisogno di quei controlli che il type checkerstatico potrebbe dare loro

Linguaggi dinamici – A.A. 2009/201020

� Unit testing

Page 21: T4 tipizzazione

Type checking statico e dinamico� Alcuni linguaggi fanno uso di tecniche di type

checking statico e dinamicochecking statico e dinamico

� Java:Ch ki t ti d i ti i� Checking statico dei tipi

� Checking dinamico (a run time) per le i i di d i ( i il i dioperazioni di downcasting (ossia, il casting di

una variabile di una classe base in una delle sue sottoclassi)sue sottoclassi)

Linguaggi dinamici – A.A. 2009/201021

Page 22: T4 tipizzazione

Pro e contro nella pratica� Type checking statico:

Identifica errori a tempo di compilazione (non è� Identifica errori a tempo di compilazione (non è ben chiaro se ciò aumenta l'affidabilità del programma)programma)

� Permette la costruzione di codice che esegue più velocementepiù velocemente

� Type checking dinamico:� Permette al compilatore di eseguire i suoi

compiti molto più velocemente

� Permette l'uso di costrutti considerati illegali nei linguaggi statici

Linguaggi dinamici – A.A. 2009/201022

� Permette una più rapida prototipazione

Page 23: T4 tipizzazione

Tipizzazione forte� Un linguaggio di programmazione adotta una

tipizzazione forte dei dati se una operazionetipizzazione forte dei dati se una operazione effettuata con operandi aventi tipo di dato non corretto viene impeditaco etto e e ped ta� Un'operazione di somma di interi con caratteri

Un'operazione in cui si superano i limiti di un� Un operazione in cui si superano i limiti di un array

Non esiste il linguaggio completamente� Non esiste il linguaggio completamente tipizzato in maniera forte

J è f t t ti i t ( iù d l C d l� Java è fortemente tipizzato (più del C e del Pascal)

Linguaggi dinamici – A.A. 2009/201023

Page 24: T4 tipizzazione

Tipizzazione debole� Un linguaggio di programmazione adotta una

tipizzazione debole dei dati se una operazionetipizzazione debole dei dati se una operazione effettuata con operandi aventi tipo di dato non corretto non viene impeditaco etto o e e ped ta

� La tipizzazione debole fa spesso uso di operatori di conversione (casting) per rendereoperatori di conversione (casting) per rendere omogenei gli operandi

Esempio: var x:= 5; var y:= “37”; x + y;� Esempio: var x:= 5; var y:= “37”; x + y;� In alcuni linguaggi (Visual Basic), y viene

tit d i t ( + 42)convertito ad intero (x+y=42)

� In altri linguaggi (Javascript), x viene convertito t i ( ”537”)

Linguaggi dinamici – A.A. 2009/201024

a stringa (x+y=”537”)

Page 25: T4 tipizzazione

Tipizzazione safe� Un linguaggio di programmazione adotta una

tipizzazione safe (sicura) dei dati se nontipizzazione safe (sicura) dei dati se non permette ad una operazione di casting di produrre un risultato erroneo o un crashp odu e u su tato e o eo o u c as

� Esempio (Visual Basic):var x:= 5; var y:= “37”; var z = x + y;var x:= 5; var y:= 37 ; var z = x + y;

� In questo esempio, il risultato è 42

f� L'operazione di conversione non fallisce su una stringa contenente un intero

� Se la stringa contenesse “Hi world”, la conversione darebbe NULL e z avrebbe un

Linguaggi dinamici – A.A. 2009/201025

valore indefinito (senza crash)

Page 26: T4 tipizzazione

Tipizzazione unsafe� Un linguaggio di programmazione adotta una

tipizzazione unsafe (non sicura) dei dati setipizzazione unsafe (non sicura) dei dati se permette ad una operazione di casting di produrre un risultato erroneo o un crashp odu e u su tato e o eo o u c as

� Esempio (C):int x= 5; char y [] = “37”; char *z = x + y;int x= 5; char y [] = 37 ; char z = x + y;

� Qui, z viene posto all'indirizzo di memoria 5 byte più in avanti di ybyte più in avanti di y

� Il contenuto di z non è definito, e può trovarsi l di f i d ll i di i di i d lal di fuori dello spazio di indirizzamento del

processo

Linguaggi dinamici – A.A. 2009/201026

� Una dereferenziazione di z può portare al crash

Page 27: T4 tipizzazione

Tipizzazione e polimorfismo� Con il termine polimorfismo si intende la

capacità (da parte di un linguaggio) dicapacità (da parte di un linguaggio) di differenziare il comportamento di un metodo o di un operatore in funzione dell’entità a cui è d u ope ato e u o e de e t tà a cu èapplicato

� Alcuni linguaggi gestiscono il polimorfismo� Alcuni linguaggi gestiscono il polimorfismo anche a livello di tipi di dato� Ad esempio in alcuni linguaggi è possibile definire� Ad esempio, in alcuni linguaggi è possibile definire

una tabella associativa (tabella hash)

� Le chiavi e gli elementi possono essere valori di un� Le chiavi e gli elementi possono essere valori di un qualsiasi tipo (o quasi)

� Non è necessario predefinire una struttura dati

Linguaggi dinamici – A.A. 2009/201027

� Non è necessario predefinire una struttura dati apposita per ogni possibile combinazione

Page 28: T4 tipizzazione

Parte 1

Duck typingyp g

Linguaggi dinamici – A.A. 2009/201028

Page 29: T4 tipizzazione

Tipizzazione classica ad oggetti� Nello schema classico di un linguaggio ad

oggetti gli attributi ed i metodi a disposizioneoggetti, gli attributi ed i metodi a disposizione di un oggetto sono:� quelli definiti dalla classe di appartenenza� quelli definiti dalla classe di appartenenza

dell'oggetto

quelli ereditati dalle superclassi dell'oggetto� quelli ereditati dalle superclassi dell oggetto

� (i metodi) implementati tramite interfacce

L l i f l i di hi� La relazione fra classi va dichiarata esplicitamente� Parole chiavi (Java) class, extends, interface,

implements

Linguaggi dinamici – A.A. 2009/201029

Page 30: T4 tipizzazione

Tipizzazione classica ad oggetti� In tale schema, individuare il tipo di un

attributo e/o la signature di un metodo implica:attributo e/o la signature di un metodo implica:� individuare la classe di appartenenza

dell'oggetto (binding) con il fine di individuaredell oggetto (binding), con il fine di individuare un tipo per l'attributo oppure una signaturevalida per il metodovalida per il metodo

� In caso di mancata individuazione, ripetere il controllo per tutte le superclassi (operationcontrollo per tutte le superclassi (operationdispatching – fino alla classe radice, es. Object)

� In altre parole individuare un attributo e/o una� In altre parole, individuare un attributo e/o una signature implica trovare una classe adatta (fra quelle imparentate) per l'oggetto

Linguaggi dinamici – A.A. 2009/201030

quelle imparentate) per l oggetto

Page 31: T4 tipizzazione

Tipizzazione classica ad oggetti� Tali controlli possono essere effettuati

A tempo di compilazione� A tempo di compilazione

� A tempo di esecuzione

� Di solito, si preferisce il tempo di compilazione (il costo a tempo di esecuzione sarebbe troppo elevato)� C++ senza l’uso di puntatori

� In Java, è fatto a tempo di esecuzione

Linguaggi dinamici – A.A. 2009/201031

Page 32: T4 tipizzazione

Duck typing� In un linguaggio di programmazione ad oggetti

dinamico basato sul meccanismo di duckdinamico, basato sul meccanismo di ducktyping, si rovescia tale concetto

Posso evitare di dichiarare esplicitamente la� Posso evitare di dichiarare esplicitamente la dipendenza di una classe da una superclasse

S i t i tt di t l l d i� Se istanzio un oggetto di tale classe ed uso i suoi metodi/attributi, l'unica cosa che conta è

h i t di/ tt ib ti i d fi itiche i metodi/attributi siano definiti

� Tecnica utilizzata per implementare il polimorfismo senza ricorrere alla ereditarietà

� Attenzione: il meccanismo di ereditarietà

Linguaggi dinamici – A.A. 2009/201032

esiste sempre!

Page 33: T4 tipizzazione

Duck typing� Un type checker basato su duck typing opera

tipicamente a livello di esecuzionetipicamente a livello di esecuzione

� Se vengono referenziati un attributo o un metodo di un oggetto si controlla solamentemetodo di un oggetto, si controlla solamente che il suddetto attributo o metodo siano definiti per quell'oggetto (duck test)definiti per quell oggetto (duck test)� Se sono definiti, si accede al dato o si invoca la

funzionefunzione

� Se non sono definiti, l'interprete esce con un i dimessaggio di errore

� Meccanismo molto più snello per il

Linguaggi dinamici – A.A. 2009/201033

compilatore e per il programmatore

Page 34: T4 tipizzazione

Duck typing� Quasi tutti i linguaggi dinamici moderni

adottano un meccanismo di gestione degliadottano un meccanismo di gestione degli attributi e delle signature degli oggetti basato su duck typingyp g� Perl, PHP, Ruby, Python

Anche alcuni linguaggi più classici possono� Anche alcuni linguaggi più classici possono fare uso di un meccanismo di duck typing

C++ tili t i t l t� C++, utilizzato con i template

� Template: particolare classe parametrica che i l t f i lità i ( li t )implementa una funzionalità generica (es. lista)

� Il template parametrico viene istanziato in una

Linguaggi dinamici – A.A. 2009/201034

classe concreta durante la compilazione

Page 35: T4 tipizzazione

Duck typing� In Java, un meccanismo di duck typing è

ottenuto tramite i genericsottenuto tramite i generics� Generics, classe parametrizzabile su un’altra

classeclasse

� public class Vettore<E> { … }

� …

� Vettore<Persona> v = new Vettore<Persona>

� Nell’oggetto istanziato ogni riferimento a E (variabili, parametri, valori di ritorno) viene concretizzato con la classe Persona

Linguaggi dinamici – A.A. 2009/201035

Page 36: T4 tipizzazione

Programmazione polimorfa� Il precedente esempio (stack.cpp) è un

classico della programmazione polimorfaclassico della programmazione polimorfa

� Alcuni problemi di programmazione si prestano bene ad una implementazione con leprestano bene ad una implementazione con le seguenti caratteristiche

È t f i “ i ”� È presente una funzione “generica”

� I dettagli della funzione cambiano in base al tipo d li didegli operandi

Linguaggi dinamici – A.A. 2009/201036

Page 37: T4 tipizzazione

Attenzione� Non bisogna confondere la tipizzazione lasca

del C con quella dei linguaggi dinamicidel C con quella dei linguaggi dinamici� C

Quello che interessa è l’occupazione della� Quello che interessa è l’occupazione della memoriaint i = ‘a’;� int i = a ;

� Funziona perché sizeof(char) <= sizeof(int)

Li i di i i� Linguaggi dinamici� Cercano di interpretare il significato dei valori in

modo dinamicomodo dinamico

Linguaggi dinamici – A.A. 2009/201037