Generierung von effizientem C-Code aus UML2-Strukturdiagrammen Abschlussvortrag Mathias Funk
RWTH Aachen, LuFGI 3 Software Konstruktion - Mathias Funk 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
RWTH Aachen, LuFGI 3 Software Konstruktion - Mathias Funk Inhalt Motivation / Anforderungen Transformationskonzept Maximen Beispiel Realisierung ANSI C-Modell Plugin-Architektur Optimierung Singletons Evaluation Demo Zuerst will ich die Arbeit etwas umfassender motivieren…und dabei die konkreten Grundanforderungen erläutern.. Hieraus ergibt sich das grundsätzliche Transformationskonzept…(erläutert an einem Beispiel!) Danach gehe ich auf die Realisierung des Transformationskonzeptes ein, ANSI C Modell, dann des Werkzeugs als Eclipse-Plugin…Architektur RWTH Aachen, LuFGI 3 Software Konstruktion - Mathias Funk
RWTH Aachen, LuFGI 3 Software Konstruktion - Mathias Funk Kontext: MDD Plattformen bieten heutzutage umfangreichere und mächtigere Möglichkeiten als „nackte“ Programmiersprachen, man kann jetzt auf Rahmenwerke und wiederverwndbare Komponenten zurückgreifen. RWTH Aachen, LuFGI 3 Software Konstruktion - Mathias Funk
RWTH Aachen, LuFGI 3 Software Konstruktion - Mathias Funk Anforderungen MDD im Umfeld eingebetteter Systeme MeDUSA Verwendung von UML2-Modellen Zielsprache ANSI C Übergang von Modell zu Code möglichst nahtlos: Codegenerierung! MDD häufig im Einsatz bei Webanwendungen, jetzt eingebettete Systeme! RWTH Aachen, LuFGI 3 Software Konstruktion - Mathias Funk
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 Schwierigkeit: keine klassen in ANSI C RWTH Aachen, LuFGI 3 Software Konstruktion - Mathias Funk
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
Beispiel: Behavior Port II Umsetzung der Classifier in C-Strukturen: 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; } RWTH Aachen, LuFGI 3 Software Konstruktion - Mathias Funk
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; Jetzt kommt die Realisierung! Damit sollte das Konzept komplett erläutert sein! 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
RWTH Aachen, LuFGI 3 Software Konstruktion - Mathias Funk Realisierung ANSI C-Modell (neu entwickelt, da nicht frei verfügbar) Core-Diagramm Container-Diagramm Plugin-Architektur Zweistufige Realisierung wurde schon im Zwischenvortrag erläutert (Flexibilität, Anpassbarkeit durch modularisierten Aufbau) Gerade da ist es wichtig, dass die Zwischenschritte möglichst einfach sind, deshalb jeweils innerhalb einer Domäne. RWTH Aachen, LuFGI 3 Software Konstruktion - Mathias Funk
RWTH Aachen, LuFGI 3 Software Konstruktion - Mathias Funk ANSI C Modell: Core RWTH Aachen, LuFGI 3 Software Konstruktion - Mathias Funk
ANSI C-Modell: Container RWTH Aachen, LuFGI 3 Software Konstruktion - Mathias Funk
RWTH Aachen, LuFGI 3 Software Konstruktion - Mathias Funk Workflow RWTH Aachen, LuFGI 3 Software Konstruktion - Mathias Funk
RWTH Aachen, LuFGI 3 Software Konstruktion - Mathias Funk Plugin-Architektur RWTH Aachen, LuFGI 3 Software Konstruktion - Mathias Funk
Optimierung: Singletons Singleton: „eine globale Instanz“ Häufig in der Praxis Keine Verletzung der direkten Abbildung Normale Transformation Transformation mit Singletons struct _Data { int a; char b; } #define Data struct _Data struct _Data { int a; char b; } #define Data struct _Data Data Data_self; Data data1; Data_CREATE($data1); Data_CREATE(); RWTH Aachen, LuFGI 3 Software Konstruktion - Mathias Funk
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) Unoptimiert: 13.967 Bytes Singletons: 14.086 Bytes Unoptimiert: 16.015 Bytes Singletons: 16.134 Bytes RWTH Aachen, LuFGI 3 Software Konstruktion - Mathias Funk
Vielen Dank für die Aufmerksamkeit! Demo Vielen Dank für die Aufmerksamkeit! RWTH Aachen, LuFGI 3 Software Konstruktion - Mathias Funk