Post on 08-Jul-2015
description
© 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 Modell sichtbar machen
• Zusammenfassung
Das Modell ist im Code | Christoph Woskowski
Agenda
3. Dezember 2014 Folie 2
© 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
© 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
© Zühlke 2014
Externe und interne DSLsExterne DSLs – Die Variante Xtext
Das Modell ist im Code | Christoph Woskowski
ExecutableGraphische DSL
Textuelle DSL
ModellCode –Generator
SourceCode
Compiler
3. Dezember 2014 Folie 5
© Zühlke 2014
Externe und interne DSLsInterne DSLs – Die Variante C++
Das Modell ist im Code | Christoph Woskowski
Executable
SourceCode
CompilerDSL
Modell
3. Dezember 2014 Folie 6
© 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 MSMGeschichtliches
3. Dezember 2014 Folie 7
© Zühlke 2014
Kurzeinführung Boost MSM
Das Modell ist im Code | Christoph Woskowski
CD-Player Beispiel – Diagrammform
3. Dezember 2014 Folie 8
© Zühlke 2014
Kurzeinführung Boost MSMCD-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
© Zühlke 2014
Kurzeinführung Boost MSMCD-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
© 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
© 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
© Zühlke 2014
Automotive-Beispiel: TaxameterSpiegeltaxameter
Das Modell ist im Code | Christoph Woskowski 3. Dezember 2014 Folie 13
© 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
© 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
© 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
© Zühlke 2014
Automotive-Beispiel: TaxameterLö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
© Zühlke 2014
Das Modell sichtbar machenInterne DSL visualisieren
Das Modell ist im Code | Christoph Woskowski
Executable
SourceCode
CompilerDSL
Modell
Visualisierung
3. Dezember 2014 Folie 18
© Zühlke 2014
Das Modell sichtbar machenMSM for Zest (Eclipse Visualization Toolkit)
Das Modell ist im Code | Christoph Woskowski 3. Dezember 2014 Folie 19
© 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
© Zühlke 2014
Gibt es Fragen?Schreiben Sie mir einfach eine EmailChristoph.Woskowski@zuehlke.com