© Zühlke 2014
Das Modell ist im Code
Das Modell ist im Code | Christoph Woskowski 3. Dezember 2014 Folie 1
© Zühlke 2014
• Vorstellung
• Externe und interne DSLs
• Kurzeinführung Boost MSM
• Automotive-Beispiel: Taxameter
• Das M...
© Zühlke 2014
Vorstellung - Zühlke
• Mehr als 8'000 Projekte realisiert
• 630 Mitarbeiterinnen & Mitarbeiter
(Ende 2013)
•...
© Zühlke 2014
Vorstellung - Christoph Woskowski
• Lead Software Architect
• Bereich: Embedded Systems
• Fokus: Regulierte ...
© Zühlke 2014
Externe und interne DSLs
Externe DSLs – Die Variante Xtext
Das Modell ist im Code | Christoph Woskowski
Exec...
© Zühlke 2014
Externe und interne DSLs
Interne DSLs – Die Variante C++
Das Modell ist im Code | Christoph Woskowski
Execut...
© Zühlke 2014
• Entwickelt von Christophe Henry
• Basis: “C++ Template Metaprogramming”
(Abrahams, Gurtovoy)
• Zuerst verw...
© Zühlke 2014
Kurzeinführung Boost MSM
Das Modell ist im Code | Christoph Woskowski
CD-Player Beispiel – Diagrammform
3. D...
© Zühlke 2014
Kurzeinführung Boost MSM
CD-Player Beispiel – Tabellenform (Functor)
Das Modell ist im Code | Christoph Wosk...
© Zühlke 2014
Kurzeinführung Boost MSM
CD-Player Beispiel – „Gleichungsform“ (Euml)
Das Modell ist im Code | Christoph Wos...
© Zühlke 2014
Kurzeinführung Boost MSM
Unterstützung der UML 2.0 State Machine Spezifikation, u.a.
• State Entry/Exit Acti...
© Zühlke 2014
Kurzeinführung Boost MSM
• C++ Compile Time Metaprogramming fordert Compiler
und Build-Hardware
• Build-Syst...
© Zühlke 2014
Automotive-Beispiel: Taxameter
Spiegeltaxameter
Das Modell ist im Code | Christoph Woskowski 3. Dezember 201...
© Zühlke 2014
Automotive-Beispiel: Taxameter
Eine globale Statemachine,
mit mehr als 50 Zuständen,
und über 200 Transition...
© Zühlke 2014
Automotive-Beispiel: Taxameter
Achtung! Stark vereinfacht!
• “Compiler” ersetzt Includes und Defines/Macros ...
© Zühlke 2014
Automotive-Beispiel: Taxameter
Achtung! Stark vereinfacht!
• Jeder Aufruf von process_event wurde durch eine...
© Zühlke 2014
Automotive-Beispiel: Taxameter
Lösung: Proxy States
Das Modell ist im Code | Christoph Woskowski
source file...
© Zühlke 2014
Das Modell sichtbar machen
Interne DSL visualisieren
Das Modell ist im Code | Christoph Woskowski
Executable...
© Zühlke 2014
Das Modell sichtbar machen
MSM for Zest (Eclipse Visualization Toolkit)
Das Modell ist im Code | Christoph W...
© Zühlke 2014
Zusammenfassung
• Das Modell ist immer im Code
• Interne DSLs vermeiden das Round-Trip Problem
• Visualisier...
© Zühlke 2014
Gibt es Fragen?
Schreiben Sie mir einfach eine Email
Christoph.Woskowski@zuehlke.com
Nächste SlideShare
Wird geladen in …5
×

Das Modell ist im Code (ESE-Kongress 2014)

1.120 Aufrufe

Veröffentlicht am

