Generierung von effizientem C-Code aus UML2-Strukturdiagrammen Abschlussvortrag Mathias Funk.
-
Upload
anke-stifter -
Category
Documents
-
view
216 -
download
0
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!