21
© Zühlke 2014 Das Modell ist im Code Das Modell ist im Code | Christoph Woskowski 3. Dezember 2014 Folie 1

Das Modell ist im Code (ESE-Kongress 2014)

  • Upload
    zuehlke

  • View
    366

  • Download
    1

Embed Size (px)

DESCRIPTION

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.

Citation preview

Page 1: Das Modell ist im Code (ESE-Kongress 2014)

© Zühlke 2014

Das Modell ist im Code

Das Modell ist im Code | Christoph Woskowski 3. Dezember 2014 Folie 1

Page 2: Das Modell ist im Code (ESE-Kongress 2014)

© 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

Page 3: Das Modell ist im Code (ESE-Kongress 2014)

© 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

Page 4: Das Modell ist im Code (ESE-Kongress 2014)

© 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

Page 5: Das Modell ist im Code (ESE-Kongress 2014)

© 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

Page 6: Das Modell ist im Code (ESE-Kongress 2014)

© 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

Page 7: Das Modell ist im Code (ESE-Kongress 2014)

© 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

Page 8: Das Modell ist im Code (ESE-Kongress 2014)

© Zühlke 2014

Kurzeinführung Boost MSM

Das Modell ist im Code | Christoph Woskowski

CD-Player Beispiel – Diagrammform

3. Dezember 2014 Folie 8

Page 9: Das Modell ist im Code (ESE-Kongress 2014)

© 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

Page 10: Das Modell ist im Code (ESE-Kongress 2014)

© 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

Page 11: Das Modell ist im Code (ESE-Kongress 2014)

© 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

Page 12: Das Modell ist im Code (ESE-Kongress 2014)

© 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

Page 13: Das Modell ist im Code (ESE-Kongress 2014)

© Zühlke 2014

Automotive-Beispiel: TaxameterSpiegeltaxameter

Das Modell ist im Code | Christoph Woskowski 3. Dezember 2014 Folie 13

Page 14: Das Modell ist im Code (ESE-Kongress 2014)

© 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

Page 15: Das Modell ist im Code (ESE-Kongress 2014)

© 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

Page 16: Das Modell ist im Code (ESE-Kongress 2014)

© 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

Page 17: Das Modell ist im Code (ESE-Kongress 2014)

© 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

Page 18: Das Modell ist im Code (ESE-Kongress 2014)

© 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

Page 19: Das Modell ist im Code (ESE-Kongress 2014)

© Zühlke 2014

Das Modell sichtbar machenMSM for Zest (Eclipse Visualization Toolkit)

Das Modell ist im Code | Christoph Woskowski 3. Dezember 2014 Folie 19

Page 20: Das Modell ist im Code (ESE-Kongress 2014)

© 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

Page 21: Das Modell ist im Code (ESE-Kongress 2014)

© Zühlke 2014

Gibt es Fragen?Schreiben Sie mir einfach eine [email protected]