Dieser Vortrag stellt an einem praktischen Beispiel die Vorteile und den Nutzen einer hocheffizienten eingebetteten DSL im C++ Quellcode dar. Die Beispielanwendung ist eine User Interface Steuerung für ein aktuelles Automotive-System. Es werden sowohl die Gründe für den Einsatz der von Christophe Henry entwickelten OpenSource C++ Bibliothek Boost::MSM für die beschriebene Anwendung präsentiert, als auch Einblicke in den "Projektalltag" mit einer solch neuen Methodik gegeben und natürlich wird auch auf aufgetretene Probleme und die entwickelten Lösungen eingegangen. Da die C++ Boost Bibliotheken als Pool für zukünftige C++-Standards gelten, ist auch ein Blick in das Umfeld der gewählten Lösung Boost MSM lohnenswert. Teil des Ausblicks werden also auch andere Lösungen für weitere aktuelle Probleme im Automotive-Umfeld, wie z.B. die Parallelisierung und Verteilung von Anwendungen und Algorithmen auf mehrere Rechnerkerne, sein.

Veröffentlicht in: Automobil
0 Kommentare
0 Gefällt mir
Statistik
Notizen
  • Als Erste(r) kommentieren

  • Gehören Sie zu den Ersten, denen das gefällt!

Keine Downloads
Aufrufe
Aufrufe insgesamt
1.120
Auf SlideShare
0
Aus Einbettungen
0
Anzahl an Einbettungen
28
Aktionen
Geteilt
0
Downloads
4
Kommentare
0
Gefällt mir
0
Einbettungen 0
Keine Einbettungen

Keine Notizen für die Folie

