# Ada (Programmiersprache)

Ada ist eine strukturierte Programmiersprache mit statischer Typenbindung. Sie wurde von Jean Ichbiah für das Unternehmen Honeywell Bull in den 1970er Jahren entworfen. Ada ist vom Erscheinungsbild ähnlich zur Programmiersprache Pascal. Benannt wurde die Sprache nach Ada Lovelace (1815–1852), der Tochter von Lord Byron und Mitarbeiterin von Charles Babbage, die auch als erste Programmiererin bezeichnet wird. Ada ist im United States Military Standard MIL-STD-1815 spezifiziert.

## Überblick

Ada wurde anfänglich stark vom US-Verteidigungsministerium gefördert und unterstützt. Wie alle von der internationalen Organisation für Normung (ISO) standardisierte Sprachen wird sie in regelmäßigen Abständen überarbeitet. Mit Veröffentlichung eines neuen Standards verliert der vorige seine Gültigkeit. Daher gibt es nur eine Sprache Ada; nur zur Unterscheidung der Generationen werden diese informell als Ada 83 (die erste standardisierte Generation), Ada 95, Ada 2005, Ada 2012 und Ada 2022 bezeichnet. Ada-Compiler werden gewöhnlich einer Validierung unterzogen, der Ada Conformity Assessment Test Suite (ACATS), die praktisch Grundvoraussetzung für den professionellen Einsatz ist. ACATS ist ebenfalls ein ISO-Standard. Aufgrund der hohen Anforderungen, die validierte Compiler erfüllen müssen, hat Ada sich vor allem in sicherheitskritischen Bereichen durchgesetzt, zum Beispiel in der Flugsicherung, in Sicherheits-Einrichtungen der Eisenbahn, in Waffensystemen, der Raumfahrt, der Medizin oder der Steuerung von Kernkraftwerken. Bis auf einzelne Ausnahmen verweigert sich die Automobilindustrie ihrer Verwendung.

## Fähigkeiten der Sprache

Ada war ursprünglich gedacht als allgemeine Programmiersprache, die die Vielzahl von Programmiersprachen im amerikanischen Verteidigungsministerium ersetzen sollte. Heute wird sie meist für eingebettete (embedded) und Echtzeit-Systeme (real-time systems) verwendet. Herausragende Merkmale von Ada sind etwa das strenge Typsystem (starke Typisierung) mit fehlerrobuster Syntax, das zahlreiche Prüfungen schon zur Übersetzungszeit erlaubt, Nebenläufigkeit, Ausnahmebehandlung und generische Programmierung. Ada 95 führte sogenannte tagged types (erweiterbare Typen) ein, die das Ada zugrundeliegende Konzept des Programmieren durch Erweiterung weiter ausbauen und dynamische Polymorphie ermöglichen.
Implementierungen von Ada benutzen üblicherweise keine automatische Speicherbereinigung (garbage collection) zur Speicherverwaltung, da diese das Echtzeitverhalten empfindlich stören würde; der Standard verbietet dies jedoch nicht. Ada unterstützt Laufzeittests, um Speicherüberläufe, Zugriff auf nicht zugewiesenen Speicher, off-by-one-Fehler und andere, ähnlich geartete Fehler frühzeitig zu erkennen. Viele dieser Fehler lassen sich jedoch durch richtige Verwendung der Sprachmittel schon während der Programmierung vermeiden oder während der Übersetzung erkennen. Für eine höhere Effizienz können diese Laufzeittests abgeschaltet werden.

## Programmverifikation mit SPARK

Auch zur Programmverifikation stehen verschiedene Spracheigenschaften zur Verfügung. Mit Ada ist es zum ersten Mal gelungen, industriell verwendete Programme automatisch auf Korrektheit zu überprüfen. Dazu wird die Sprachvariante SPARK verwendet, eine Untermenge von Ada mit Annotationen, das sind Kommentare mit spezieller Syntax wie zum Beispiel Vor- und Nachbedingungen. Die Korrektheit eines SPARK-Programms wird mit einem Verifikationsprogramm (SPARK Examiner) durch statische Analyse der Annotationen überprüft (also vor Ausführung des Programms). In den neuesten Sprachgenerationen sind viele dieser Annotationen durch sogenannte Aspekte ersetzt, sodass auch der Übersetzer Nutzen aus ihnen ziehen kann. Ziel ist jedoch, dass für diese Aspekte kein Code erzeugt wird – sie werden wie die Annotationen vom SPARK Examiner ausgewertet.

## Programmierwerkzeuge

Für Ada gibt es den quelloffenen Compiler GNAT unter GP-Lizenz. Die Firma AdaCore entwickelt die integrierte Entwicklungsumgebung (IDE) GNAT Programming Studio, die in einer freien und einer kommerziellen Version angeboten wird. Darüber hinaus bieten verschiedene namhafte Hersteller Compiler mit IDEs für Ada an. Ein Plugin für Eclipse, die GNATbench, wurde zunächst in der kommerziellen Version GNATpro vertrieben, ist mittlerweile aber auch unter einer GPL verfügbar. Daneben gibt es einige kleinere IDEs, die Ada unterstützen und sich vor allem für die Lehre eignen, zum Beispiel jGRASP, oder unter Windows das bekannte AdaGIDE. Außerdem existiert ein Emacs-Mode für Ada.

## Geschichte

In den 1970ern zeigte sich das Verteidigungsministerium der Vereinigten Staaten besorgt über die wachsende Anzahl von Programmiersprachen, die in seinen Projekten verwendet wurden. Wartung, Ausbildung, Modularität und Wiederverwendung waren dadurch schwer beeinträchtigt. Viele der Programmiersprachen waren zudem proprietär (man war also vom Anbieter abhängig) oder schlicht veraltet. 1975 sollte eine Arbeitsgruppe diesen Dschungel lichten und eine Sprache finden oder erfinden, welche die Bedingungen des Ministeriums erfüllt. Eine Reihe von Anforderungskatalogen, bezeichnet als Strawmann, Woodenman, Tinman, Ironman und Steelman (daneben für eine integrierte Entwicklungsumgebung die Dokumente Sandman (nicht veröffentlicht), Pebbleman und Stoneman) wurden erstellt und viele existierende Sprachen daraufhin überprüft, doch 1977 kam man zum Ergebnis, dass keine der vorhandenen Sprachen geeignet war. Nach einer Ausschreibung kamen vier Kandidaten in die nähere Auswahl (Red, Green, Blue und Yellow genannt), und im Mai 1979 entschied man sich für Green von Jean Ichbiah, welches dann auf den Namen Ada getauft wurde. Die ursprüngliche Beschreibung wurde am 10. Dezember 1980 gebilligt, dem Geburtstag von Ada Lovelace. Der Standard erhielt die Bezeichnung MIL-STD 1815, da 1815 ihr Geburtsjahr war. Die erste Implementierung fand unter Multics statt.
Im Februar 1983 wurde die Sprache zu einer ANSI-Norm (ANSI/MIL-STD 1815A), die ISO übernahm die Norm 1987 als ISO-8652:1987. Diese Version wird heute als Ada 83 bezeichnet, nach dem Jahr der ANSI-Normung. Ada 95, die gemeinsame ISO/ANSI-Norm ISO-8652:1995, wurde im Februar 1995 angenommen. Damit wurde Ada 95 zur ersten objektorientierten Programmiersprache mit einer ISO-Norm. Im Juni 2001 wurde die erste technische Korrektur gemäß den Statuten der ISO als ISO/IEC 8652:1995/Cor 1:2001 angenommen. Weitere Überarbeitungen sind März 2007 ISO/IEC-8652:1995/AMD 1:2007, informell Ada 2005, ISO/IEC 8652:2012, informell Ada 2012, und der aktuelle Standard ISO/IEC 8652:2023, informell Ada 2022.
Nach der Einführung Adas 1983 fiel die Anzahl der verwendeten Programmiersprachen im Verantwortungsbereich des US-amerikanischen Verteidigungsministeriums bis 1996 von über 450 auf 37. Das US-Verteidigungsministerium schrieb vor, dass jedes Softwareprojekt mit einem Anteil von mehr als 30 % neuem Code in Ada geschrieben werden musste. Diese Vorschrift wurde 1997 aufgehoben, zudem wurden häufig Ausnahmen genehmigt. In vielen anderen Staaten der NATO wurden ähnliche Vorschriften erlassen.
Um die Verbreitung des Standards und der Sprache allgemein zu unterstützen, finanzierte die US Air Force die Entwicklung des kostenfreien GNAT-Compilers. Die auf Sicherheit ausgelegten Spracheigenschaften von Ada alleine können Fehler nicht verhindern: Ariane V88, die erste Ariane 5, ging im Juni 1996 samt Nutzlast verloren, unter anderem weil ein arithmetischer Überlauf auftrat und für die vom Compiler generierte Ausnahme keine angemessene Ausnahmebehandlung implementiert worden war. Entgegen Bertrand Meyers Behauptung hätte auch die von ihm entwickelte Programmiersprache Eiffel den Verlust der Rakete nicht verhindert. (Der Grund des Fehlschlags war die ungeprüfte Übernahme eines Codes von Ariane 4, der für deren Flugprofil ausgelegt war.) Im April 2008 kam Ada 2005 wieder in die Schlagzeilen, nachdem Lockheed Martin ein Update zum Flugsicherungssystem der Federal Aviation Administration vor der vereinbarten Lieferzeit und unter dem erwarteten Budget abgeliefert hatte.

## Hallo Welt in Ada

Das Hallo-Welt-Programm in Ada: