Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Supporto ai Generics
Conclusioni
Luca Rocchini
1/24
Luca Rocchini Supporto alla programmazione generica nel compilatore ILDJIT
Introduzione
Supporto ai Generics
Conclusioni
La meta-programmazione
2/24
Luca Rocchini Supporto alla programmazione generica nel compilatore ILDJIT
Introduzione
Supporto ai Generics
Conclusioni
3/24
Luca Rocchini Supporto alla programmazione generica nel compilatore ILDJIT
Introduzione
Supporto ai Generics
Conclusioni
//Template C++
//Requirements:
// T must have the identity value
// T must have an operator ’+’
// T must have an operator ’=’
T sum(T arr[], int n) { La programmazione generica è
T res = T();
for (int i = 0; i < n; ++i) supportata da numerosi linguaggi di
res = res + arr[i];
return res; programmazione:
}
linguaggi funzionali: ML,
//C# Generics
T sum<T>(T arr[], int n)
Haskell . . .
where T : new(), IArith<T> {
T res = T(); linguaggi imperativi: C++,
for (int i = 0; i < n; ++i)
res = res.plus(arr[i]); Java (Type-Erasure), C# . . .
return res;
}
4/24
Luca Rocchini Supporto alla programmazione generica nel compilatore ILDJIT
Introduzione
Supporto ai Generics
Conclusioni
Static time
Python C Java
Ambiente di esecuzione per
Source compiler Source compiler Source compiler
applicazioni portabili su architetture
e sistemi operativi diversi:
CIL Bytecode CIL Bytecode CIL Bytecode
5/24
Luca Rocchini Supporto alla programmazione generica nel compilatore ILDJIT
Introduzione
Supporto ai Generics
Conclusioni
.NET
Lo standard ECMA-335 (.NET) specifica un’application virtual
machine simile alla più conosciuta Java Virtual Machine
Comprende
Common Intermediate Language (Bytecode)
Virtual Execution Environment (Macchina virtuale)
Meta-dati (Descrizione dei tipi, metodi . . . )
...
Caratteristiche
Supporto multi-linguaggio: object-oriented (e.g. C# . . . ),
funzionali (e.g. F# . . . )
Supporto multi-paradigma: programmazione riflessiva,
programmazione generica (Generics)
6/24
Luca Rocchini Supporto alla programmazione generica nel compilatore ILDJIT
Introduzione
Supporto ai Generics
Conclusioni
ILDJIT
L’implementazione del .NET sviluppata da:
Competitors
Mono
Microsoft .NET runtime
Caratteristiche innovative
Modularità
Parallelo e Distribuito
Multi-modalità: Ahead Of Time (AOT), Just In Time (JIT),
Dynamic Look Ahead (DLA)
7/24
Luca Rocchini Supporto alla programmazione generica nel compilatore ILDJIT
Introduzione
Supporto ai Generics
Conclusioni
8/24
Luca Rocchini Supporto alla programmazione generica nel compilatore ILDJIT
Introduzione
Supporto ai Generics
Conclusioni
9/24
Luca Rocchini Supporto alla programmazione generica nel compilatore ILDJIT
Introduzione
Supporto ai Generics
Conclusioni
10/24
Luca Rocchini Supporto alla programmazione generica nel compilatore ILDJIT
Introduzione
Supporto ai Generics
Conclusioni
10/24
Luca Rocchini Supporto alla programmazione generica nel compilatore ILDJIT
Introduzione
Supporto ai Generics
Conclusioni
Accompagnano il bytecode
Il paradigma riflessivo permette
a runtime:
l’accesso alle descrizioni
emissione di nuovi meta-dati
11/24
Luca Rocchini Supporto alla programmazione generica nel compilatore ILDJIT
Introduzione
Supporto ai Generics
Conclusioni
Accompagnano il bytecode
Il paradigma riflessivo permette
a runtime:
l’accesso alle descrizioni
emissione di nuovi meta-dati
Sistema critico
Efficienza nell’accesso →
Minore latenza di traduzione
Efficacia della descrizione →
Semplifica la riflessività
11/24
Luca Rocchini Supporto alla programmazione generica nel compilatore ILDJIT
Introduzione
Supporto ai Generics
Conclusioni
Metodi virtuali
12/24
Luca Rocchini Supporto alla programmazione generica nel compilatore ILDJIT
Introduzione
Supporto ai Generics
Conclusioni
Metodi virtuali
Virtual Table
Contiene gli indirizzi dei metodi il cui binding è dinamico
Richiede di conoscere compile-time il numero di metodi
Non permette ereditarietà multipla nella compilazione
incrementale (e.g JIT, DLA)
12/24
Luca Rocchini Supporto alla programmazione generica nel compilatore ILDJIT
Introduzione
Supporto ai Generics
Conclusioni
Problema
Quando la compilazione è incrementale (e.g. JIT, DLA) il numero
delle parametrizzazioni per metodi virtuali generici non è noto →
Virtual Table non è adatta
13/24
Luca Rocchini Supporto alla programmazione generica nel compilatore ILDJIT
Introduzione
Supporto ai Generics
Conclusioni
Problema
Quando la compilazione è incrementale (e.g. JIT, DLA) il numero
delle parametrizzazioni per metodi virtuali generici non è noto →
Virtual Table non è adatta
Tecniche alternative
2-Level Paged VTable è una estensione della Virtual Table per
gestire numero di parametrizzazione non noto
Interface Method Table permette di gestire ereditarietà multipla
e/o un numero non noto di metodi
13/24
Luca Rocchini Supporto alla programmazione generica nel compilatore ILDJIT
Introduzione
Supporto ai Generics
Conclusioni
Risultati sperimentali
No runtime check nei test con 20x speed-up nelle interface call
contenitori generici rispetto alla versione senza
supporto ai Generics
15/24
Luca Rocchini Supporto alla programmazione generica nel compilatore ILDJIT
Introduzione
Supporto ai Generics
Conclusioni
16/24
Luca Rocchini Supporto alla programmazione generica nel compilatore ILDJIT
Introduzione
Supporto ai Generics
Conclusioni
Sviluppi futuri
17/24
Luca Rocchini Supporto alla programmazione generica nel compilatore ILDJIT
Introduzione
Supporto ai Generics
Conclusioni
Domande?
18/24
Luca Rocchini Supporto alla programmazione generica nel compilatore ILDJIT
Introduzione
Supporto ai Generics
Conclusioni
Sistema di Tipi
Categorie
Tipi valore: contengono direttamente i dati e sono allocati sullo
Stack (e.g. Integer, Float, Double . . . )
Tipi riferimento: riferimenti ad istanze del tipo allocate nello heap
(e.g. Object, String, Array . . . )
19/24
Luca Rocchini Supporto alla programmazione generica nel compilatore ILDJIT
Introduzione
Supporto ai Generics
Conclusioni
Sistema di Tipi
Categorie
Tipi valore: contengono direttamente i dati e sono allocati sullo
Stack (e.g. Integer, Float, Double . . . )
Tipi riferimento: riferimenti ad istanze del tipo allocate nello heap
(e.g. Object, String, Array . . . )
Interoperabilità
Boxing: converte un istanza di tipo valore in un istanza di
tipo riferimento mantenendo la stessa struttura fisica
Unboxing: converte un istanza riferimento, il cui tipo dinamico è
un tipo valore, in un istanze di tipo valore
Le conversioni sono costose è presentano side-effects.
19/24
Luca Rocchini Supporto alla programmazione generica nel compilatore ILDJIT
Introduzione
Supporto ai Generics
Conclusioni
Type-Erasure
Funzionamento
Mappa le parametrizzazione su un tipo non generico (raw type)
1 Sostituzione dei parametri con il tipo Object
2 Sostituzione delle parametrizzazioni con il raw type
...
Problema
Nessun informazione a runtime sui parametri →
impossibile sui parametri riflessività, Type Checking . . .
Richiede Boxing e Unboxing per gestire tipi valori e tipi
riferimento contemporaneamente
20/24
Luca Rocchini Supporto alla programmazione generica nel compilatore ILDJIT
Introduzione
Supporto ai Generics
Conclusioni
Espressioni
Nome di Tipi (e.g. controlli di tipo)
Riferimenti ad oggetti statici (e.g. accesso ai campi statici)
Strutture dati necessarie per l’invocazione (e.g MGRCTX)
21/24
Luca Rocchini Supporto alla programmazione generica nel compilatore ILDJIT
Introduzione
Supporto ai Generics
Conclusioni
23/24
Luca Rocchini Supporto alla programmazione generica nel compilatore ILDJIT
Introduzione
Supporto ai Generics
Conclusioni
24/24
Luca Rocchini Supporto alla programmazione generica nel compilatore ILDJIT