StarTransformer - sewiki.iai.uni-bonn.de fileast node referenceast_node_reference(?ID, ?Reference)....

44
R O O T S StarTransformer Andreas Becker [email protected]

Transcript of StarTransformer - sewiki.iai.uni-bonn.de fileast node referenceast_node_reference(?ID, ?Reference)....

R O O T S

StarTransformer

Andreas Becker

[email protected]

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

StarTransformer

Teil 2: Erstellen eines Sprachplugins

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

StarTransformer

Metamodell Definieren

KnotenBeziehungen

Navigation

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

StarTransformer

Nutzen von Meta-Modellen

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

„Modellbasierte Softwareanalyse“, 2010/2011 StarTransformer 35 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

Navigation im FBI

„Modellbasierte Softwareanalyse“, 2010/2011 StarTransformer 38 R O O T S

Navigation im FBI

„Modellbasierte Softwareanalyse“, 2010/2011 StarTransformer 39 R O O T S

StarTransformer

„Rest“ eines Sprachplugins

ReaderWriter

Library

R O O T S

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, …