Zum Hauptinhalt springen

Vertragsbasierte Softwareentwicklung mit Franca

Dr. Klaus Birken Dr. Klaus Birken 6 Min. Lesezeit
Vertragsbasierte Softwareentwicklung mit Franca

Interface-Definitionssprachen

In jeder Art von Softwarearchitektur sind Schnittstellen zwischen Komponenten, Subsystemen oder Systemen wichtige Artefakte. Sie repräsentieren den Vertrag nicht nur zwischen diesen Architekturbausteinen, sondern auch zwischen organisatorischen Einheiten wie Teams, Abteilungen oder Unternehmen. Daher werden Schnittstellen häufig als erstklassige Entitäten mit einer Interface Definition Language (kurz: IDL) modelliert.

Im Vergleich zu Schnittstellen, die mit einer allgemeinen Programmiersprache definiert werden (z. B. ein Java-Interface oder eine C++-Klasse), sind IDL-Modelle technologieneutral und sprachunabhängig. Dieselbe Schnittstellendefinition kann in einer Webanwendung verwendet werden, indem sie auf einen RESTful-Service abgebildet wird, und in einem eingebetteten System, indem daraus C++-Code generiert wird. Die Schnittstelle wird dann als Verbindung zwischen zwei Prozessen auf einem Inter-Prozess-Kommunikations-Stack realisiert. Die im Interface definierten Datenstrukturen und Kommunikationsprimitive werden auf passende Implementierungskonzepte auf dem Zielsystem abgebildet.

Franca IDL

Franca ist ein Werkzeug zur Definition und Transformation von Software-Schnittstellen. Sein Kern ist Franca IDL, eine textuelle Sprache zur Spezifikation von APIs. Franca IDL deckt folgende Aspekte ab:

  • Datentypen, Konstanten und Initialisierungsausdrücke
  • eigentliche Schnittstellen bestehend aus Attributen, Methoden und Broadcasts
  • Protocol State Machines zur Spezifikation dynamischen Verhaltens

Eine Schnittstelleninstanz wird typischerweise von einer Server-Komponente (oder einem Service) bereitgestellt und von einer oder mehreren Client-Komponenten genutzt. In diesem Kontext sind Attribute Datenwerte, die vom Server bereitgestellt und von den Clients abgerufen werden können. Attribute können auch einen Benachrichtigungsmechanismus unterstützen. Methoden werden von einem Client aufgerufen und auf dem Server ausgeführt; dieser kann eine Ergebnisantwort oder einen Fehler zurücksenden. Mit Broadcasts initiiert der Server die Kommunikation mit seinen Clients. Broadcasts sind ähnlich wie Events, können aber zusätzliche Daten enthalten. Alle Details zu Datentypen und Schnittstellen von Franca IDL sind im Referenzkapitel des Franca User Guide zu finden.

Beispiel: Franca-Interface

Der folgende Screenshot zeigt ein Beispiel-Interface mit Franca IDL. Es spezifiziert eine einfache Musik-Wiedergabe-API.

example-interface-franca-idl.png

Die Methode findTrackByTitle bietet eine Möglichkeit, einen Musiktitel anhand eines Eingabe-Strings auszuwählen. Von allen Titeln, die dem Eingabe-String entsprechen, wird der beste Treffer ausgewählt und als Attribut currentTrack gesetzt. Kann kein passender Titel gefunden werden, gibt der Server einen NOT_FOUND-Fehlercode zurück. Das Attribut ist als readonly gekennzeichnet, da Clients seinen Wert nicht ändern können sollen. Zu beachten ist auch, dass der Typ des Attributs currentTrack ein Struct mit den Elementen title, interpret und coverURL ist. Letzteres ermöglicht den Abruf des Cover-Bildes des Albums zum jeweiligen Titel.

Nachdem ein passender Titel ausgewählt wurde, können die Methoden play und pause zur Steuerung der Wiedergabe verwendet werden. Keine dieser Methoden hat Argumente oder Rückgabewerte. In dieser Interface-Definition gibt es kein Broadcast-Element.

Franca-Tooling

Obwohl Franca IDL mit beliebigen Modellierungswerkzeugen implementiert werden könnte, die eine textuelle Notation unterstützen, basiert die aktuelle Standardimplementierung auf der Eclipse-IDE. Das Franca-Projekt ist Open-Source und unter der Eclipse Public License veröffentlicht. Das Quellcode-Repository ist auf github gehostet. Franca wurde als Standard-Eclipse-Projekt anerkannt, und der Übergang zur Eclipse Foundation ist im Gange. Die Implementierung nutzt das Eclipse Modeling Framework (EMF) und das DSL-Framework Xtext.

