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

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

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

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

Generierung von effizientem C-Code aus UML2-Strukturdiagrammen

AbschlussvortragMathias Funk

Page 2: Generierung von effizientem C-Code aus UML2-Strukturdiagrammen Abschlussvortrag Mathias 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

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

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

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

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

Kontext: MDD

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

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!

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

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

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

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

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

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:

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

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);

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

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

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

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

ANSI C Modell: Core

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

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

ANSI C-Modell: Container

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

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

Workflow

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

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

Plugin-Architektur

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

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

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

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

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

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

Demo

Vielen Dank für die Aufmerksamkeit!