domenica 23 novembre 2008

Tipi Generici in Java,C#,C++

Come si è potuto intuire, il polimorfismo usato nella programmazione generica è del tipo parametrico. Vale la pena soffermarci per analizzare le differenze dei tipi generici nei linguaggi C++, Java e C#.

Tipi genenici in C# [MSDN]
In C#, quando un tipo generico viene compilato in MSIL (Microsoft intermediate language), contiene metadati che lo identificano come dotato di parametri di tipo.
Le modalità di utilizzo di MSIL per un tipo generico, differiscono a seconda che il parametro di tipo fornito sia un tipo di valore o un tipo di riferimento.
Quando un tipo generico viene costruito con un tipo di valore come parametro, viene creato un tipo generico specializzato con il parametro/parametri forniti, sostituendoli nelle posizioni appropriate in MSIL. I tipi generici specializzati vengono creati una volta per ogni tipo di valore univoco utilizzato come parametro.
Es.1

/* Viene generata dal compilatore una versione specializzata della classe Stack,in seguito, ad ogni occorrenza di uno stack con valori int, viene riutilizzato la classe specializzata Stack generata */
Stack<int> stack;
Stack<short> stack; // Generata un’altra versione specializzata della classe Stack per short

Se il parametro di tipo fornito è un tipo di riferimento. viene generata una versione specializzata della classe che archivia riferimenti a oggetti.
Per ogni successiva occorrenza di un classe con il parametro di tipo di riferimento, diversamente dai tipi di valore, non viene creata un'altra versione specializzata della classe con tipo generico, ma riutilizza la versione specializzata generata in precedenza sostituendo il nuovo tipo di riferimento.
Es.2

class Pluto{} class Pippo{}
/*viene generata una versione specializzata della classe Stack,la quale archivia riferimenti a oggetti di tipo Pluto*/
Stack<Pluto> stackOne = new Stack<Pluto>();
Stack
<Pippo> stackTwo = new Stack<Pippo>();/* viene creata un'istanza della versione specializzata della classe Stack generata in precedenza e viene impostata la variabile Pippo per fare riferimento ad essa */

C# per l’implementazione dei tipi generici, usa la condivisione del codice(Code Sharing) per i tipi referenziali, mentre usa la specializzazione del codice(Code Specialization) per i tipi primitivi.


Tipi genenici in C++
La tecnica che utilizza C++ per rappresentare i tipi generici è chiamata Code Specialization(specializzazione di codice). Il compilatore genera una specializzazione della classe parametrica per ogni istanza di un tipo parametrizzato.
Es.3

/* stack, stackOne, stackTwo hanno una versione specializzata della classe Stack diversa tra loro */
std::Stack<int> stack = new std::Stack
<int>() ;
std::Stack
<Pluto> stackOne = new std::Stack<Pluto>();
std::Stack
<Pippo> stackTwo = new std::Stack<Pippo>();


Tipi genenici in Java
L’estensione di Java che permette l’uso dei generici si chiama GJ, sviluppato a partire da Java Pizza; per la rappresentazione dei tipi generici usa la condivisione del codice(Code Sharing), ovvero viene generato il codice per una sola rappresentazione del tipo parametrico e poi vengono mappate le varie istanze concrete su di esso, gestendo i controlli e le conversioni dove sia necessario.

Es.4
/* il compilatore crea una versione specializzata della classe Stack */
Stack<Integer> stack = new Stack
<Integer>() ;
/*viene creata un'istanza della versione specializzata della classe Stack generata in precedenza e viene impostata la variabile Pluto per fare riferimento ad essa */
Stack stackOne
<Pluto> = new Stack<Pluto>();
/* uguale al commento precedente, ma viene impostata la variabile Pippo */
Stack stackTwo
<Pippo> = new Stack<Pippo>();

L’approccio usato nei generici in java a condivisione di codice, limita la generalizzazione ai soli riferimenti e rifiuta a compile-time le istanze generiche che utilizzano i tipi primitivi.
Es. In Java non possiamo dichiarare uno Stack, ma si deve dichiare Stack;
Cosa differente accade nei linguaggi C# e C++, dove vengono create rappresentazioni specializzate.

[MSDN] http://msdn.microsoft.com/

Daniele Licari

Nessun commento: