T4 tipizzazione
-
Upload
majong-devjfu -
Category
Travel
-
view
695 -
download
0
Transcript of T4 tipizzazione
Parte 1
Tipizzazione dei datip
Linguaggi dinamici – A.A. 2009/20101
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
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
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
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)
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
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
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
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
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
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
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
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
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
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
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
,
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!
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
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
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
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
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
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
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”)
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)
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
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
Parte 1
Duck typingyp g
Linguaggi dinamici – A.A. 2009/201028
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
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
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
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!
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
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
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
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
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