Analisi e differenti approcci alle trasformazioni di modelli · come parte del metamodello UML. Le...
Transcript of Analisi e differenti approcci alle trasformazioni di modelli · come parte del metamodello UML. Le...
Scuola Politecnica e delle Scienze di BaseCorso di Laurea in Ingegneria Informatica
Elaborato finale in Programmazione I
Analisi e differenti approcci alle
trasformazioni di modelli
Anno accademico 2017/2018
Candidato Angelo Delicato
matr. N46002831
1
Indice
Introduzione 4
Capitolo 1: Model-driven engineering, modelli e metamodelli 5
I modelli . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
I metamodelli . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
La gerarchia a 4 livelli . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
Metamodeling: esempio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
Capitolo 2: Trasformazioni di modelli e linguaggi di trasformazione 11
Trasformazioni di modelli . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
Lo standard OMG: QVT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
ATL: ATLAS Transformation Language . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
Kermeta . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
Capitolo 3: Trasformazione in ATL e Python 21
Metamodello OrariCorsi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
Metamodello OrariDocenti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
Obiettivo della trasformazione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
La trasformazione in ATL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
La trasformazione in Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
Conclusioni 31
Bibliografia 32
3
Introduzione
In ambito informatico e, piu in generale, in quello ingegneristico e sempre necessare adottare un
approccio che permetta di affrontare con sistematicita i problemi piu complessi.
Una delle grandi difficolta risiede nel dover lavorare con una grande mole di dati che sono, di nor-
ma, di tipo eterogeneo. Con il dilagare della Rete, inoltre, tale problematica diviene ancora piu
pressante. Nasce quindi l’esigenza di trovare soluzioni che possano ovviare a tale problematica,
nasce l’ingegneria guidata dal modello (a cui d’ora in poi ci si riferira con la terminologia inglese
Model-driven engineering, di norma abbreviato in MDE. Attraverso tale metodologia di sviluppo
e possibile lavorare ad un livello di astrazione piu elevato, facilitando il lavoro e migliorando l’effi-
cienza. Tale elaborato ha lo scopo di mettere in luce gli aspetti piu salienti e differenti approcci alle
trasformazioni di modelli, che costituiscono una parte fondamentale del MDE. Nel primo capitolo
vengono introdotti, oltre al gia citato MDE, i modelli e i metamodelli con tutte le loro caratteristi-
che piu importanti.
Nel secondo capitolo vengono presentate le trasformazioni di modelli e, in particolare, vengono
mostrati alcuni linguaggi di trasformazione di modelli quali QVT (lo standard OMG), ATL e
Kermeta. Vengono inoltre messe in evidenza le principali differenze che intercorrono tra questi
linguaggi.
Nel terzo capitolo vengono realizzati due metamodelli specifici con la relativa istanziazione di un
modello (sorgente) e viene eseguita una trasformazione tra modelli utilizzando prima il linguaggio
ATL e, successivamente, viene effettuata la stessa trasformazione utilizzando un linguaggio di pro-
grammazione tradizionale (Python) attraverso l’aiuto di un particolare framework realizzato dalla
community di sviluppatori.
Nel capitolo conclusivo vengono espresse delle considerazioni riguardanti tale metodologia di
sviluppo software.
4
Capitolo 1: Model-driven engineering, modelli e metamodelli
L’utilizzo di astrazioni e sempre stato un approccio utilizzato dagli sviluppatori nella realizzazione
di soluzioni software. Tali astrazioni, pero, sono effettuate nel ”dominio della soluzione”. E’ neces-
sario, dunque, un modo per innalzare ulteriormente il livello di astrazione per poter rappresentare
non la soluzione, bensı il problema stesso in termini astratti [7]
Nasce in questo modo l’MDE il quale permette di definire:
• Dei linguaggi di modellazione per poter formalizzare strutture, comportamenti e requisiti
all’interno di un determinato problema specifico. Tali linguaggi si avvalgono, pertanto, di
metamodelli, i quali sono introdotti nelle pagine successive
• Linguaggi di trasformazione e generatori per poter manipolare istanze di determinati modelli
e generare diverse rappresentazioni di un modello o, addirittura, del codice sorgente.
I modelli
Un modello e una rappresentazione esplicita di fenomeni nel mondo reale dal punto di vista di
coloro che vogliono esplorare, trasformare quella specifica parte del mondo reale. Quando si va a
realizzare un modello la cosa fondamentale e definire lo scopo di tale modello, dunque e necessa-
rio capire a quali domande si vuole andare a rispondere tramite l’ausilio del modello in questione.
Inoltre e fondamentale definire dei ”confini”, cioe e necessario concentrarsi solo sulla parte che
veramente e di nostro interesse, disinteressandosi di tutto il resto. Dopodiche e necessario identifi-
care i concetti rilevanti e analizzare quali sono le relazioni che intercorrono tra di essi. Realizzare
un modello non e un processo lineare, ma molto spesso richiede di iterare questi passaggi prima di
poter ottenere un modello che sia adatto alle nostre esigenze.
E’ importante notare che i modelli non sono ne giusti ne sbagliati [8], ma che possono solamen-
te essere piu o meno adatti per quanto riguarda il loro scopo e possono pero essere incosistenti
riguardo la loro rappresentazione.
5
I metamodelli
Un metamodello e esso stesso un modello che viene utilizzato per descrivere un altro modello
utilizzando un linguaggio di modellazione. Il prefisso meta deriva dal greco e significa ”dopo,
oltre”; ma in questo caso la situazione e relativa perche un modello puo essere sia un modello o
un metamodello. Dunque un metamodello e semplicemente un modello ad un differente livello
di astrazione che ci permette di fare dichiarazioni riguardanti la struttura di un altro modello (o
un intero set di modelli) senza interessarsi del contenuto. Il modello dovra essere conforme al suo
metamodello alla stessa maniera in cui un programma per computer e conforme alla grammatica
del linguaggio di programmazione in cui e scritto [9]. Ci sono vari benefici nell’ausilio di un
metamodello:
• Ci si assicura che tutti utilizzino il linguaggio di modellazione in maniera consistente.
• Utilizzare un metamodello permette di utilizzare degli algoritmi per verificare la correttezza
del modello.
• Si ha un alto grado di disaccoppiamento. In questo modo un metamodello potrebbe risultare
utile in situazioni totalmente differenti.
Ricapitolando: un metamodello e una tipologia speciale di modello che specifica al sintassi astrat-
ta di un linguaggio di modellazione.
La gerarchia a 4 livelli
Ma a cosa si conforma un metamodello?
Un metamodello, semplicemente, si conforma ad un meta-metamodello. Teoricamente potremmo
iterare questo processo all’infinito poiche un metamodello puo essere sia un modello che un me-
tamodello in base alla prospettiva da cui lo si guarda. Lo standard adottato da OMG per risolvere
i problemi legati all’eterogeneita della immensa quantita di dati che vengono scambiati al giorno
d’oggi e MOF (Meta Object Facility [3]. Tale standard definisce 4 layer:
6
Il livello M0 e quello piu in basso e contiene le istanze run-time degli elementi del modello (quello
definito al livello M1).
Un modello e un’istanza di un metamodello. Un modello rappresenta il sistema al livello M1 e si
conforma ad un linguaggio la cui sintassi astratta e rappresentata nel livello soprastante. Per questo
motivo si puo dire che il modello si conforma al metamodello.
7
Allo stesso modo il metamodello si conforma ad un linguaggio la cui sintassi astratta e rappresenta-
ta nel livello soprastante. Quindi si puo dire che il metamodello si conforma al meta-metamodello.
La responsabilita principale di un metamodello e definire il linguaggio per specificare i modelli.
UML e OMG CWM sono esempi di metamodelli.
8
A terminare la gerarchia vi e il meta-metamodello che e riflessivo e pertanto si conforma ad un
linguaggio la cui sintassi astratta e rappresentata da se stesso; questo e il livello M3. Di norma un
meta-metamodello e piu compatto rispetto ad un metamodello e spesso e possibile che piu di un
metamodello si conformi ad esso.
Vi e, infine, la versione di Bezivin che raggruppa diversamente la gerarchia realizzando un 3+1
in cui il sistema e rappresentato dal layer M0 mentre i tre restanti corrispondono alla rappresenta-
zione di tale sistema [6]
9
Metamodeling: esempio
Di seguito e presentato un banalissimo esempio che mostra la relazione che intercorre tra un mo-
dello e il suo metamodello. Il compito primario di un metamodello e quello di definire la semantica
del modello che si andra ad istanziare.
Nella figura soprastante vi sono le due metaclassi Class e Association che sono entrambe definite
come parte del metamodello UML. Le classi Studente e Corso di Laurea sono entrambi istanze
della metaclasse Class e l’associazione tra Studente e Corso di Laurea e un’istanza della meta-
classe Association. Di seguito un’immagine che esplica la differenza sostanziale tra un modello e
una sua particolare istanza.
10
Capitolo 2: Trasformazioni di modelli e linguaggi di trasformazione
In questo capitolo verranno introdotte le trasformazioni di modelli e alcuni dei linguaggi di trasfor-
mazione di modelli (lo standard QVT, ATL, Kermeta).
Trasformazioni di modelli
Lo scopo e quello di generare un nuovo modello, definito modello target, a partire da un modello di
partenza, definito modello source, seguendo delle regole definite formalmente. Perche si effettuano
tali trasformazioni?
• Potrebbe capitare di dover estrarre un particolare subset dal modello sorgente (in pratica e
come se si eseguisse una query sul modello sorgente).
• Generare un nuovo modello che si conforma ad un altro metamodello che sia in qualche modo
”equivalente” al modello di partenza.
• Rappresentare il modello sorgente da un diverso punto di vista.
L’esempio basilare (che puo essere considerato l’Hello World del Model-driven engineering):
Family 2 Person. Si realizza, pertanto, una trasformazione che a partire da una lista di famiglie
realizza una lista di persone. Il metamodello di una famiglia e il seguente:
Ogni famiglia ha un cognome ed e costituita da un padre, una madre e un numero variabile di
figli/figlie (0,1 oppure n), tutti con un nome. Il metamodello di una personae, invece, il seguente:
11
Ogni persona e composta da un Nome + Cognome (fullName) e puo essere un Maschio oppure una
Femmina. Dunque tale trasformazione vuole realizzare, a partire da una lista di famiglie, una lista
di persone. E’ dunque necessario ricavare per ogni membro della famiglia il cognome e eliminare
qualsiasi tipo di associazione tra membri appartenenti alla stessa famiglia. Di seguito uno schema
riassuntivo delle trasformazioni tra modelli:
E’ possibile, inoltre, realizzare dei modelli che siano indipendenti dalla specifica implementazione.
Si ha il seguente schema concettuale:
12
Il PIM (platform independent model e, appunto, un modello che non contiene informazioni spe-
cifiche riguardanti la piattaforma di implementazione. Il PSM (platform specific model, d’altra
parte, e il modello realizzato per la specifica implementazione (ad esempio Java oppure C++). Si
ha, quindi, che per un singolo PIM possono esserci piu PSM. Una trasformazione di modelli,
quindi, e un’operazione che permette di ottenere un PSM a partire da un PIM.Tale trasformazione
ingloba in se tutte le regole necessarie per poter effettuare l’operazione; infatti all’interno della tra-
sformazione sono definite tutte le regole che permettono di tradurre i costrutti del PIM in quelli del
PSM. Oltre a poter generare dei PSM a partire da PIM (model to model transformation) e possibile
trasformare anche un PSM in codice sorgente oppure generarne la documentazione (model to text
transformation).
I linguaggi di trasformazione di modelli possono seguire due tipi di paradigmi di programmazione:
relazionale (cioe dichiarativo) oppure operazionale (imperativo).
Il paradigma relazionale (dichiarativo) permette di esprimere un entita in termini di somiglianza
con un’altra; non viene pero descritto il modo in cui questa somiglianza viene implementata. Nello
specifico caso delle trasformazioni di modelli si esprime solamente quali sono le relazioni tra il
modello sorgente e il modello target.
Il paradigma operazionale (imperativo) e quello piu diffuso nella totalita dei linguaggi di program-
13
mazione tradizionali, esso permete di esprimere come un’entita debba essere realizzata. Nel caso
delle trasformazioni di modelli si esprime il modo in cui il modello target debba essere modificato
in relazione al modello sorgente.
Lo standard OMG: QVT
QVT (Query/View/Transformation) rappresenta lo standard OMG per le trasformazioni di mo-
delli; esso e nato nel 2001 ed la sua versione 1.1 e stata rilasciata nel 2011 [5]. Tale standard
presenta la seguente architettura:
Come e facilmente intuibile dal nome, QVT specifica un linguaggio per:
• eseguire query
• estrapolare viste
• realizzare trasformazioni
Essendo QVT uno standard, esso implementa entrambi i paradigmi di programmazione.
Quello dichiarativo e rappresentato dalle entita Relations, Core e Relations2Core transforma-
tion.
Relations e un metamodello che, tra le caratteristiche salienti, permette di realizzare dei matching
con altri metamodelli implementando la Traceability, cioe la presenza di strutture che mettono in
relazione gli elementi del modello sorgente con quelli del modello target.
Core e. invece, un modello che, in linea di massima, permette di eseguire le stesse operazioni di
Relations. La differenza tra Relations e Core risiede nel grado di astrazione (non a caso il primo
e un metamodello, mentre il secondo un modello), infatti il linguaggio di Core e piu ristretto e,
14
dunque, necessita di utilizzare delle definizioni piu complesse rispetto a Core. Tale gap semantico
e colmato da Relations2Core transformation.
Il paradigma operazionale e rappresentato dai due blocchi esterni: Operational Mappings e Black
Box. Il paradigma imperativo e necessario poiche in alcune situazioni non e possibile esprimere una
trasformazione utilizzando solamente costrutti dichiarativi (nel MDE, pero, si tende ad utilizzare
tale paradigma solamente quando strettamente necessario).
QVT permette, inoltre, di eseguire trasformazioni bidirezionali, modificando sia il modello sorgen-
te che quello target. Dal punto di vista dell’organizzazione QVT permette di definire le trasforma-
zioni in moduli (proprieta di modularita) e permette di godere della riusabilita del codice attraverso
l’ereditarieta.
Una trasformazione QVT permette di generare dei nuovi modelli a partire da un modello sorgente
(quindi non solamente di modificare un modello target gia esistente). Nel caso in cui il modello tar-
get sia gia esistente viene effettuato un update con cancellazione, cioe tutte le entita del modello
target che non presentanto corrispondenze nel modello sorgente vengono scartate. Di seguito una
tabella riepilogativa delle caratterstiche appena presentate:
ATL: ATLAS Transformation Language
ATL e un linguaggio di trasformazione di modelli sviluppato da INRIA e utilizzato principalmente
all’interno dell’EMF (Eclipse Modeling Framework). Anch’esso, come lo standard QVT, mette a
disposizione entrambi i paradigmi di programmazione.
Oltre alle citate trasformazioni M2M, ATL permette anche di trasformare un modello in istanze di
tipi primitivi attraverso l’ausilio delle ATL Queries, ma tale argomento non e di nostro interesse al
momento. Infine, il linguaggio ATL permette anche di creare librerie indipendenti e di riutilizzarle
in piu unita ATL differenti.
15
Una trasformazione M2M viene realizzata attraverso un’unita ATL Module. Tale unita permette
allo sviluppatore di definire in che modo devono essere generati i modelli target a partire da quelli
sorgente; ogni modello che prende parte a tale trasformazione deve, ovviamente, conformarsi al
rispettivo metamodello.
Da cosa e composto un ATL Module? Un singolo modulo ATL e costituito da 4 elementi primitivi:
• Una sezione header iniziale in cui vengono specificati alcuni attributi come il nome del modu-
lo (che, come accade in Java, deve essere uguale al nome del file), i moduli in ingresso/uscita
e il tipo di esecuzione della trasformazione. E’ possibile, infatti, scegliere tra due modalita
di esecuzione: normal oppure refining. La prima tipologia e quella che viene utilizzata in
genere per creare dei modelli target che differiscono da quelli sorgente. La seconda, invece, e
pensata appositamente per trasformazioni in cui il modello sorgente e target sono molto simili
(refining transformation). Utilizzando tale modalita, infatti, e necessario definire solamente
gli elementi del modello che andranno trasformati; la parte restante verra ricopiata nel model-
lo target senza subire variazioni. In ATL entrambi i modelli devono conformarsi allo stesso
metamodello.
• Una sezione (opzionale) in cui e possibile importare una o piu librerie tramite la keyword uses
nomelibreria;.
• Un insieme di rules che definiscono come verranno generati i modelli target. ATL fornisce tre
tipologie di rules:matched rules, lazy rules e called rules.
Le matched rules costituiscono la parte dichiarativa di una trasformazione ATL. Esse sono
costituite da due sezioni obbligatorie e due opzionali. Nelle sezioni obbligatorie e necessario
inserire quali sono gli elementi target e quelli sorgente; siccome molto spesso e di interesse
performare la trasformazione su un particolare sottoinsieme di elementi che si conformano ad
un metamodello e possibile specificare delle condizioni che devono essere soddisfatte dagli
elemeneti su cui verra effettuata la trasformazione. Nella sezione relativa al target, invece,
viene definito in quale modo dovra essere generato il modello in uscita. La prima sezione
opzionale permette, invece, di aggiungere delle variabili locali alla regola. La seconda (opzio-
nale), invece, e quella che permette di inserire del codice imperativo che verra eseguito dopo
la generazione dei modelli target.
16
Le lazy rules sono simili in tutto e per tutto alle matched rules, l’unica cosa che le differenzia
e che tali regole vengono eseguite solamente quando richiamate da un’altra regola.
Le called rules permettono di implementare del codice imperativo. Tali regole accettano pa-
rametri in ingresso e sono costituite da tre sezioni (che, tra l’altro, sono tutte opzionali): una
sezione target, una sezione per il codice imperativo e una per le variabili locali. Tali rules,
infatti, permettono di generare dei modelli target a partire dai dati ingresso e dalle variabili
locali (eventualmente); questo perche e assente la sezione dedicata al modello sorgente da
cui estrapolare informazioni. La sezione imperativa, infine, permette di eseguire dell’ulteriore
codice imperativo contenuto in un’altra called rule. Questa tipologia di regole viene eseguita
solamente se richiamata nella sezione imperativa di una matched rule o in quella di un’altra
called rule.
• Un insieme di helpers che e il corrispettivo in ATL dei metodi Java. La caratteristica peculiare
di tali helper e che devono necessariamente avere un tipo di ritorno e un contesto in cui essere
definiti. E’ possibile fare un’analogia tra il contesto e l’appartenenza di un metodo ad una
specifica classe. Gli helper accettano anche parametri in ingressi, ma essi sono opzionali. E’
possibile poi definire dei particolari helper, gli attributi, che sono in tutto e per tutto degli
helper, ma senza parametri in ingresso. Il guadagno nell’utilizzare gli attributi al posto degli
helper con zero parametri in ingresso e che tali attributi vengono eseguiti solamente quando
richiamati la prima volta, mentre gli helper vengono rieseguiti ad ogni chiamata [1].
Le sopracitate caratteristiche di ATL implementano funzionalita che sono espresse anche dallo
standard QVT presentato in precedenza (come ad esempio la presenza di entrambi i paradigmi).
La possibilita di definire helper e (varie tipologie di) rules donano anche ad ATL la proprieta di
modularita; infine, come per QVT, viene implementata la riusabilita tramite ereditarieta.
ATL si differenzia da QVT per il modo in cui vengono gestiti il modello sorgente e quello target:
il modello sorgente e navigabile, ma non modificabile, mentre il modello target e (ovviamente)
modificabile, ma non navigabile. A causa di questa peculiarita ATL non permette di eseguire tra-
sformazioni bidirezionali. Di seguito una tabella riepilogativa delle caratteristiche di ATL:
17
Kermeta
Kermeta e un linguaggio di metamodeling che permette di descrivere sia il comportamento che la
struttura dei modelli. Esso e stato realizato per essere conforme sia a MOF (per la precisione ad
EMOF) che ad Ecore.
A differenza dei due linguaggi presentati in precedenza, Kermeta implementa solamente il paradig-
ma di programmazione imperativo, cioe quello utilizzato nella totalita dei linguaggi di programma-
zione ad oggetti. Tale peculiarita porta con se una serie di pro e contro.
Il linguaggio e completamente assimilabile ad un linguaggio di programmazione moderno e le tra-
sformazioni possono essere considerate in maniera simile a qualsiasi altro linguaggio di program-
mazione non dichiarativo. Inoltre sono implementati costrutti come if,while, switch ed e possibile
addirittura gestire e sollevare eccezioni.
La modularita e implementata anche in questo caso attraverso l’ereditarieta, ma i costrutti utiliz-
zati sono piu complessi. E’ possibile, inoltre, usufruire dell’ereditarieta multipla; tale caratteristica,
come e ben noto, porta con se l’inconveniente del diamond problem.
Come si evince dall’immmagine precedente, sorge il problema riguardante l’ereditarieta della fun-
18
zionalita che viene ridefinita da piu di una classe padre (in questo caso la funzione f()). Tale
problema, risolto in informatica da diverso tempo, puo essere risolto sia in maniera implicita (cioe
viene assegnata implicitamente la funzione da ereditare da uno dei genitori) oppure esplicita (e il
programmatore a definire da quale genitore deve essere ereditata la funzione).
Kermeta adotta quest’ultima soluzione permettendo, in maniera estremamente semplice, di sceglie-
re da quale genitore ereditare [2]:
Infine, in maniera completamente analoga ad ATL, sono messi a disposizione del programmatore
una serie di costrutti per gestire collezioni di elementi (come ci si aspetta da un linguaggio di tra-
sformazione di modelli) e una serie di funzionalita interessanti per lavorare sugli elementi di tali
collezioni.
Ovviamente non e tutto oro cio che luccica e infatti alcune operazioni che sono facili in altri lin-
guaggi dichiarativi diventano complicate con Kermeta. Inoltre per leggere e scrivere dei modelli e
obbligatorio utilizzare delle primitive specifiche poiche tali operazioni non vengono eseguite auto-
maticamente dal linguaggio. Una grave pecca di tale linguaggio e, poi, la mancanza della possibilita
19
di modificare un modello gia esistente e, come ATL, l’impossibilita di effettuare trasformazioni
bidirezionali.
20
Capitolo 3: Trasformazione in ATL e Python
In questo capitolo vengono realizzati due metamodelli ed eseguita una trasformazione tra di essi
sia attraverso il linguaggio ATL sia attraverso un’implementazione specifica di Ecore su Python.
Proprio per questa motivazione (e anche perche ATL e parte integrante dell’EMF) si e deciso di
utilizzare Ecore per il metamodeling.
Sono stati dunque realizzati i metamodelli OrariCorsi e OrariDocenti.
Metamodello OrariCorsi
Tale metamodello nasce come generalizzazione dall’impostazione degli orari dei corsi utilizzata
nel nostro ateneo.
Come si evince dall’immagine soprastante sono state realizzate le seguenti classi:
21
• La classe Lezione che contiene i campi docente, nome(il nome della materia), aula, orario
di inizio e orario di fine lezione.
• La classe Giorno che contiene il nome del giorno specifico e una EReference alla classe
Lezione (in un giorno si svolgeranno da 0 ad n lezioni)
• La classe Canale che contiene anch’essa il nome di un determinato Canale universitario e
una EReference alla classe Giorno (ogni canale ha una serie di giorni, massimo 5, in cui si
svolgono lezioni)
• Le classi Anno e CorsodiStudio hanno la stessa struttura e fungono da container che svilup-
pano la gerarchia di un determinato Corso di studio.
• Nella parte superiore della piramide e, infine, presente la classe Universita che funge da
radice del metamodello
Ecore mette a disposizione delle soluzioni semplici per creare dinamicamente istanze a partire da
un determinato metamodello.
Si e, dunque, realizzata un’istanza (modello) di tale metamodello utilizzando come dati in ingresso
tutti gli orari dei corsi di studio di Ingegneria Informatica e Ingegneria Informatica Magistrale del
primo semestre dell’a.a. 2018/2019. Il risultato e il seguente:
22
Metamodello OrariDocenti
Il metamodello target e simile (ma non uguale) a quello sorgente. Sono presenti:
• Una classe Root che funge da radice del modello
• Una classe Docente (non presente nel metamodello sorgente) costituita dal nome del docente
e da una EReference alla classe Giorno
• Una classe Giorno che e completamente analoga alla sua controparte nel modello sorgente
(anche se la trasformazione non effettuera un matching diretto tra i due modelli).
• Una classe Lezione che e anch’essa analoga alla sua controparte sorgente, tranne per la man-
canza dell’attributo ’docente’ in quanto, data la gerarchia del metamodello target, e possibile
risalire allo specifico docente ”risalendo la piramide”.
Obiettivo della trasformazione
L’obiettivo di tale trasformazione e quello di, partendo da un insieme di lezioni di un determinato
canale, ottenere un modello che contenga tutti i docenti e che permetta di visualizzare in maniera
semplice quali siano le lezioni tenute per tutti i giorni della settimana. Questo perche a partire da
un insieme eterogeneo di lezioni (che appartengono ad un determinato canale di un determinato
23
anno di un determinato corso di studi) e difficile risalire agli orari di un determinato docente da noi
scelto.
Tale trasformazione segue lo stile del classico Family2Persons anche se il grado di difficolta e
leggermente piu elevato.
La trasformazione in ATL
La trasformazione in ATL e costituita da 1 rule e da 3 lazy rules. La prima rule crea una nuova
Root nel modello target per ogni Universita nel modello sorgente. Dopodiche si itera tutto l’al-
bero fino a raggiungere tutte le lezioni e vengono estratti i nomi di tutti i docenti di ogni lezione
e inseriti in una Collection. Dopo aver inserito indiscriminatamente tutti i docenti con duplicati
all’interno della Collection e necessario rimuovere tutti i duplicati.
C’e da notare che, dato che il modello sorgente non presenta la EClass Docente si e deciso di
collezionare un insieme di istanze di Lezione che hanno tutte un ’docente’ differente. In questo
modo si ha un matching perfetto tra il numero delle lezioni nella collection e il numero di classi
’Docente’ da creare nel modello target. Viene dunque lanciata la lazy rule makeDocenti che, a
24
partire da tali lezioni che non presentano il campo ’docente’ duplicato genera per ognuno la classe
Docente nel modello target; per ognuno dei docenti vengono creati e inseriti tutti i giorni della set-
timana (da lunedi a venerdi) utilizzando la sezione di ATL dedicata alle variabili locali. All’atto
dell’inserimento di ogni giorno all’interno della classe docente viene eseguita a catena la lazy rule
makeDays; essa prende in ingresso il nome del giorno e quello del docente. Attraverso la funzione
AllInstancesFrom() vengono recuperate tutte le istanze della classe Giorno e attraverso l’opera-
zione select(var — condizione) si recuperano tutte le istanze dei giorni il cui nome corrisponde
con quello in ingresso alla lazy rule. Il punto finale e quello di iterare lungo ognuno di questi giorni
per ricavare le lezioni in cui il campo ’docente’ corrisponde con il secondo parametro in ingresso
alla lazy rule. Al termine di tale operazione si avra una serie di istanze della classe Lezione all’in-
terno di una collection. Queste lezioni rappresentano le lezioni di quel determinato prof in quella
determinata giornata e dovranno essere mappate nel modello target rimuovendo il campo docente
(che non e presente nel modello destinazione), tale funzionalita finale e implementata dalla terza
lazy rule: makeLessons.
25
Eseguendo tale trasformazione il risultato finale e il seguente:
Si ha dunque una vista chiara e sistematica di quali siano le lezioni di ciascun docente in ciascun
giorno della settimana. La domanda che sorge spontanea e: ”tutto cio non sarebbe stato possibile
attraverso una semplice query su una base di dati?” La risposta e sı.
26
Il motivo di tale trasformazione e, innanzitutto, mostrare l’utilizzo di un linguaggio di trasformazio-
ne di modelli (evidenziando anche le differenze con un linguaggio tradizione), mettere in evidenza
la possibilita di riorganizzare i dati per guardarli da un punto di vista diverso. Dunque nono-
stante questo sia un problema giocattolo applicato ad un problema su un dominio estremamente
specifico esso e quantomeno utile per i sopracitati motivi.
La trasformazione in Python
Per eseguire la stessa trasformazione in Python si e utilizzato un framework realizzato apposita-
mente per poter implementare EMF/Ecore su Python, il suo nome e PyEcore (tale framework e
presente gratuitamente su GitHub) [4]
PyEcore permette di gestire modelli e metamodelli fornendo anche delle funzionalita che permet-
tono di effettuare l’ereditarieta, serializzazione e deserializzazione XMI. Dando per scontato che si
abbia gia installato Python sulla propria macchina installare anche PyEcore e davvero un gioco da
ragazzi grazie all’ausilio di pip. Basta infatti lanciare il seguente comando per installarlo:
pip install pyecore
Oltre al paradigma di programmazione standard di Python, cioe quello operazionale, il framework
mette anche a disposizone delle funzionalita, come ad esempio mapping che implementano dei
costrutti che sono di tipo relazionale (in realta il codice dietro la funzione mapping e, ovviamente,
di tipo imperativo pero l’utente finale non se ne rende conto). Facendo un confronto a livello di
funzionalita e possibile paragonare tale framework a Kermeta.
La facilita d’utilizzo di Python e la possibilita di lavorare anche su modelli target preesistenti ren-
dono, a mio parere, PyEcore migliore di Kermeta.
Passando all’analisi della trasformazione in Python si ha la seguente parte iniziale di codice:
27
Come si puo ben notare la prima parte della trasformazione e costituita da un caricamento e re-
gistrazione dei metamodelli (si evince anche che e possibile lavorare con un numero imprecisato
di metamodelli contemporaneamente). Dopodiche viene caricato anche il modello; tali passaggi
devono essere eseguiti in ordine. Infatti se si tenta di caricare un modello prima del metamodello
a cui esso si conforma si ottiene un errore poiche il campo nsURI non e stato ancora registrato. In
seguito si ha il seguente codice:
Questa e la soluzione che ho realizzato per poter creare dinamicamente delle EClass (che in que-
sto caso saranno delle pyecore.class.NOMECLASSE) a partire da quelle presenti nei metamodelli
sorgente e target. Al termine di questi due cicli for e possibile creare un’istanza di una classe ap-
partenente ad uno dei metamodelli tramite la seguente linea di codice:
Di seguito viene eseguita la funzione rule1() che e composta dalla seguente porzione di codice:
Dopo aver creato la radice del modello target viene chiamata la funzione makeDocenti(). In questo
28
caso il codice e molto piu semplice rispetto alla sua controparte ATL. Attraverso una chiamata alla
funzione eAllContents() vengono selezionate tutte le istanze della classe Lezione, ne viene estra-
polato il docente ed inserito in una Python list. Rimuovere i duplicati in questa situazione e ancora
piu semplice, basta utilizzare la funzione set().
Al termine della chiamata di tale funzione si ha una lista con tutti i nomi dei docenti senza duplica-
ti. Il resto del codice e analogo alla controparte ATL (anche se molto piu leggibile): per ogni prof
vengono inseriti i giorni ad uno ad uno, all’atto di inserimento di ogni giorno vengono estrapolate
tutte le lezioni che si svolgono in quella giornata e sono tenute da quel determinato docente. Al
termine delle varie iterazioni non serve fare altro che creare un file .XMI e serializzarlo attraverso
le funzioni fornite dal framework.
29
Cio che si evince e che Python, nonostante non vi sia una completa implementazione dei costrutti
dichiarativi, ben si presta a questo tipo di operazioni.
30
Conclusioni
Il suddetto elaborato ha messo in evidenza, in particolare, le caratteristiche salienti delle trasforma-
zioni di modelli. Cio che si evince e anche il grandissimo vantaggio che si ottiene nell’utilizzare
un livello di astrazione piu elevato. Nonostante l’esempio di trasformazione proposto sia estrema-
mente banale diviene evidente che utilizzare i metamodelli e le trasformazioni di modelli permette
di ottenere tutta una serie di vantaggi nei loro utilizzatori. Basta pensare, ad esempio, che in am-
biente business, utilizzare MDE permette di velocizzare il processo di sviluppo. Sorge spontanea
l’analogia tra i linguaggi di programmazione tradizionali e, ad esempio, il linguaggio Assembler;
e chiaro che lavorare su un livello di astrazione maggiore permette di risparmiare una notevole
quantita di tempo.
Per lo stesso motivo, quindi, anche commettere errori diventa molto piu raro.
Nell’ultima parte, invece, l’utilizzo di Python come linguaggio di trasformazione di modelli ha reso
chiaro che, attraverso l’utilizzo dei costrutti implementati attraverso il framework esterno, e possi-
bile utilizzare un linguaggio tradizionale per compiere operazioni non tradizionali. Tale framework
dunque, costituisce, seppure in minima parte, un ponte tra la programmazione tradizionale e quella
relazionale rendendo Python un linguaggio piu potente di quanto non lo sia gia di sua natura.
Linguaggi realizzati appositamente per le trasformazioni di modelli (come, appunto, ATL) sono
ovviamente piu adatti per queste situazioni; si auspica dunque che l’evoluzione dei linguaggi di
programmazione tradizionali tenga conto della sempre piu pressante necessita dell’utilizzo del
MDE.
31
Bibliografia
[1] Atl guide. https://wiki.eclipse.org/ATL/User_Guide_-_The_ATL_Language.
[2] Kermeta reference manual. http://www.kermeta.org/docs/kermeta2/html/Kermeta-Manual.
docb/Kermeta-Manual.docb.html.
[3] Metaobject facility. https://www.omg.org/mof/.
[4] Pyecore documentation. https://pyecore.readthedocs.io/en/latest/user/quickstart.html.
[5] Qvt declarative documentation. http://download.eclipse.org/qvtd/doc/0.14.0/qvtd.pdf.
[6] Gonzalo Genova. What is a metamodel: The omg’s metamodel infrastructure. http://www.ie.inf.
uc3m.es/ggenova/Warsaw/Part3.pdf.
[7] Douglas C. Schmidt. Model-driven engineering. http://citeseerx.ist.psu.edu/viewdoc/
download?doi=10.1.1.106.9720&rep=rep1&type=pdf.
[8] Transentis. Models and metamodels. https://www.transentis.com/methods-techniques/
models-and-metamodels/.
[9] Wikipedia. Metamodellazione. https://it.wikipedia.org/wiki/Metamodellazione.
32