Das Modell ist im Code (ESE-Kongress 2014)

  1. 1. © Zühlke 2014 Das Modell ist im Code Das Modell ist im Code | Christoph Woskowski 3. Dezember 2014 Folie 1
  2. 2. © Zühlke 2014 • Vorstellung • Externe und interne DSLs • Kurzeinführung Boost MSM • Automotive-Beispiel: Taxameter • Das Modell sichtbar machen • Zusammenfassung Das Modell ist im Code | Christoph Woskowski Agenda 3. Dezember 2014 Folie 2
  3. 3. © Zühlke 2014 Vorstellung - Zühlke • Mehr als 8'000 Projekte realisiert • 630 Mitarbeiterinnen & Mitarbeiter (Ende 2013) • In Deutschland, Großbritannien, Österreich, Serbien und in der Schweiz • Gegründet 1968, im Besitz von Partnern • ISO 9001 und 13485 zertifiziert Das Modell ist im Code | Christoph Woskowski 3. Dezember 2014 Folie 3
  4. 4. © Zühlke 2014 Vorstellung - Christoph Woskowski • Lead Software Architect • Bereich: Embedded Systems • Fokus: Regulierte Entwicklung • Interessen: C++, Boost Libraries Das Modell ist im Code | Christoph Woskowski 3. Dezember 2014 Folie 4
  5. 5. © Zühlke 2014 Externe und interne DSLs Externe DSLs – Die Variante Xtext Das Modell ist im Code | Christoph Woskowski Executable Graphische DSL Textuelle DSL Modell Code – Generator Source Code Compiler 3. Dezember 2014 Folie 5
  6. 6. © Zühlke 2014 Externe und interne DSLs Interne DSLs – Die Variante C++ Das Modell ist im Code | Christoph Woskowski Executable Source Code CompilerDSL Modell 3. Dezember 2014 Folie 6
  7. 7. © Zühlke 2014 • Entwickelt von Christophe Henry • Basis: “C++ Template Metaprogramming” (Abrahams, Gurtovoy) • Zuerst verwendet in einem verteilten Testsystem für ISOBUS-Geräte • Ziel: einfach und schnell Statemachines mit sehr hoher Laufzeit-Performance entwickeln (oder generieren) • Ziel erreicht durch: – Einfache Transitionstabellen (Front-End) – Komplexes Template Metaprogramming (“unter der Haube”) Das Modell ist im Code | Christoph Woskowski Kurzeinführung Boost MSM Geschichtliches 3. Dezember 2014 Folie 7
  8. 8. © Zühlke 2014 Kurzeinführung Boost MSM Das Modell ist im Code | Christoph Woskowski CD-Player Beispiel – Diagrammform 3. Dezember 2014 Folie 8
  9. 9. © Zühlke 2014 Kurzeinführung Boost MSM CD-Player Beispiel – Tabellenform (Functor) Das Modell ist im Code | Christoph Woskowski struct transition_table : mpl::vector< // Start Event Next Action Guard // +---------+-------------+---------+---------------------+---------------+ a_row < Stopped , play , Playing , &p::start_playback >, a_row < Stopped , open_close , Open , &p::open_drawer >, _row < Stopped , stop , Stopped >, // +---------+-------------+---------+---------------------+---------------+ a_row < Open , open_close , Empty , &p::close_drawer >, // +---------+-------------+---------+---------------------+---------------+ a_row < Empty , open_close , Open , &p::open_drawer >, row < Empty , cd_detected , Stopped , &p::store_cd_info ,&p::good_disk >, // +---------+-------------+---------+---------------------+---------------+ a_row < Playing , stop , Stopped , &p::stop_playback >, a_row < Playing , pause , Paused , &p::pause_playback >, a_row < Playing , open_close , Open , &p::stop_and_open >, // +---------+-------------+---------+---------------------+---------------+ a_row < Paused , end_pause , Playing , &p::resume_playback >, a_row < Paused , stop , Stopped , &p::stop_playback >, a_row < Paused , open_close , Open , &p::stop_and_open > // +---------+-------------+---------+---------------------+---------------+ > {}; 3. Dezember 2014 Folie 9
  10. 10. © Zühlke 2014 Kurzeinführung Boost MSM CD-Player Beispiel – „Gleichungsform“ (Euml) Das Modell ist im Code | Christoph Woskowski BOOST_MSM_EUML_TRANSITION_TABLE(( Playing == Stopped + play / start_playback , Playing == Paused + end_pause / resume_playback, // +--------------------------------------------------------------+ Empty == Open + open_close / close_drawer, // +--------------------------------------------------------------+ Open == Empty + open_close / open_drawer, Open == Paused + open_close / stop_and_open, Open == Stopped + open_close / open_drawer, Open == Playing + open_close / stop_and_open, // +--------------------------------------------------------------+ Paused == Playing + pause / pause_playback, // +--------------------------------------------------------------+ Stopped == Playing + stop / stop_playback, Stopped == Paused + stop / stop_playback, Stopped == Empty + cd_detected [good_disk] / store_cd_info, Stopped == Stopped + stop // +--------------------------------------------------------------+ ),transition_table) 3. Dezember 2014 Folie 10
  11. 11. © Zühlke 2014 Kurzeinführung Boost MSM Unterstützung der UML 2.0 State Machine Spezifikation, u.a. • State Entry/Exit Actions, Transition Actions & Guards • Submachines, Orthogonal Regions, Pseudo States • Anonymous & Internal Transitions, Deferred Events … uvm. Angepasste Umsetzung von UML 2.0: • Shallow & Deep History Eigene Konzepte die über UML 2.0 hinaus gehen • Interrupt States, Kleene/Any Events, Flags u.a. Das Modell ist im Code | Christoph Woskowski Fähigkeiten 3. Dezember 2014 Folie 11
  12. 12. © Zühlke 2014 Kurzeinführung Boost MSM • C++ Compile Time Metaprogramming fordert Compiler und Build-Hardware • Build-System “limitiert” FSM-Größe, Komplexität und verwendbare Features • Normaler User: Kenntnisse bzgl. C++ Templates • Power User: Template-Programmierkenntnisse Aber: • Große Nutzer-Community, viele FAQ-Foren, Boost Mailingliste und Christophe Henry (!) Einschränkungen Das Modell ist im Code | Christoph Woskowski 3. Dezember 2014 Folie 12
  13. 13. © Zühlke 2014 Automotive-Beispiel: Taxameter Spiegeltaxameter Das Modell ist im Code | Christoph Woskowski 3. Dezember 2014 Folie 13
  14. 14. © Zühlke 2014 Automotive-Beispiel: Taxameter Eine globale Statemachine, mit mehr als 50 Zuständen, und über 200 Transitionen, in mehr als 10 Sub-Machines. Problem: Komplexität Das Modell ist im Code | Christoph Woskowski CORE i7, 8 GB RAM, GCC 4.8.0: Compiler-Crash nach 7 min (Out Of Memory) 3. Dezember 2014 Folie 14
  15. 15. © Zühlke 2014 Automotive-Beispiel: Taxameter Achtung! Stark vereinfacht! • “Compiler” ersetzt Includes und Defines/Macros durch tatsächlichen Code • Metaprogramming “zwingt” den Compiler (Typ-Auflösung) die Transitionstabelle(n) aufzufalten • Compiler erstellt im Speicher ein Feld (indiziert über alle Events) von Feldern (indiziert über alle States) von Funktionspointern auf Guards und Actions Double Dispatch • 1st Dispatch (Compile Time): Für jede Instanziierung von process_event wird die Transitionstabelle durchlaufen und vom Compiler Event-spezifischer Code generiert MSM: Unter der Haube – Compile Time Das Modell ist im Code | Christoph Woskowski 3. Dezember 2014 Folie 15 Mehr Details: Buch „C++ Template Metaprogramming“ oder Christophe Henry
  16. 16. © Zühlke 2014 Automotive-Beispiel: Taxameter Achtung! Stark vereinfacht! • Jeder Aufruf von process_event wurde durch eine Tabelle aus Funktionspointern ersetzt • 2nd Dispatch (Run Time): Unter Verwendung eines generierten Indexes für den aktuellen State: – Ermittlung der auszuführenden Funktionspointer in konstanter Zeit (wenige Zyklen) – Ausführung der Funktionen (Actions) Exit, Transition, Entry abhängig vom Guard Prinzipbedingt schneller als OO State-Pattern, Switch-Case-Hierarchien oder If-Then-Else-Kaskaden Messergebnisse für 10.000.000 x 11 Transitionen (Franz Alt, 2009): MSM: Unter der Haube – Run Time Das Modell ist im Code | Christoph Woskowski Mehr Details: Buch „C++ Template Metaprogramming“ oder Christophe Henry 3. Dezember 2014 Folie 16 Boost StateChart: 19,6 sec Rhapsody: 4,9 sec Boost MSM: 0,9 sec
  17. 17. © Zühlke 2014 Automotive-Beispiel: Taxameter Lösung: Proxy States Das Modell ist im Code | Christoph Woskowski source file source file Proxy Proxy header file header file source file source file forwarding.h Sddsfgdfsgdf Rettertertert dsgsfdgsfdgsdfg Ertretsdfgdfhgsdf Ösdgsdölghsdlfh ^ödsfhdsfhsd ^s,bgfx,mcbv, ^sgjghsldkghsd Ölölsdgdlsfgh Lösdghdslöfhgs X.vchsdgjk Öldshdsflöghsdfl Ldsföhdslkjhg Lskjdhldshgdsflf Lkjsdfhdksflfgh Lskfdjfhlksdfh Lksdjgdhkdh Sklsdjfhdklfh Klsafhsfdfh Klhfsklfhsdklah Lkahsflkashfklds Hfskfsdkfh klsdahfhasd dgdfgfd dfgfdgdfg ertertertreter dfgdfgfddfgdf dfgdfgfdg ertertreterter ghjgfjgfhjhf ertddgfgffdh retzrezrezrz fdghdgfhfdgh 3. Dezember 2014 Folie 17
  18. 18. © Zühlke 2014 Das Modell sichtbar machen Interne DSL visualisieren Das Modell ist im Code | Christoph Woskowski Executable Source Code CompilerDSL Modell Visualisierung 3. Dezember 2014 Folie 18
  19. 19. © Zühlke 2014 Das Modell sichtbar machen MSM for Zest (Eclipse Visualization Toolkit) Das Modell ist im Code | Christoph Woskowski 3. Dezember 2014 Folie 19
  20. 20. © Zühlke 2014 Zusammenfassung • Das Modell ist immer im Code • Interne DSLs vermeiden das Round-Trip Problem • Visualisierung statt Generierung • C++ „kann“ interne DSLs • Probleme mit modernen C++ Techniken sind lösbar • Automotive-Anwendungen existieren bereits • Weitere Boost C++ Lösungen verfügbar (Asynchron) Das Modell ist im Code | Christoph Woskowski 3. Dezember 2014 Folie 20
  21. 21. © Zühlke 2014 Gibt es Fragen? Schreiben Sie mir einfach eine Email Christoph.Woskowski@zuehlke.com

×