ESERCIZI OBJECT ORIENTATION e FJ
Esercizio 1(anni 2010/11 e precedenti)
Per Featherweight Java e' definibile la funzione "Join" (vedi [BV]) utilizzabile
per fornire una regola di tipaggio per le espressioni condizionali?
Giustificare
In caso affermativo, definire formalmente la funzione Join
utilizzando assiomi e regole come fatto per le funzioni mtype e mbody.
Esercizio 2
Cosa si intende per "dynamic dispatch" nel contesto dei linguaggi O.O.?
Featherweight Java utilizza il dynamic dispatch? Giustificare.
Esercizio 3(anni 2010/11 e precedenti)
Completare le dimostrazioni in [BV].
Esercizio 4
Fornire gli assiomi e le regole di inferenza che descrivano
la nozione di sottotipo cosi' come utilizzata da Java, nel caso
che quest'ultimo utilizzasse lo structural subtyping.
Esercizio 5
Nella programmazione O.O. possono esserci casi in cui l'invocazione
di un metodo puo' provocare la necessita' di scegliere tra piu' possibili codici
da eseguire.
Questo puo' avvenire sia in presenza di metodi overloaded che di metodi
overridden.
Che differenza c'e' tra metodi overloaded e metodi overridden?
Cosa si intende per "static" e "dynamic" method resolution?
Il seguente e' un esempio del testo contenente un metodo che e'
sia overloaded che overridden e dove
SCType <: CType
class C {
...
function equals(other:CType): Boolean is
{ ... } // equals 1
}
class SC inherits C modifies equals {
...
function equals(other:CType): Boolean is
{ ... } // equals 1
function equals(other:SCType): Boolean is
{ ... } // equals 2
}
In presenza di static resolution per i metodi overloaded e dynamic per quelli
overridden, quale codice viene eseguito nelle seguenti invocazioni di metodo,
supponendo che c e c' sono stati dichiarati di tipo C ed sc di tipo SC?
Giustificare le risposte. Risposte senza giustificazione non verranno valutate.
c := new C;
sc := new SC;
c' := new SC;
c <= equals(c);
c <= equals(c');
c <= equals(sc);
c' <= equals(c);
c' <= equals(c');
c' <= equals(sc);
sc <= equals(c);
sc <= equals(c');
sc <= equals(sc);
Soluzione
Esercizio 6
In FJ e' possibile dimostrare il seguente
Theorem [Progress]
Suppose e is a well-typed expression.
(1) If e includes new C0(e1,..,en).f as a subexpression, then fields(C0)=T1f1,..,Tnfn and f is in {f1,..,fn}.
(2) If e includes C0(e1,..,en).m(d1,..,dk) as a subexpression, then mbody(m,C0)=(x1,..,xj, e0) and k=j.
In sintesi, cosa ci dice questo teorema?
Esercizio 7
Alcuni linguaggi di programmazione O.O. hanno sistemi di tipo che sono invariant.
Cosa significa?
Questi linguaggi hanno problemi con i metodi binari, in particolare quando si
definiscono delle sottoclassi.
Supponiamo che quella seguente sia una definizione di classe in uno di tali linguaggi (dove CType e' il tipo degli oggetti della classe C).
class C {
...
function equals(other:CType): Boolean is
{ ... }
...
}
Se si definisse ora la seguente sottoclasse
class SC inherits C modifies equals {
...
function equals(other:CType): Boolean is
{ super <== equals(other);
...
}
...
}
a quali problemi si andrebbe incontro?
Esercizio 8
Supponiamo di avere le seguenti definizioni in FJ:
class A extends Object {
A() { super(); }
}
class B extends Object {
B() { super(); }
}
La seguente espressione FJ e' correttamente tipabile?
(A)(Object)new B()
Perche?
Perche' si e' introdotta in FJ la seguente
regola di tipo?
Gamma |- e : D C non sottotipo di D D non sottotipo di C
stupid warning
----------------------------------------------------------------------
Gamma |- (C)e : C
Esercizio 9
Dire, giustificando la risposta, se l'approccio del sistema di tipi
di FJ, e quindi di Java, e' a' la Curry o a' la Church.
Esercizio 10
Descrivere l'algoritmo di type-checking per il lambda calcolo tipato a' la Church
utilizzando assiomi e regole di inferenza, nello stile di quanto di fa per FJ.
Esercizio 11
Definire formalmente quello che K.Bruce intende per
Invariant Type Systems per linguaggi O.O.
Quali i vantaggi di avere type system che sono invariant?
Quali gli svantaggi? Fornire qualche esempio esplicativo.
Esercizio 13(anni 2010/11 e precedenti)
Descrivere l'F-bounded polimorphism cosi' come utilizzato in Java.
Uso, vantaggi e svantaggi.
Esercizio 14
Cosa si intende per
nominal e structural subtyping?
Qual e' l'approccio di Java? e quello di Ocaml?
Quali i vantaggi e svantaggi dei due approcci?
Esercizio 15
(a)
Il cast in Java quali problemi crea?
Quali garanzie ci forniscono a riguardo i teoremi di FJ i cui enunciati
sono stati studiati nel corso?
(b)
Il sistema di tipi di Java e' invariante, covariante o controvariante
rispetto ai tipi degli argomenti e del risultato dei metodi
overridden nelle sottoclassi? Quali problemi comporta
tale invarianza/covarianza/controvarianza? Quali vantaggi?
Si potrebbe definire il type system di Java diversamente per migliorarlo?
Esercizio 16
In Ocaml la definizione di una classe ha la forma
class name =
object (self:'self)
....
....
end;;
Qual e' il significato di "self" e di "'self"?
Quale vantaggio fornisce l'uso di "'self" relativamente ai metodi binari?
Esercizio 17
Il seguente segmento di codice e' parte di una definizione di
classe in Ocaml:
class colorPoint =
object (self:'self)
inherit point as super
:
:
Descrivere l'uso del costrutto (self:'self) e come si
riflette nel tipo delle classi.
Descrivere le problematiche presenti in Java
che l'uso di tale costrutto impedisce che siano presenti in Ocaml.
Esercizio 18
Descrivere cosa si intende per subtyping nominale e subtyping
strutturale. Descriverne vantaggi e svantaggi.
Che specie di subtyping ha Java? e Ocaml? Fornire un esempio per entrambi
il linguaggi.
Esercizio 19
Dire se ed eventualmente in quali casi in OCaml una sottoclasse definisce anche
un sottotipo.
Esercizio 20
Definire una classe in OCaml i cui oggetti abbiano il tipo seguente
< pippo : int; pluto : int; paperino : int → int → unit; paperina : 'a → bool > as `a
Soluzione
Esercizio 21
Inserire le premesse (dandone giustificazione) della seguente regola (T-invk)
utilizzata dal type system di FJ per tipare l'invocazione di metodo.
???
------------------------------------
Γ |- e0.m(e) ∈ C
In cosa si discosta il type system di FJ rispetto a quello di Java
(tenuto conto ovviamente che FJ e' un frammento di Java)?
Esercizio 22
Definire i concetti di covarianza e controvarianza di una relazione
rispetto ad un operatore e giustificare informalmente la controvarianza della relazione
di sottotipo per il costruttore
di tipo Ref. Giustificare quindi perche' non e' possibile modificare
il tipo delle instance variables in una sottoclasse.
Esercizio 23
Quello che segue e' uno schema di codice Ocaml-like in cui un metodo m viene "overridden" nella sottoclasse,
modificando da S ad S' il tipo del suo argomento.
class aClass2 =
object
...
method m(s:S) = ...
...
end
class aSubclass2 =
object
inherits aClass2 as super
...
method m(s:S.) = ...
...
end
Aggiungere del codice allo schema, una volta per mostrare che S' deve necessariamente essere un sottotipo di S;
ed una seconda volta per mostrare che S deve essere un sottotipo di S'. A quale conseguenza portano i due esempi?
Esercizio 24
Quale problema viene introdotto in Java dall'uso del downcast? Perche' allora viene utilizzato?
Perche' il type system di Java per FJ viene esteso con la regola (T-SCast) (stupid cast)?
Esercizio 25
Cosa si intende per Subtyping Polymorphism?
Le due seguenti funzioni OCaml hanno lo stesso body, ma comportamenti differenti.
Perche?
let bumpd1 (p:< get_x : int; get_y : int; setcoord : int -> int -> unit >)
= p#setcoord (p#get_x +1) (p#get_y +1);;
let bumpd2 p = p#setcoord (p#get_x +1) (p#get_y +1);;
Definire un elemento myPoint tale che bump2 myPoint risulti
un'applicazione corretta, mentre bump1 myPoint no.
C'e' un modo per poter
applicare correttamente la funzione
bump1 all'argomento myPoint? Giustificare.
Esercizio 26
Perche' il downcast in Java e' pericoloso? E perche', nonostante cio', e' stato
inserito nel linguaggio?
Esercizio 27
Perche' non e' possibile avere overridden methods con un numero
differente di argomenti anche ammettendo la possibilita' di modificare
il tipo degli input types e dei return types?
Soluzione