Neben Franca IDL bietet das Franca-Tool-Projekt eine Vielzahl weiterer Features, die im folgenden Diagramm dargestellt sind.

franca-tool-features.png

Transformationen und Codegenerierung

Franca bietet ein Framework zum Aufbau von Transformationen von und zu anderen IDLs und modellbasierten Interface-Beschreibungen (z. B. D-Bus, Protobuf, OMG IDL, UML, AUTOSAR). Einige dieser Transformationen sind in den Standard-Franca-Releases als optional installierbare Features enthalten. Franca unterstützt auch die Codegenerierung mit einigen bereits verfügbaren Open-Source-Code-Generatoren. Derzeit ist CommonAPI C++ das leistungsfähigste Open-Source-Codegenerator-Werkzeug auf Basis von Franca.

Flexible Deployment-Modelle

In bestimmten Anwendungsdomänen kann es notwendig sein, Interface-Spezifikationen um plattform- oder zielspezifische Informationen zu erweitern. Um Franca-Interfaces z. B. als SOME/IP-Kommunikation zu implementieren, müssen für jede Methode eindeutige IDs angegeben werden. Dies wird durch Francas Deployment-Modell-DSL unterstützt, die es Benutzern ermöglicht, diese Erweiterungen typsicher zu spezifizieren.

Rapid Interface Prototyping

Eine ausführbare Testumgebung für eine Interface-Definition kann sofort generiert werden, sodass Benutzer das Interface direkt in Aktion sehen können. Dies wird durch die Generierung von Test-Clients und Mock-Servern aus Franca-Interfaces erreicht. Dieses Feature ist experimentell.

Spezifikation des dynamischen Verhaltens

Mit Franca kann das dynamische Verhalten von Client/Server-Interaktionen mithilfe von Protocol State Machines spezifiziert werden. Es stehen Werkzeuge zur Verfügung, um diese Spezifikationen zur Validierung von Implementierungen zu nutzen, z. B. durch Überprüfung von Runtime-Traces gegen die erwartete Ereignisreihenfolge auf dem Interface. Franca bietet auch einen grafischen Viewer für Protocol State Machines.

Anwendungsfälle von Franca

Neben der Definition und Überprüfung von Interface-Definitionen umfassen typische Anwendungsfälle von Franca die Codegenerierung (z. B. mit dem CommonAPI-C++-Projekt), Transformationen von und zu anderen Modellierungssprachen und -technologien sowie als Baustein für ausdrucksstärkere Architektur-Modellierungswerkzeuge, die Konzepte wie hierarchische Komponenten, Ports und Connectoren bereitstellen.

Franca wird vom GENIVI-Konsortium als IDL und Integrationswerkzeug für die Entwicklung offener Plattformen für In-Vehicle-Infotainment-Systeme eingesetzt. Es wird hauptsächlich von Fahrzeugherstellern und Zulieferern im Automotive-Bereich genutzt (z. B. von BMW, Bosch oder Continental), aber auch in nicht-automobilen Umgebungen. Es gibt auch Forschungsprojekte und Open-Source-Frameworks, die Franca als Baustein in einer größeren Tooling-Umgebung verwenden. Das joynr-webbasierte Kommunikations-Framework nutzt Franca z. B. als IDL und als Grundlage für seine Java- und C++-Codegeneratoren. Es unterstützt die Interaktion von Anwendungen, die auf Consumer-Geräten, Fahrzeugen oder Backend-Infrastruktur betrieben werden.

Vertragsbasierte Entwicklung mit Franca

Üblicherweise konzentrieren sich IDLs auf die statischen Aspekte von Schnittstellen, d. h. Datentypen, Attribute und Operationen. Oft gibt es jedoch Einschränkungen bezüglich der Reihenfolge der Interaktionen auf dem Interface. So muss z. B. eine init()-Methode aufgerufen werden, bevor andere Interaktionen auf dem Interface erlaubt sind. Diese Spezifikation der Ereignisreihenfolge und des dynamischen Verhaltens ist häufig Teil der Dokumentation, die dem Interface beiliegt, z. B. als Klartext oder Sequenzdiagramme. Dies hat erhebliche Nachteile: Klartext kann von automatischen Werkzeugen überhaupt nicht ausgewertet werden – Sequenzdiagramme können nur einzelne Beispiele erlaubten oder verbotenen Verhaltens darstellen.

