Generierung von effizientem C-Code aus UML2-Strukturdiagrammen Abschlussvortrag Mathias Funk.

Post on 06-Apr-2016

216 views 0 download

Transcript of Generierung von effizientem C-Code aus UML2-Strukturdiagrammen Abschlussvortrag Mathias Funk.

Generierung von effizientem C-Code aus UML2-Strukturdiagrammen

AbschlussvortragMathias Funk

RWTH Aachen, LuFGI 3 Software Konstruktion - Mathias Funk 2 / 17

Aufgabenstellung

• Konzeptioneller Teil– Wie können UML2-Strukturdiagramme in

ANSI C übertragen werden?– Wie kann effizienter Code erzeugt werden?

• Technischer Teil– Entwicklung eines Eclipse-Plugins

• Einlesen von UML2-Modellen (aus ViPER)• Implementierung der konzeptionellen Ergebnisse• Generierung von lauffähigem ANSI C-Code

RWTH Aachen, LuFGI 3 Software Konstruktion - Mathias Funk 3 / 17

Inhalt• Motivation / Anforderungen• Transformationskonzept

– Maximen– Beispiel

• Realisierung– ANSI C-Modell– Plugin-Architektur

• Optimierung– Singletons– Evaluation

• Demo

RWTH Aachen, LuFGI 3 Software Konstruktion - Mathias Funk 4 / 17

Kontext: MDD

RWTH Aachen, LuFGI 3 Software Konstruktion - Mathias Funk 5 / 17

Anforderungen

• MDD im Umfeld eingebetteter Systeme– MeDUSA

• Verwendung von UML2-Modellen• Zielsprache ANSI C• Übergang von Modell zu Code möglichst

nahtlos:Codegenerierung!

RWTH Aachen, LuFGI 3 Software Konstruktion - Mathias Funk 6 / 17

Transformationskonzept

Konzept der Klasse existiert nicht in C

• Transformation nach Standardmapping– Zentrale Datenstruktur als C-struct

• Maximen– Generische Umsetzung aller Classifier

• Durchgängigkeit, Konsistenz• Bessere Akzeptanz durch Entwickler

– Unabhängigkeit von späterer Instantiierung• Wiederverwendung

RWTH Aachen, LuFGI 3 Software Konstruktion - Mathias Funk 7 / 17

Beispiel: Behavior Port I

• Port besitzt zwei Interfaces:– Interface1 mit Operation: operation1(param1 : int) : int– Interface2 mit Operation: operation1(param1 : char) : char

RWTH Aachen, LuFGI 3 Software Konstruktion - Mathias Funk 8 / 17

Beispiel: Behavior Port II

struct _PortType1 {

/* provided interfaces */void * interface1;int (* fp_interface1_operation1)(void * _self, int param1);

/* required interfaces */void * interface2;int (* fp_interface2_operation1)(void * _self, char param1);

}

struct _StructuredClass {

/* ports */PortType1 port1;

}

• Umsetzung der Classifier in C-Strukturen:

RWTH Aachen, LuFGI 3 Software Konstruktion - Mathias Funk 9 / 17

Beispiel: Behavior Port III• Setzen der Funktions- und Instanzzeiger mittels Registrierungsfunktionen:

void REGISTER_PortType1_Interface1(void* _self, void* connector){

self->interface2 = connector;}

void REGISTER_PortType1_Interface1_operation1(void* _self, int(* operation)(void* _self, int param1))

{self->fp_interface1_operation1 = operation;

}

• Aufruf der Registrierungsfunktionen im Konstruktor des umgebenden Classifiers:

REGISTER_PortType1_Interface1(&port1, self);REGISTER_PortType1_Interface1_operation1(&port1,

StructuredClass_operation1_Implementation);

RWTH Aachen, LuFGI 3 Software Konstruktion - Mathias Funk 10 / 17

Realisierung

• ANSI C-Modell(neu entwickelt, da nicht frei verfügbar)– Core-Diagramm– Container-Diagramm

• Plugin-Architektur

RWTH Aachen, LuFGI 3 Software Konstruktion - Mathias Funk 11 / 17

ANSI C Modell: Core

RWTH Aachen, LuFGI 3 Software Konstruktion - Mathias Funk 12 / 17

ANSI C-Modell: Container

RWTH Aachen, LuFGI 3 Software Konstruktion - Mathias Funk 13 / 17

Workflow

RWTH Aachen, LuFGI 3 Software Konstruktion - Mathias Funk 14 / 17

Plugin-Architektur

RWTH Aachen, LuFGI 3 Software Konstruktion - Mathias Funk 15 / 17

Optimierung: Singletons• Singleton: „eine globale Instanz“• Häufig in der Praxis• Keine Verletzung der direkten Abbildung

struct _Data {

int a;char b;

}

#define Data struct _Data

Data Data_self;

struct _Data {

int a;char b;

}

#define Data struct _Data

Data_CREATE();

Data data1;

Data_CREATE($data1);

Normale Transformation Transformation mit Singletons

RWTH Aachen, LuFGI 3 Software Konstruktion - Mathias Funk 16 / 17

Optimierung: Evaluation• Performance

– 6 Mrd. Funktionsaufrufe einer einfachen Multiplikation (Demo-Beispiel)• Unoptimiert: 392 Sekunden• Singletons: 331 Sekunden

• Speicherplatz (dynamisch)– 3 Instanzen bzw. 3 Singletons (Demo-Beispiel)

• Unoptimiert: 1.016.492 Bytes• Singletons: 1.016.611 Bytes

– 31 Instanzen bzw. 3 Singletons• Unoptimiert: 1.016.828 Bytes• Singletons: 1.016.611 Bytes

• Speicherplatz (statisch)– 3 Instanzen bzw. 3 Singletons (Demo-Beispiel)

• Unoptimiert: 13.967 Bytes• Singletons: 14.086 Bytes

– 31 Instanzen bzw. 3 Singletons• Unoptimiert: 16.015 Bytes• Singletons: 16.134 Bytes

RWTH Aachen, LuFGI 3 Software Konstruktion - Mathias Funk 17 / 17

Demo

Vielen Dank für die Aufmerksamkeit!