startransformer - sewiki.iai.uni-bonn.de fileast node referenceast_node_reference(?id, ?reference)....
TRANSCRIPT
Die Modell-Pyramide der MDA Meta-Object-Facility conforms toMeta-Object-Facility
Class Association
source
M
conforms to
MOF (M t Obj t F ilit ) Class Associationdestination
M3MOF (Meta-Object-Facility)(Modelliert UML Metamodelle)M3 conforms
toDas UML Metamodell
Class Attribute*1 M2
Das UML Metamodel(Modelliert UML-Modelle)
M2
to
Ein UML-ModelUML Modelle
Mconforms
to
Spy
Name : String M1
(Modellieren Aspekte der Welt)M1
„Die reale Welt“M0
Mein Name ist ...conforms to
„Modellbasierte Softwareanalyse“, 2010/2011 StarTransformer 2 R O O T S
M0
StarTransformer = JTransformer + Metamodelle Metamodelle
jTransformerMDA StarTransformer
Meta-Object-Facility conforms to
Java-spezifisch Sprachunabhängig,erweiterbar durch
Sprachplugins“Class Association
source
destinationM3
conforms t
„Sprachplugins
UML Metamodell
Class Attribute*1M2
to
Faktendarstellung von Metamodellen
fEin UML-Model
Spy
Name : StringM1
conforms to
Faktendarstellung Faktendarstellung
conforms to
Name : Stringvon Modellen von Modellen
„Modellbasierte Softwareanalyse“, 2010/2011 StarTransformer 3 R O O T S
Vortragsüberblick
T il 1 V d i h d S h Pl i Teil 1: Verwenden eines vorhandenen Sprach-Plugins Generische Operationen Module und Faktenbasen Module und Faktenbasen
Teil 2: Erstellen eines Sprach-Plugins Meta-Modell definieren Wie generiert man Meta-Modell-konforme Fakten?
„Modellbasierte Softwareanalyse“, 2010/2011 StarTransformer 4 R O O T S
StarTransformer
StarTransformer Generische StarTransformer – Generische Operationen
MotivationGenerische Prädikate
R O O T S
JTransformer
AST des Javaprogramms Darstellung als Prolog FaktenJava-Programm
demoname
package1
parent
package demo; package(1, 0, 'demo')
C
parent
nameclass
2class C {class(2, 1, 'C')
parent
int
mmethod
3int m(int i) { method(3, 2, 'm', int,[])
calls
intparent
block5
block(5, 3, [6])c
parent
name6
m(i);
}
( , , [ ])
„Modellbasierte Softwareanalyse“, 2010/2011 StarTransformer 6 R O O T S
mcall} call(6, 5, null, 3 )
Szenario: Navigation im ASTLegende: Elternreferenz
Kindreferenz
andere Referenz
Wie gelangt man von einem Block zum enthaltenden Package?
package(1, 0, 'demo')zum enthaltenden Package?getContainingPackage(BlockId,PackageId) :-
block(BlockId, MethodId, _),method(MethodId ClassId )
Vorgehensweise falls der Block
class(2, 1, 'C')method(MethodId,ClassId, _, _, _),class(ClassId,PackageId, _).
Vorgehensweise, falls der Block in einem anderen Statement verschachtelt ist?
method(3, 2, 'm', int,[])
Alle Möglichkeiten testen? Was ist, falls der exakte Pfad und
die zu traversierenden block(5, 3, [6])
Programmelementtypen unbekannt sind?
Wie schreibt man generisch call(6 5 n ll 3 )
„Modellbasierte Softwareanalyse“, 2010/2011 StarTransformer 7 R O O T S
Wie schreibt man generisch getParent(Id, Parent)?
call(6, 5, null, 3 )
Generische Prädikate
Abfrage des Knotentyps
ast_node_type(+Id, ?Type).
Beispiel: 100 classTp
Abfrage der Knotenstruktur
ast_node_type_template(?Type, ?Template).
Beispiel: classT classT(A B C D)Beispiel: classT classT(A,B,C,D)
Knotenzugriff
ast_node_term(?ID, ?Term).
Beispiel: 100 l T(100 101 M Cl [ ])
„Modellbasierte Softwareanalyse“, 2010/2011 StarTransformer 8 R O O T S
Beispiel: 100 classT(100,101‚MyClass,[...])
Generische Prädikate
Generische Navigation
ast_node_parent(?ID, ?Parent).
ast node ancestor(?ID, ?Ancestor)._ _ ( , )
ast_node_child(?ID, ?Child).
ast_node_descendant(?ID, ?Descendant).
ast node reference(?ID, ?Reference).ast_node_reference(?ID, ?Reference).
„Modellbasierte Softwareanalyse“, 2010/2011 StarTransformer 9 R O O T S
StarTransformer
StarTransformer – Module
MotivationFaktenbasen und Module
AnwendungsbeispielBeziehungen zwischen Modulen
Module Registry
R O O T S
StarTransformer Module
JTransformer StarTransformer
Gesamtes Java-Projekt in einer Faktenbasis
Projekt mehrere Faktenbasen
Nur Fakten für Java-Anteil des Projektes
XML-Descriptoren, etc. nicht
FB für Java-Anteil Projektes FB für Build descriptor FB für Analyse-Ergebnissep ,
dargestellt
Gesamte Faktenbasis in einem
FB für Analyse Ergebnisse FB = Projekt Meta-Modell!
Namenräume durch Module Gesamte Faktenbasis in einem einzigen Namensraum Verschiedene Faktenbasen =
V hi d P l P
Namenräume durch Module Modul = Faktenbasis Mehrere FB im gleichen
Verschiedene Prolog-Prozesse Keine Möglichkeit zu
faktenbasenübergreifenden
Prolog-Prozess FB-übergreifende Analysen +
Transformationen möglich
„Modellbasierte Softwareanalyse“, 2010/2011 StarTransformer 11 R O O T S
Analysen + Transformationen Beziehungen zwischen FB
Beispiel: PointsTo Analyse in StarTransformerPointsTo Analyse in StarTransformer
PointsToModul_P1JavaFBModul_P1
……
Enthält Faktenbasis für Java-Anteil von Projekt P1 Projekte P2 Pn evtl in
Enthält Ergebnis der PointsTo Analyse von JavaFBModul_P1 Projekte P2 Pn haben Projekte P2, …, Pn evtl. in
weiteren Modulen Alle Java-Module entsprechen
d J M t d ll
Projekte P2, …, Pn haben eigene PointsTo-Module
Alle PointsTo module haben i M t d lldem Java-Metamodell
Durch “Java-Sprachplugin” definiert
eigenes Metamodell Implizit oder durch „PointsTo-
Plugin“ explizit definiert
„Modellbasierte Softwareanalyse“, 2010/2011 StarTransformer 12 R O O T S
PointsTo Analyse
PointsTo-BeziehungenJava-Programm
y = new ClassB();
x = m(y); y Objekt1Objekt1
T2 m(T1 param){
T2 Objekt2
param Objekt1
Objekt1
new–StatementT2 v;
…
v = new ClassA();Objekt1
vObjekt2
Obj kt1
new–Statement wird als Objekt
angesehen
()
…
v = param;
x Objekt1Objekt2
…
return v;
}
„Modellbasierte Softwareanalyse“, 2010/2011 StarTransformer 13 R O O T S
}
PointsTo Analyse: Ergebnisse als Fakten
Darstellung der PointsTo-Beziehung als Fakten i t t (ID V i bl Obj kt) points_to(ID, Variable, Objekt)
points to(1, y, objekt1). y Objekt1p _ ( , y, j )
points_to(2, param, objekt1).
points_to(3, v, objekt2). Objekt2
param Objekt1
_
points_to(4, v, objekt1).
points_to(5, x, objekt1).Objekt1
vObjekt2
Obj kt1x Objekt1
„Modellbasierte Softwareanalyse“, 2010/2011 StarTransformer 14 R O O T S
PointsTo Analyse und Module
PointsToModul_P1JavaFBModul_P1
points_to(100, v, o1).
points_to(101, v, o2).
paramT(v, …).
…
…newT(o1, …).
newT(o2, …).
Enthält Faktenbasis für Java-Anteil von Projekt P1
Enthält Ergebnis der PointsTo Analyse von JavaFBModul_P1
Enthält Referenzen auf Enthält Referenzen auf Elemente aus Java-Modul
Beziehung zu Java-Modul muss explizit gemacht werdena) Auf Modul-Ebeneb) Auf Fakten Ebene
„Modellbasierte Softwareanalyse“, 2010/2011 StarTransformer 15 R O O T S
b) Auf Fakten-Ebene
Beziehungen auf Modul-Ebene
PointsToModul_P1JavaFBModul_P1
points_to(100, v, o1).
points_to(101, v, o2).
paramT(v, …).
… points_to
…newT(o1, …).
newT(o2, …).
// V1 ist Alias von V2 wenn beide auf das gleiche Objekt zeigenalias(PointsToMod, V1, V2, JavaMod) :-
PointsToMod:points_to(_, V1, X),
PointsToMod:points to( V2 X)PointsToMod:points_to(_, V2, X),
not(V1 = V2),
get_role_player(PointsToMod, points_to, [JavaMod]).
„Modellbasierte Softwareanalyse“, 2010/2011 StarTransformer 16 R O O T S
Beziehungen auf Modul-Ebene Module RegistryRegistry Module charakterisiert durch Rolle, die sie spielen
Rollentypen Rollentyp ID Rollentyp ID ConstraintsModul
role_type(+RoleTypeId, +ConstraintsModule).
Modul ist Rollenspieler eines Rollentyps Modulname Modulname ID des Rollentyps Signatur: Liste von Prologtermen
role_player(+Module, +RoleTypeId, +Signature).
„Modellbasierte Softwareanalyse“, 2010/2011 StarTransformer 17 R O O T S
Module Registry
Constraints im ConstraintsModul werden repräsentiert durch
assignment_constraint(+Module, +Type, +Sig)unassignment_constraint(+Module, +Type, +Sig)
Globale, vorgegebene Constraints: ein Modul kann nur einen Rollentyp spielen i M d l k i i t i t R ll t i l ein Modul kann nur einen registrierten Rollentyp spielen
PointsTo: Signatur: ein Element, der Name des JavaModuls Constraints: Sicherstellung der 1:1 Beziehung zwischen Java- und
PointsToModulenPointsToModulen
„Modellbasierte Softwareanalyse“, 2010/2011 StarTransformer 18 R O O T S
Module Registry
PointsToJavaFB
points_to(100, v, o1).
…
paramT(v, …).
…points_to
A f b S h Pl iAufgaben von Sprach-Plugins Rollentyp(en) definieren
Rollentyp points to ist durch das Prädikat points to constraints o e typ po ts_to st du c das äd at po ts_to_co st a tsdefiniert
?- register_role_type(points_to, points_to_constraints).
Rollenspieler deklarieren PointsTo-Ergebnisse zum Modul JavaFB stehen in Modul PointsTo
„Modellbasierte Softwareanalyse“, 2010/2011 StarTransformer 19 R O O T S
?- register_role_player('PointsTo', points_to, ['JavaFB']).
Module Registry
Beziehungen zwischen den Modulen
…JavaMM
…PointToMM
conforms to(vordefiniert)
conforms to(vordefiniert)
points_to(100, v, o1).
PointsToparamT(v, …).
JavaFB
i t t……
points_to
(selbst definiert)
„Modellbasierte Softwareanalyse“, 2010/2011 StarTransformer 20 R O O T S
Language Plugin
Kapselt alle Funktionalität und Implementierung, die für ein bestimmtes Metamodell spezifisch istMetamodell spezifisch ist
Ein Language Plugin enthält:Ein Language Plugin enthält: MetaModell Reader (optional) Writer (optional) Library (optional)
„Modellbasierte Softwareanalyse“, 2010/2011 StarTransformer 22 R O O T S
MetaModell
AST einer Sprache wird definiert durch: K t t d d f/2 Knoten: ast_node_def/2 Relationen: ast_relation/2
Die Navigation wird definiert durch: Kindreferenzen ast_sub_tree/1 Vaterreferenzen ast_argname_parent/1 andere Referenzen ast_ref_tree/1
„Modellbasierte Softwareanalyse“, 2010/2011 StarTransformer 24 R O O T S
MetaModell: ast_node_def
ast_node_def(?NodeType, ?ArgumentDescriptors) B h ibt di El t d S h Beschreibt die Elemente der Sprache NodeType: repräsentiert AST-Knotentyp ArgumentDescriptors: beschreibt die Argumente dieses Knotentypsg p g yp
ast_node_def(blockT,[ ast arg(id mult(1 1 no ) id [blockT])[ ast_arg(id, mult(1,1,no ), id, [blockT]), ast_arg(parent, mult(1,1,no ), id, [id]), ast_arg(encl, mult(1,1,no ), id, [methodT, constructorT,classInitializerT]),
ast_arg(stmts, mult(0,*,ord), id, [statementType]) ]).
„Modellbasierte Softwareanalyse“, 2010/2011 StarTransformer 25 R O O T S
MetaModell: ArgumentDescriptors
ast_arg(ArgName, Cardinality, IdOrAttribute, Types) A N N d A t ArgName: Name des Arguments Cardinality: Term der Form mult(From,To,OrderedOrNot)
K di lität B d tKardinalität Bedeutungmult(0,*,no) Beliebige Kardinalität inklusive 0, ungeordnetmult(0,*,ord) Beliebige Kardinalität inklusive 0, geordnet.mult(0, ,ord) Beliebige Kardinalität inklusive 0, geordnet.
Entspricht einer Liste.mult(1,2,no) Kardinalität mit unterer und oberer Schranke,
ungeordnetungeordnetmult(0,1,no) Optionales, einzelnes Argument
„Modellbasierte Softwareanalyse“, 2010/2011 StarTransformer 26 R O O T S
MetaModell: ArgumentDescriptors
ast_arg(ArgName, Cardinality, IdOrAttribute, Types) IdO Att ib t i t t d IdOrAttribute ist entweder:
id: Wert ist ID eines AST-Knoten attr: Wert kann jeder möglicher Prologterm sein und wird nicht als ID
interpretiert Types ist Liste von AST Knotentypen der Sprache.
jeder Term ist möglich, der erstes Argument eines ast_node_def Faktes ist 'typeTermType' und 'atom‘ dürfen verwendet werden
– ' typeTermType' weist auf einen Term der Form type(class, id, int) or type(basic, typename, int) hin.
'null‘ erlaubt, falls Kardinalität 0 möglich ist
„Modellbasierte Softwareanalyse“, 2010/2011 StarTransformer 27 R O O T S
MetaModell: ast_relation
ast_relation(?AstRelLabel, ?ArgumentDescriptors) d fi i t R l ti f AST K t definiert Relationen auf AST-Knoten keine eigene ID alle vorkommenden IDs sind Referenzen zu Fakten, die AST-Knoten
repräsentieren können Attribut sein können Flag sein können Flag sein
ast_relation(extendsT,[ t ( b f lt(1 1 ) id [ l ])[ ast_arg(sub_ref, mult(1,1,no), id, [classT]), ast_arg(super_ref, mult(1,1,no ), id, [classT])
]).ast relation(modifierT,_ ( ,
[ ast_arg(id, mult(1,1,no), id, [classT, fieldT, methodT, constructorT, classInitializerT]),
ast_arg(modifier, mult(1, 1, no), attr, [atom])])
„Modellbasierte Softwareanalyse“, 2010/2011 StarTransformer 28 R O O T S
]).
MetaModell: ast_sub_tree
ast_sub_tree(?ArgName) B h ibt i Ki d f Beschreibt eine Kindreferenz Argumente mit dem Namen ArgName verweisen auf Kindknoten des
betreffenden AST-Knoten
ast_sub_tree(expr).ast sub tree(body)._ _ ( y)ast_sub_tree(stmts).ast_sub_tree(recv). ast_sub_tree(args).
„Modellbasierte Softwareanalyse“, 2010/2011 StarTransformer 29 R O O T S
MetaModell: ast_ref_tree
ast_ref_tree(?ArgName) A t it d N A N i d R f ( d Ki d h Argumente mit dem Namen ArgName sind Referenzen (weder Kind- noch
Vaterknoten) des betreffenden AST-Knoten
t f t ( f)ast_ref_tree(ref).ast_ref_tree(encltype).ast_ref_tree(excepts).
„Modellbasierte Softwareanalyse“, 2010/2011 StarTransformer 30 R O O T S
MetaModell: ast_argname_parent
ast_argname_parent(?ArgName) A t it d N A N i f d V t k t d Argumente mit dem Namen ArgName verweisen auf den Vaterknoten des
betreffenden AST-Knoten
t t( t)ast_argname_parent(parent).
„Modellbasierte Softwareanalyse“, 2010/2011 StarTransformer 31 R O O T S
MetaModell „PointsTo“
ast_node_def(points_to,[ ast_node_arg(id, mult(1, 1, no), id, [points_to]),_ _ _ast_node_arg(var, mult(1, 1, no), id, [JavaMM:fieldT,
JavaMM:paramT]),ast_node_arg(obj, mult(1, 1, no), id, [JavaMM:newClassT])
])]).
ast_ref_tree(var).ast_ref_tree(obj)._ _
„Modellbasierte Softwareanalyse“, 2010/2011 StarTransformer 32 R O O T S
Nutzen von Meta-Modellen
Implementierung generischer Operationen API API Siehe vorherigen Abschnitt
Implementierung generischer Werkzeuge Faktbase Inspektor (FBI)
C Verbindung von FBI zu Code …
„Modellbasierte Softwareanalyse“, 2010/2011 StarTransformer 34 R O O T S
Navigation im FBI
Kindknoten
„Modellbasierte Softwareanalyse“, 2010/2011 StarTransformer 36 R O O T S
Kindknoten
Navigation im FBI
referenzierte Knoten
„Modellbasierte Softwareanalyse“, 2010/2011 StarTransformer 37 R O O T S
referenzierte Knoten
Language Plugin: Reader
ILanguageBuilder Interface muss implementiert werden F ll b ild Full build Auto build Clean build
StarTransformer Plugin ruft die Methoden auf Ressourcenänderungen werden von Eclipse an StarTransformer
Pl i it l it tPlugin weitergeleitet StarTransformer leitet die Informationen an Language Plugins weiter
PointsTo: Prologaufruf eines Prädikats für die PointsTo-Analyse im Reader:
derive_points_to_info(QuellModell, ZielModell)
„Modellbasierte Softwareanalyse“, 2010/2011 StarTransformer 41 R O O T S
Language Plugin: Writer
ISourceGenerator Interface muss implementiert werden t (St i d l id St i id) generate(String model_id, String id) model_id ist der Modulname des Modells id ist die ID des PEF, das in Code umgewandelt werden sollg gibt String zurück, der den rekonstruierten Quellcode enthält
„Modellbasierte Softwareanalyse“, 2010/2011 StarTransformer 42 R O O T S
Language Plugin: Library
Menge von Prädikaten und/oder CTs für die Sprache
PointsTo: derive points to info(QuellModell ZielModell) derive_points_to_info(QuellModell, ZielModell) alias(Mod, V1, V2, JavaMod)
„Modellbasierte Softwareanalyse“, 2010/2011 StarTransformer 43 R O O T S
Zusammenfassung
StarTransformer = JTransformer + Metamodelle
Generisches API Knotenzugriff und Navigation Knotenzugriff und Navigation
Module als Namensräume Multiple Faktenbasen
B i h i h F kt b / M d l Beziehungen zwischen Faktenbasen / Modulen Module Registry
Erstellen eines Sprach-Plugins MetaModelle
„Modellbasierte Softwareanalyse“, 2010/2011 StarTransformer 44 R O O T S
Reader, …