• IT-Karriere:
  • Services:

Ada - Representation Clauses

Eines der Probleme der Embedded-Programmierung ist, dass einerseits hardwarenahe Programmierung und bitgenaue Auslegung der Daten nötig sind, andererseits solche Details eigentlich einfachen Code umständlich und fehleranfällig machen. Die Antwort auf dieses Problem in Ada sind Representation Clauses. Diese ermöglichen es, die bekannten Datenstrukturen wie Arrays und Records wie gewünscht im Speicher auszulegen und sie effizient und einfach zu benutzen. Ein einfaches Beispiel wäre:


          Type BitArray is array (1 .. 8) of Boolean
          with Size => 8;
            	Pragma Pack(BitArray);

Stellenmarkt
  1. Paracelsus-Klinik Golzheim, Düsseldorf
  2. Universitätsmedizin der Johannes Gutenberg-Universität Mainz, Mainz

Die erste Zeile definiert einen Typ von Arrays, die genau 8 Boolesche Werte enthalten. Normalerweise hat der Compiler eine gewisse Wahl, wie viel Speicher genau für ein solches Array verwendet wird. Aus Effizienzgründen reserviert der Compiler zum Beispiel 8 Byte, also ein Byte pro Booleschem Wert.

Die zwei weiteren Zeilen erklären dem Compiler aber, nur 8 Bit, also 1 Byte, zu verwenden - genau 1 Bit für jeden Booleschen Wert. Das kann notwendig sein, wenn der Speicher auf dem Embedded-Chip knapp ist oder wenn eine Schnittstelle (zur Hardware oder zum Beispiel ein Kommunikationsprotokoll) die Auslegung von Daten eben genau so verlangt.

In C kann man zwar auch ein Byte für ein solches Array reservieren. Um damit umzugehen, sind dann aber Bitmasken und Bitshifts nötig - dies ist fehleranfällig und verschleiert, dass der Code einfach nur ein Array manipuliert. In Ada können solche Arrays wie oben definiert im Weiteren ganz normal verwendet werden - mit Zugriff auf jeden beliebigen Index. Der Compiler generiert automatisch den korrekten Code. Representation Clauses ermöglichen noch viel mehr, als dieses einfache Beispiel zeigt, und sind ein unverzichtbares Werkzeug für hardwarenahe Ada-Programmierer.

Ada 2012 - Design by Contract

Seit der Ada-2012-Sprachversion unterstützt Ada Design by Contract. Diese Art der Programmierung umfasst in der Regel eine Reihe von Sprachfeatures ähnlich den Assertions. Zum Beispiel kann man in Ada mit dem Schlüsselwort "Pre" einer Funktion eine sogenannte Precondition (Vorbedingung) hinzufügen, also eine Bedingung, die vor der Ausführung der Funktion zutreffen soll. In diesem Beispiel soll die Prozedur Put_Line nur dann aufgerufen werden, wenn der übergebene Datei-Handle auch wirklich zu einer offenen Datei zeigt:


          procedure Put_Line (File : inFile_Type; Item :inString)
          with Pre => (Is_Open (File));

Diese Precondition funktioniert wie eine Assertion am Anfang der Funktion oder wie zusätzlicher Code am Anfang der Funktion, der eine bestimmte Bedingung überprüft und abbricht, falls die Bedingung nicht zutrifft (das nennt man auch Defensive Code). Der Unterschied ist aber, dass die Precondition zur Spezifikation gehört und nicht zur Implementation, wie es der Fall für die Assertion oder den Defensive Code wäre.

Dies hat einige Vorteile. Zum einen, zum Beispiel im Fall einer API-Funktion einer Bibliothek, ist die Precondition auch für Benutzer der API sichtbar, während die anderen Ansätze letztendlich ein Implementationsdetail bleiben. Damit kann die Precondition auch als Dokumentation für akzeptable Aufrufe der Funktion dienen. Zum anderen kann die Precondition, ähnlich wie Assertions in anderen Sprachen, für einen Release-Build abgeschaltet werden, um effizienteren Code zu erhalten. Defensive Code wird immer mitkompiliert. Schließlich kann die Precondition auch von anderen Tools verwendet werden. Insbesondere Spark wird mithilfe von Contracts zu einem mächtigen Werkzeug.

Analog zu Preconditions gibt es auch Postconditions, die konzeptuell direkt nach dem Return der Funktion überprüft werden. Der Name Design by Contract kommt von dem Zusammenspiel von Pre- und Postcondition. Hat der Programmierer beide zu einer Funktion hinzugefügt, fungieren sie wie ein Vertrag zwischen aufrufender und aufgerufener Funktion. Die aufrufende Funktion muss gemäß diesem Vertrag die Precondition garantieren und bekommt im Gegenzug von der aufgerufenen Funktion die Postcondition garantiert. Es gibt noch einige andere Formen von Assertions, sie zu beschreiben würde aber an dieser Stelle zu weit führen.

Bitte aktivieren Sie Javascript.
Oder nutzen Sie das Golem-pur-Angebot
und lesen Golem.de
  • ohne Werbung
  • mit ausgeschaltetem Javascript
  • mit RSS-Volltext-Feed
 Ada - numerische TypenSpark kann automatisch potenzielle Fehler anzeigen 
  1.  
  2. 1
  3. 2
  4. 3
  5. 4
  6.  


Anzeige
Hardware-Angebote
  1. täglich neue Deals bei Alternate.de

demon driver 25. Jun 2019

Von "unabgängiger" kann sich niemand was kaufen, und konsequent dürfte man dann nur noch...

demon driver 24. Jun 2019

Nix

SirFartALot 13. Jun 2019

das mag ja fuer Auftragsprogrammierer oder Freelancer normal zu sein, die...

\pub\bash0r 12. Jun 2019

Wobei ausgerechnet Java (und Applets) eigentlich ein sehr gutes Sicherheitsmodell haben...

kayozz 12. Jun 2019

Ja, C# bzw. .NET hat auch Schwächen. Aber das Argument würde ich so nicht stehen...


Folgen Sie uns
       


    •  /