Schnittstelle für Schnittstellen

Eclipse Franca: Modellbasiert Softwareinterfaces entwerfen, vereinbaren, austauschen

Dr. Klaus Birken

© Shutterstock / violetkaipa

Für erfolgreiche große Softwareprojekte bedarf es immer mehr der Zusammenarbeit von Entwicklern über Organisationsgrenzen hinaus. Schnittstellen als Grundelemente der Architektur spielen dabei eine Schlüsselrolle – sie sind der Vertrag zwischen den Komponenten, Systembestandteilen und Partnern. Das Franca-Projekt bietet die Toolinfrastruktur für den Entwurf und den Austausch von Softwareschnittstellen. Franca wird als Open-Source-Projekt schon heute in vielen verschiedenen Umgebungen verwendet und ist auf dem Weg, ein offizielles Eclipse-Projekt zu werden.

Viele Autobesitzer dürfen sich heute über die vielfältigen Funktionen ihres In-Car-Multimedia-Systems freuen. Der Featureumfang solcher In-Vehicle-Infotainment-Systeme (kurz: IVI) geht längst über grundlegende Radio- und Navigationsfunktionen hinaus; kontinuierlich kommen neue Features wie Internet-Connectivity, Car-2-X-Funktionen oder Gestensteuerung hinzu. Entsprechend aufwändig und komplex ist auch die Softwarearchitektur solcher Systeme. Die GENIVI Alliance ist ein internationales Konsortium aus Unternehmen, das sich die Definition und Entwicklung einer Open-Source-Referenzplattform für IVI-Systeme zum Ziel gesetzt hat. Damit ist die Aufgabe in doppelter Hinsicht komplex: Die Plattformarchitektur (bestehend aus Hunderten von Komponenten) will beherrscht werden; gleichzeitig müssen viele Unternehmen und Open-Source-Communities bei der Entwicklung zusammenarbeiten.

Schon seit Langem wurde bei GENIVI die zentrale Rolle von Softwareschnittstellen bei der zu bewältigenden Aufgabe erkannt. Zur Modellierung von Schnittstellen gibt es in der Informatik schon seit jeher Beschreibungssprachen (sog. Interface Definition Languages, kurz IDL). Diese erlauben es, Schnittstellen formal zu definieren und daraus automatisch Code zu generieren. Beispiele für solche IDLs sind OMG IDL, WebIDL, Apache Thrift oder D-Bus Introspection Format. Auch grafische Modellierungssprachen wie UML können zur Definition von Schnittstellen verwendet werden. Viele Unternehmen setzen solche Technologien bereits ein. Sollen nun deren Teillösungen zu einem Komplettsystem oder einer Plattform integriert werden, müssen nicht nur die implementierten Schnittstellen kompatibel gemacht werden – vorher sollten auch die verwendeten Formate der Schnittstellenbeschreibung aufeinander abgebildet werden, damit ein einheitliches Architekturmodell entstehen kann. Das Franca-Projekt unterstützt diesen Ansatz, indem es eine flexible IDL mit einem Framework für Modelltransformationen kombiniert. Franca ging Anfang 2012 aus einer Arbeitsgruppe bei GENIVI hervor und ist seitdem als Open-Source-Projekt frei verfügbar.

Definition von Schnittstellen mit Franca

Franca ist als Eclipse-Update-Site verfügbar und lässt sich somit in typische Eclipse-IDEs integrieren. Zur Modellierung von Schnittstellen dient eine Xtext-basierte, domänenspezifische Sprache: Franca IDL. Die IDL definiert Schnittstellen aus Serversicht; typische Anwendungsfälle sind komponentenbasierte oder serviceorientierte Architekturen. Listing 1 zeigt ein Beispiel einer Softwareschnittstelle, die mit Franca IDL modelliert wurde. Interfaces können mit Franca IDL aus den folgenden Grundelementen gebildet werden:

  • Datentypen: vordefinierte (z. B. Integer, String) und benutzerdefinierte Datentypen (struct, array, enumeration etc.)
  • Attribute: getypte Datenelemente mit Observer- und Updatemechanismen
  • Methoden: Operationen mit getypten Argumenten und Rückgabewerten
  • Broadcasts: serverinitiierte Kommunikation mit clientseitigem Callback

In Enterprise- und webbasierten Anwendungen gibt es meist nur die Kommunikation „von oben nach unten“, d. h. vom Benutzer über die Geschäftslogik bis hin zu betriebssystemnahen Schichten. In vielen technischen, ereignisgetriebenen Systemen spielt aber zusätzlich die Kommunikation in der Gegenrichtung eine Rolle: Asynchrone Anwendungsfälle wie „eingehender Anruf“ oder Events aus der Sensorikhardware sollten explizit in der modellierten Schnittstelle abgebildet werden. Dafür bietet Franca IDL das Element broadcast an.

package org.example
interface MediaPlayer {
  attribute String currentTime readonly
  method playMusic {
    in { Genre genre }
    out { Boolean ok }
  }
  broadcast playingTitle {
    out { String title }
  }
  enumeration Genre {
    M_POP, M_CLASSICAL, M_JAZZ
  }
}

Franca IDL ist eine domänenspezifische Sprache (engl. Domain Specific Language, kurz: DSL). Deshalb geschieht die Modellierung von Interfaces und Datentypen in Form von Textdateien. Dies erlaubt die Handhabung von Modellen wie bei Sourcecode gewohnt. So können beispielsweise Versionsverwaltungssysteme wie Git oder SVN verwendet werden. Die Sichtbarkeit von Bezeichnern in der IDL wird über ein Java-ähnliches package/import-Konzept gesteuert.

Zusätzlich zu den oben beschriebenen Grundelementen bietet Franca IDL Vererbungsmechanismen, z. B. für Schnittstellen oder Datentypen. Über strukturierte Kommentare mit Tags (ähnlich wie Javadoc) können jedem Modellelement bei Bedarf Metainformationen hinzugefügt werden. Dies sind zum Beispiel Informationen wie @author oder @deprecated.

Spezialisierung über Deployment-Modelle

Bei der Festlegung einer IDL treffen vielfältige Interessen aufeinander; je nach Anwendungsfall gibt es spezielle Vorstellungen, welche Informationen in der IDL modellierbar sein sollen. Gerade vor dem Hintergrund, dass Franca über Modelltransformationen zwischen verschiedenen IDLs vermitteln soll, ist die Gefahr groß, dass der Sprachumfang der IDL unkontrollierbar wächst. Um dies zu verhindern, wird ein Mechanismus benötigt, der die flexible Erweiterung der IDL erlaubt, ohne die Semantik des Sprachkerns aufzuweichen.

Franca bietet genau diesen Mechanismus an: Deployment-Modelle. Diese sind als eine weitere DSL implementiert, welche Franca IDL ergänzt und es erlaubt, bestehende Interfacedefinitionen mit zusätzlichen Informationen anzureichern. Dazu wird zunächst mit einer Deployment-Spezifikation in einer aspektorientierten Weise festgelegt, welche Zusatzinformationen für eine Schnittstelle in einer bestimmten Deployment-Umgebung gefordert werden. Im Beispiel von Listing 2 wird für Elemente einer Schnittstelle vom Typ String festgelegt, dass ein String Encoding und eine maximale Länge angegeben werden können. Die Bezeichner Encoding, MaxLength, utf8, utf16 und unicode sind dabei frei wählbar. Deployment-Spezifikationen werden in der Praxis typischerweise von Architekten oder Codegeneratorverantwortlichen zentral festgelegt.

specification org.example.DeploySpec {
  for strings {
    Encoding:  { utf8, utf16, unicode }  (default: utf8);
    MaxLength:  Integer  (optional);
  }
}

Basierend auf einer vorhandenen Deployment-Spezifikation können nun für jede Schnittstelle eine oder mehrere Deployment-Definitionen festgelegt werden. Listing 3 zeigt dies am Beispiel: Das Attribut currentTime der Schnittstelle MediaPlayer ist vom Typ String. In der Deployment-Definition werden nun die Eigenschaften aus der Spezifikation für dieses Attribut festgelegt. Dies geschieht typsicher und nach festgelegten Regeln (z. B. default, optional). Ein Codegenerator könnte nun auf der Deployment-Definition der Schnittstelle aufsetzen und die zusätzlichen Informationen verwenden.

define org.example.DeploySpec for interface org.example.MediaPlayer {
  attribute currentTime {
    Encoding = utf16
    MaxLength = 256
  }
}

Transformationen und Generatoren

Es ist ein zentrales Ziel des Franca-Projekts, eine Plattform für die Transformation zwischen verschiedensten IDLs und gleichzeitig einen zentralen Startpunkt für die Codegenerierung aus Interfacebeschreibungen zu schaffen. Franca IDL sowie die Deployment-Modellierung beruhen auf dem Eclipse Modeling Framework (EMF). Damit gibt es die grundlegende Möglichkeit, Franca-Modelle an alle IDLs und Formate anzubinden, für die eine EMF-Implementierung existiert (z. B. beliebige XML-Formate). Eine für die Entwicklung von Modelltransformationen geeignete Programmiersprache ist Xtend. Diese Technologien in Verbindung mit dem Franca-Basisframework bilden die Infrastruktur, um Toolnetzwerke zur Manipulation von Schnittstellen in verschiedensten Formaten aufzubauen.

Abbildung 1 zeigt ein solches Netzwerk. Ein D-Bus-Connector erlaubt die Umwandlung von XML-Dateien im D-Bus Introspection-Format von und nach Franca; dies ist im Lieferumfang von Franca enthalten. Weiterhin gibt es Anbindungen zu UML- und AUTOSAR-Modellen (als separate Tools frei verfügbar). Schließlich wurde im Beispiel eine Reihe von Generatoren angebunden, die aus Franca-Schnittstellen z. B. C++ Sourcecode, einen JavaScript/WebSockets-Layer oder HTML-Seiten erzeugen. Im obigen Setup könnte man z. B. eine Schnittstelle aus einem AUTOSAR-Modell zuerst in ein Franca-Interface transformieren und danach durch Codegenerierung in einer HTML5-Anwendung verfügbar machen.

In Abbildung 1 wird u. a. der CommonAPI-Codegenerator erwähnt. CommonAPI C++ ist ein Franca-Schwesterprojekt, das einen flexiblen Generierungsansatz unterstützt. Aus Franca-Interfaces lassen sich automatisch C++ APIs und die passenden Implementierungen für verschiedene Kommunikations-Stacks generieren. So können Komponenten durch Austausch des Generators ohne weitere manuelle Anpassungen in unterschiedliche Umgebungen portiert werden. CommonAPI C++ ist als Open Source verfügbar und wird derzeit v. a. für Linux-basierte Systeme im Automobilbereich eingesetzt.

Abb. 1: Transformations- und Generatornetzwerk mit Franca

Abb. 1: Transformations- und Generatornetzwerk mit Franca

Dynamisches Verhalten

Komplexe technische Softwaresysteme werden üblicherweise aus vielen Einzelteilen zusammengesetzt, die von mehreren Abteilungen oder Unternehmen separat entwickelt und zugeliefert werden. Diese Integration wird mindestens für jedes Release durchgeführt und sollte so vorbereitet werden, dass Aufwand und Risiko minimiert werden. Formal beschriebene Schnittstellen leisten dazu einen wichtigen Beitrag, da so im Vorfeld abgestimmt werden kann, auf welche Art die einzelnen Teile zusammenpassen. In heutigen Entwicklungsprozessen werden allerdings meist nur die statischen Bestandteile von Schnittstellen formal festgelegt, z. B. die oben beschriebenen Grundelemente Datentyp, Attribut oder Methode. Viele Probleme bei der Systemintegration resultieren aber aus Missverständnissen beim dynamischen Verhalten an der Schnittstelle; dies können z. B. unterschiedliche Auffassungen von Aufrufreihenfolgen oder Timing-Eigenschaften sein.