Franca IDL bietet ein ausdrucksstärkeres Mittel zur Spezifikation dieser Art von Dynamik: Für jedes Interface kann eine Protocol State Machine (PSM) definiert werden. Damit lässt sich exakt festlegen, welche Ereignisreihenfolge bei jeder Implementierung dieses Interfaces erlaubt ist. Jede Sequenz, die von der PSM nicht abgedeckt wird, verletzt den Vertrag. Die PSMs in Franca IDL werden in textueller Form definiert. Zusätzlich gibt es einen Graphviz-Export für PSMs und eine Eclipse-View auf Basis von ELK (ehemals KIELER).

Die folgende PSM spezifiziert das dynamische Verhalten für das Musicplayer-Interface-Beispiel. Sie legt z. B. fest, dass play nur nach einem erfolgreichen Aufruf von findTrackByTitle aufgerufen werden kann. Der Anfangszustand dieser PSM ist Idle. Zu beachten ist, dass jede Franca-Methode als Call/Respond-Transitionspaar in der PSM dargestellt wird.

franca-example-protocol-statemachine.png

Was sind die Vorteile, PSMs für alle Schnittstellen zu definieren? Schließlich ist dies zusätzlicher Aufwand, und ein paar Zeilen Dokumentation sind vermutlich ein angemessener Ersatz. Aber wie wir aus komplexen Industrieprojekten wissen, werden viele schwer auffindbare Integrationsfehler durch Missverständnisse über die tatsächlichen Ereignissequenzen auf den Schnittstellen zwischen Organisationen oder Subsystemen verursacht. Deshalb ist es so vorteilhaft, PSMs für Schnittstellen zu definieren und Werkzeuge einzusetzen, die eine statische oder Laufzeit-Überprüfung verletzter Verträge ermöglichen.

Ein wichtiger Anwendungsfall ist die Überprüfung von Traces, die von einem realen System aufgezeichnet wurden, gegen die PSMs seiner Schnittstellen. Da die zwischen Komponenten ausgetauschten Nachrichten oft ohne Änderung des eigentlichen Quellcodes aufgezeichnet werden können (z. B. durch Aktivierung einer Probe in der Kommunikationsinfrastruktur), ist dies ein leichtgewichtiger, aber dennoch leistungsstarker Weg zur Validierung der dynamischen Interaktionen zwischen Komponenten. Das Werkzeug EB solys unterstützt dies und viele weitere fortgeschrittene Features auf Basis von Franca. Es wird in einem späteren Blogpost unseres Partners Elektrobit beschrieben – stay tuned!

Unterdessen können Sie im kostenlosen User Guide alles über das Framework Franca erfahren!


Custom Tools bei itemis — Wir entwickeln maßgeschneiderte Werkzeuge und Integrationen für Ihre Software-Entwicklungs-Toolchain: Custom Tools →

Dr. Klaus Birken

Principal Expert

Dr. Klaus Birken ist Principal Expert bei itemis mit Fokus auf kundenspezifischen Modellierungswerkzeugen und Variantenmanagement. Nach einem Jahrzehnt als Softwarearchitekt im Infotainment-Bereich gestaltet er seit 2012 Projekte rund um modellbasierte Tools und DSLs (vor allem mit JetBrains MPS) und teilt sein Wissen als Konferenzsprecher. Sein aktueller Schwerpunkt gilt der wertschöpfenden Verbindung von KI-Agenten und modellbasierter Entwicklung.

Weitere Artikel zu diesem Thema

KI-Agenten treffen auf Projectional Editing: Portalon für MPS
Blog Custom tools

KI-Agenten treffen auf Projectional Editing: Portalon für MPS

Wie das Portalon-Plugin KI-Coding-Agenten wie Claude über MCP mit dem laufenden Modell eines JetBrains-MPS-Projekts verbindet – strukturell sichere Änderungen, Validierung und Language-Engineering-Skills, auf Ihrer aktuellen MPS-Version.

Zum Blog
Dr. Klaus Birken Dr. Klaus Birken 9 Min. Lesezeit
Variantenmanagement: mehr als Feature-Strings
Blog Custom tools

Variantenmanagement: mehr als Feature-Strings

Feature-Modelle lose mit Entwicklungsartefakten zu verknüpfen ist praktisch – birgt aber Risiken. Dieser Artikel zeigt, welche Vorteile eine enge Integration bietet: frühzeitige Fehlererkennung, implizite Variationspunkte und automatische Konsistenzprüfungen.

Zum Blog
Dr. Klaus Birken Dr. Klaus Birken 5 Min. Lesezeit
Zustandsautomaten-Origami
Blog Custom tools

Zustandsautomaten-Origami

Wie Franca IDL und itemis CREATE integriert werden können, um Embedded-Softwarekomponenten bereits während der Entwicklung interaktiv gegen Interface-Verträge zu validieren.

Zum Blog
Dr. Klaus Birken Dr. Klaus Birken 8 Min. Lesezeit