Entwicklungswerkzeuge mbeddr - Embedded-Entwicklung mit erweiterbarem C
Was wäre, wenn Programmiersprachen genau so einfach erweiterbar wären wie Programme? Der Artikel zeigt im Kontext eingebetteter Systeme, wie sich mit der Entwicklungsumgebung mbeddr die Programmiersprache C erweitern lässt.
Anbieter zum Thema

Die Entwicklung eingebetteter Systeme stellt die folgenden Herausforderungen an den Entwickler:
Abstraktionen ohne Laufzeit-Overhead: Dass Abstraktionen bei der Softwareentwicklung von Vorteil sind, wissen wir alle. Gute Abstraktionen führen zu weniger Code, besserer Analysierbarkeit sowie besserer Wartbarkeit. In eingebetteten Systemen müssen derartige Abstraktionen allerdings mit wenig Laufzeitkosten verbunden sein, da die Ressourcen auf den Zielgeräten üblicherweise beschränkt sind.
C ist gefährlich: Die am weitesten verbreitete Programmiersprache für eingebettete Systeme ist C. Allerdings hat C durchaus einige hässliche Ecken, die im Kontext eingebetteter Systeme zu ernsthaften Problemen führen können und deren Verwendung unter bestimmten Umständen daher eingeschränkt werden können sollte. Dazu gehören zum Beispiel Void-Pointer sowie die unkontrollierte Verwendung des Präprozessors.
Programmannotationen: Programme in technischen Domänen benötigen oft zusätzliche Spezifikationen für Typen oder Variablen. Dazu gehören Größenbeschränkungen, physikalische Einheiten, oder Zugriffsbeschränkungen. Diese lassen sich in C nicht sinnvoll an den entsprechenden Typen oder Variablen anbringen und werden nicht mit zum Typchecking mit herangezogen
Verifikation: Eingebettete Software wird häufig in sicherheitskritischen Systemen eingesetzt. Dort muss Software, bevor sie verwendet wird, möglichst umfangreich auf Korrektheit untersucht werden. Die Verifikation von C ist sehr teuer, insbesondere aufgrund ihrer Komplexität und des niedrigen Abstraktionslevels von C.
Prozessunterstützung: Ein Großteil aller eingebetteten Systeme wird im Kontext von Produktlinien entwickelt. Um die damit einhergehende Komplexität in den Griff zu bekommen, ist es unter anderem nötig, die Variabilität der Produkte innerhalb der Produktlinie systematisch zu verwalten und eine stringente Traceability von den Implementierungsartefakten zu den Anforderungen sicherzustellen.
Aufgrund all dieser Anforderungen werden eingebettete Systeme oft mit einer Vielzahl von Werkzeugen entwickelt. Die Integration all dieser Werkzeuge führt allerdings zu weiteren Herausforderungen.
Der Ansatz von mbeddr
Um die oben genannten Herausforderungen in den Griff zu bekommen, geht mbeddr einen neuen Weg: Neben einer IDE (Integrated Development Entironment) für C stellt mbeddr verschiedene Spracherweiterungen für C zur Verfügung und erlaubt es mittels eines SDKs (Software Development Kit) weitere Erweiterungen hinzuzufügen oder die Nutzung existierender Konzepte einzuschränken. Bild 1 zeigt die mbeddr-IDE beim Bearbeiten eines C-Programms mit diversen Erweiterungen.
Im weiteren Verlauf dieses Artikels zeigen wir, wie die oben genannten Herausforderungen durch Spracherweiterungen gelöst bzw. entschärft werden können. Dies tun wir anhand eines auf Lego Mindstorms basierenden Beispiels (Bild 2). Mit Hilfe von Mindstorms können kleine autonome Roboter gebaut werden. An den Mindstorm können bis zu 3 Aktuatoren und 4 Sensoren angeschlossen werden. Normalerweise wird Mindstorms mit Hilfe einer grafischen, auf Blockdiagrammen basierenden Sprache programmiert. Mit Hilfe des nxtOSEK-Projekts ist jedoch auch eine C-basierte Programmierung möglich. Wie aus dem Namen des Projekts erkennbar, wird hierbei das Echtzeit-Betriebssystem OSEK verwendet.
Spracherweiterung und MPS
Unter Spracherweiterung versteht man das modulare Hinzufügen neuer Sprachkonzepte zu existierenden Sprachen. Die Betonung dabei liegt auf modular: die Basissprache, in unserem Fall C, darf nicht invasiv verändert werden, um neue Sprachmodule hinzuzufügen. Außerdem sollten sich verschiedene unabhängig voneinander entwickelte Spracherweiterungen nicht gegenseitig stören. Dies hat insbesondere zur Folge, dass die Komposition von unabhängig entwickelten Syntaxbeschreibungen (Grammatiken) nicht zu ungültigen Syntaxbeschreibungen führen darf.
Neue, typischerweise abstraktere oder domänenspezifische Sprachkonstrukte werden mittels Transformationen auf existierende Sprachkonstrukte zurückgeführt. Dies können entweder Konstrukte anderer, bereits existierender Erweiterungen sein oder Konstrukte der Basissprache C. Nachdem alle Erweiterungen auf die Basissprache zurückgeführt wurden, wird das dadurch entstandene Programm mit einem regulären Compiler übersetzt. MPS hat sich als hervorragende Basis für diese Art der modularen Spracherweiterung herausgestellt. Dies ist vor allem der Tatsache zu verdanken, dass MPS ein projizierender Editor ist.
Das bedeutet, dass keine Grammatik oder Parser zum Einsatz kommen. Stattdessen führt eine Änderung an einem Programm im Editor direkt zur Änderung des abstrakten Syntaxbaums. Des weiteren sind projizierende Editoren nicht auf textartige Syntaxformen beschränkt. Tabellarische, mathematische, oder (zukünftig) grafische Notationen lassen sich ohne konzeptionellen Bruch mit textuellen Notationen integrieren. Auch diese Eigenschaft nutzen wir in mbeddr.
(ID:38022700)