Franca adressiert dieses Problem: Zu jeder Schnittstelle kann mit Franca IDL ein sog. Contract definiert werden, der das dynamische Verhalten der Schnittstelle in Form eines Protokollzustandsautomaten (engl. Protocol State Machine, kurz: PSM) formal beschreibt. Im Gegensatz zur Spezifikation mit Sequenzdiagrammen erlauben PSMs eine vollständige Festlegung des Verhaltens einer Schnittstelle. Ein Protokollzustandsautomat beschreibt alle erlaubten Folgen von Ereignissen zwischen Client und Server einer Kommunikationsbeziehung. Er läuft „gedanklich“ auf jeder Kommunikationsverbindung zwischen zwei Komponenten mit. Um den Speicher- und Laufzeitaufwand eines Systems nicht unnötig zu erhöhen, wird im Allgemeinen aus einem PSM kein zusätzlicher Code generiert. Abbildung 2 zeigt einen solchen PSM für die Franca-Schnittstelle einer Roboterarmsteuerung. Die Transitionen im PSM werden durch Events auf der Kommunikationsverbindung ausgelöst, z. B. durch Aufruf einer Methode oder Setzen eines Attributs. Gibt es aus einem bestimmten Zustand keine ausgehende Transition für ein Ereignis, so ist dieses Ereignis nicht erlaubt. So verbietet der dargestellte Zustandsautomat das zweimalige Schließen des Robotergreifers ohne dazwischenliegendes Loslassen (grab/release).

Abb. 2: Beispiel eines Franca Protokollzustandsautomaten

Abb. 2: Beispiel eines Franca Protokollzustandsautomaten

Es gibt eine ganze Reihe von sinnvollen Möglichkeiten für die Nutzung dieser formal beschriebenen Schnittstellendynamik. Beispielsweise kann der Zustandsautomat in eine statische Analyse des Systems einbezogen werden (z. B. über Model Checking). Weiterhin können im laufenden System Trace-Daten aufgezeichnet und mit den PSMs der Franca-Schnittstellen automatisiert abgeglichen werden. Dieser Ansatz ermöglicht eine flächendeckende Überwachung von Testläufen und die automatische Erkennung von Verletzungen der Vereinbarung zwischen Subsystemen.

Für die Aufzeichnung von Traces wird bei GENIVI beispielsweise das Tool DLT-Viewer (kurz für Diagnostics, Log and Trace) eingesetzt. Es läuft auf dem Entwicklungsrechner und empfängt Trace-Daten vom zu entwickelnden Embedded System. Für DLT-Viewer ist ein Plug-in verfügbar, das die oben beschriebene Analyse des dynamischen Verhaltens durchführt und den Entwickler direkt auf Ablauffehler hinweist.

Franca: Schnittstelle für Schnittstellen

Franca verfolgt einen sehr allgemeinen, aber dennoch praxisnahen Ansatz. Daher gibt es viele Anwendungsmöglichkeiten und -domänen: Komponentenbasierte Embedded-Systeme, Infotainment- und Fahrerassistenzsysteme in der Automobiltechnik, Internet-of-Things-Anwendungen oder HTML5-basierte Benutzerschnittstellen sind nur einige Anwendungsbeispiele.

Franca basiert auf Eclipse-Technologien und möchte zukünftig noch näher an die Eclipse-Community heranrücken. Deshalb ist geplant, Franca als offizielles Eclipse-Projekt im Rahmen des Eclipse-Modeling-Projekts zu etablieren. Für die Zukunft liegt eine Zusammenarbeit mit anderen Eclipse-Projekten oder -Initiativen nahe, z. B. Eclipse Automotive IWG oder Eclipse IoT.

Das Ziel von Franca ist nicht nur die formale Beschreibung von Schnittstellen mittels einer IDL, sondern die Bereitstellung einer gemeinsamen Plattform für den Umgang mit Interfacemodellen. Damit ist Franca eine „Schnittstelle für Schnittstellen“, die bei großen Entwicklungsvorhaben eine zentrale Rolle für die Integration der einzelnen Systembestandteile spielt.

Aufmacherbild: hand pushing on a touch screen interface via Shutterstock / Urheberrecht: violetkaipa

Geschrieben von
Dr. Klaus Birken

Dr. Klaus Birken ist als Teamleiter und Berater mit den Schwerpunkten Automotive und Eclipse bei der itemis AG tätig. Er leitet das Franca-Projekt, ist Vortragender auf internationalen Konferenzen und Autor zahlreicher Veröffentlichungen, z. B. des Buchs „Basiswissen Softwarearchitektur“.

Kommentare

Hinterlasse einen Kommentar

Hinterlasse den ersten Kommentar!

avatar
400
  Subscribe  
Benachrichtige mich zu: