- Ada entstand in den 1970er-Jahren mitten im Software-Chaos des US-Verteidigungsministeriums und ist eine Sprache, deren Kern starke statische Typisierung und die Trennung von Spezifikation und Implementierung bilden
- Durch Paketstrukturen und Repräsentationsverbergung verwirklicht sie vollständige Kapselung und beeinflusste später Modulsysteme moderner Sprachen wie Java, C# und Go
- Semantisch eingeschränkte Typen, Generics, Nebenläufigkeit (
task) und vertragsbasierter Entwurf sind Konzepte, die Ada Jahrzehnte früher vorwegnahm und die später von Haskell, Rust und Swift aufgegriffen wurden - SPARK Ada eliminiert durch formale Verifikation sogar Datenrennen und logische Fehler und wird in Hochzuverlässigkeitsbereichen wie Luftfahrt-, Bahn- und Verteidigungssystemen eingesetzt
- Ada ist keine Massensprache, bildet aber als „Sprache, die still und korrekt arbeitet“ eine Grundlage für die Prinzipien des modernen Programmiersprachendesigns
Entstehungshintergrund und Designphilosophie von Ada
- Anfang der 1970er untersuchte das US-Verteidigungsministerium (DoD) die Lage, dass in Waffen-, Logistik- und Kommunikationssystemen mehr als 450 Sprachen und Dialekte parallel verwendet wurden
- Die einzelnen Systeme litten unter fehlender Interoperabilität, mangelnder Wartbarkeit und dem Fehlen der ursprünglichen Autoren
- Dadurch entstand eine Krise der Softwarebeschaffung
- Das DoD übernahm keine bestehende Sprache wie COBOL, Fortran oder PL/1, sondern durchlief einen fünfjährigen Prozess zur Definition der Anforderungen
- Strawman → Woodenman → Tinman → Ironman → Steelman
- Steelman (1978) forderte explizite Trennung von Schnittstellen, starke statische Typisierung, eingebaute Nebenläufigkeit, konsistente Ausnahmebehandlung, Maschinenunabhängigkeit, Lesbarkeit und Verifizierbarkeit
- Im Wettbewerb zwischen vier Teams im Jahr 1979 (Green, Red, Blue, Yellow) wurde das von Jean Ichbiah geführte Green-Team ausgewählt, und die Sprache erhielt den Namen Ada
- Der Name ehrt Ada Lovelace und symbolisiert die Absicht der Sprache
Paketstruktur und Kapselung
- Die zentrale Struktur von Ada ist das Paket (
package), bei dem Spezifikation (specification) und Rumpf (body) physisch getrennt sind- Die Spezifikation ist der nach außen sichtbare Vertrag, der Rumpf die Implementierung; der Compiler erzwingt die Beziehung zwischen beiden
- Client-Code kann nicht auf Elemente zugreifen, die nicht in der Spezifikation stehen
- Diese Struktur ist ein Prototyp des Modulsystems, den spätere Sprachen teilweise nachahmten
- Java, Python, JavaScript, C, Go und Rust haben die vollständige strukturelle Trennung von Ada nicht umgesetzt
private-Typen legen nur den Namen offen, während ihre interne Repräsentation vollständig opak bleibt- Clients kennen die innere Struktur des Typs nicht und können nur erlaubte Operationen verwenden
- Das ist eine stärkere Form der Repräsentationsverbergung als die
private-Zugriffskontrolle in Java
- Java und C# entwickelten sich über Jahrzehnte schrittweise in Richtung der Kapselung auf Ada-Niveau
Typsystem und semantische Einschränkungen
- Ada definiert die Unterscheidung zwischen Typen und Subtypen in einem mathematischen Sinn
- Beispiel:
type Age is range 0 .. 150erzeugt einen eigenständigen Typ mit Bereichsbeschränkung - Übergaben zwischen unzulässigen Typen werden als Compile-Time-Fehler erkannt
- Beispiel:
- Das Typsystem von Ada war 1983 deutlich ausdrucksstärker als das von C, Fortran oder Pascal
- Semantisch eingeschränkte Typen verhindern Domänenfehler
- Discriminated Records sind Strukturen, die je nach Wert unterschiedliche Felder besitzen
- Das entspricht modernen Sum Types bzw. algebraischen Datentypen (ADT)
- Haskell, Rust, Swift, Kotlin und TypeScript führten dasselbe Konzept erst Jahrzehnte später ein
Generics und Polymorphismus
- Adas Generics sind Einheiten, die Typen, Werte, Unterprogramme und Pakete als Parameter annehmen
- Sie implementieren statischen Polymorphismus (
parametric polymorphism) mit Typprüfung zur Compile-Zeit
- Sie implementieren statischen Polymorphismus (
- C++ (1990), Java (2004), C# (2005) und Go (2022) führten ähnliche Funktionen erst Jahrzehnte nach Ada ein
- Java verliert durch Type Erasure Typinformationen zur Laufzeit
- Ada unterstützt dagegen den Erhalt von Laufzeit-Typinformationen sowie Paket-Parametrisierung
- Adas Generics bieten Ausdrucksstärke auf dem Niveau von Higher-Kinded Polymorphism
- Das ähnelt Haskells Type Classes, Rusts Traits und den Concepts aus C++20
Nebenläufigkeitsmodell und Sicherheit
- Ada hat seit 1983 Nebenläufigkeit auf Sprachebene (
task) eingebaut- Über
task-Deklarationen und das Kommunikationsmodell Rendezvous wird Message Passing ohne geteilten Zustand umgesetzt - Gos Channel gehören zur gleichen CSP-Familie (Communicating Sequential Processes)
- Über
- Ada 95 führte das Protected Object ein
- Es schützt den Datenzugriff und unterscheidet zwischen
procedure,functionundentry - Es bietet automatische Barrier-Bedingungen und lockfreie Synchronisation
- Es schützt den Datenzugriff und unterscheidet zwischen
- SPARK Ada beweist mittels formaler Verifikation mathematisch, dass keine Datenrennen, Ausnahmen, Bereichsfehler oder Verletzungen von Vor- und Nachbedingungen auftreten
- Rusts Borrow Checker garantiert nur Speichersicherheit, während SPARK auch logische Korrektheit nachweist
Vertragsbasierter Entwurf und Null-Sicherheit
- Ada 2012 integrierte Verträge (
contracts) direkt in die Sprache- Vorbedingungen (
precondition), Nachbedingungen (postcondition) und Typinvarianten (invariant) lassen sich explizit angeben - Die SPARK-Toolchain nutzt diese für statische Beweise
- Vorbedingungen (
- Das von Eiffel (1986) geprägte Konzept Design by Contract wurde damit auf Sprachebene formalisiert
- C++, Java, Python und Rust bleiben bei partiellen oder bibliotheksbasierten Umsetzungen
- Ada 2005 führte den Typ
not nullein und unterstützt damit den Ausschluss von Null auf Compile-Time-Ebene- Standardmäßig wird durch eine Laufzeit-Ausnahme (
Constraint_Error) ein sicheres Fehlschlagen garantiert - Das ähnelt dem Ansatz nullable Referenzen in C# 8.0
- Standardmäßig wird durch eine Laufzeit-Ausnahme (
Struktur der Ausnahmebehandlung
- Ada 83 führte als erste Sprache strukturierte Ausnahmebehandlung (
structured exception handling) ein- Ausnahmen werden deklariert und dann verwendet, auf Scope-Ebene behandelt und folgen klaren Ausbreitungsregeln
- Javas Checked Exceptions sind eine weiterentwickelte Form gegenüber Ada, bei der der Aufrufer Ausnahmen explizit angeben muss
- Ada erlaubt die freie Weitergabe von Ausnahmen
- Rust verzichtet auf Ausnahmen und setzt auf fehlerbehandlung auf Basis des
Result-Typs- Adas Beitrag liegt darin, die Ausbreitung von Ausnahmen zu strukturieren und vorhersagbar zu machen
Annexe und Standardisierungsstruktur
- Der Ada-Standard besitzt eine Struktur optionaler Erweiterungen namens Annex
- Annex C bis H definieren Funktionen für System-, Echtzeit-, verteilte, numerische und hochzuverlässige Bereiche
- Compiler müssen dafür separate Zertifizierungen je Annex erhalten
- Über die ACATS-Tests der ACAA wird die Konformität mit dem Standard geprüft
- Für die DO-178C-Zertifizierung von Luftfahrtsoftware lässt sich die Standardstruktur von Ada direkt nutzen
- C/C++ können dieselbe Zertifizierung ebenfalls erreichen, aber Ada ist strukturell besser dafür geeignet
Adas Einfluss und das Ungleichgewicht der Wahrnehmung
- Ada wurde als staatlich geförderte Sprache im Kulturraum des Silicon Valley kaum beachtet
- Das steht im Kontrast zur Vorliebe für knappe, C-basierte Syntax
- Die Erfolgsgeschichten von Ada in Luftfahrt-, Bahn- und Verteidigungssystemen sind wenig sichtbar, gerade weil es keine Ausfälle gibt
- Hochzuverlässige Systeme erzeugen weder Debatten noch Vorfälle
- Die Entwicklungsrichtung moderner Sprachen konvergiert auf Prinzipien, die Ada bereits vorweggenommen hatte
- Etwa Trennung von Spezifikation und Implementierung, statische Typprüfung, Nebenläufigkeit auf Sprachebene und vertragsbasierte Sicherheit
- Ada ist weiterhin in Hochzuverlässigkeitssystemen wie Flugzeugen, Zügen und Raumfahrzeugen im Einsatz und bleibt eine „Sprache, die still und korrekt arbeitet“
1 Kommentare
Hacker-News-Kommentare
Ich mag Ada. Aber es überrascht mich, dass bei der Diskussion über Typbehandlung die ML-Sprachfamilie (ML, SML, CML, Caml, OCaml usw.) komplett ausgelassen wurde
Diese Sprachen unterstützen strukturelle Typisierung auf Compiler-Ebene. Das Problem bei Ada war, wie bei PL/I, PHP und Perl, dass die Sprache selbst zu groß war und eine komplizierte Syntax hatte. Im Text wird das als Vorteil dargestellt, aber ich persönlich halte die als Annex getrennten Standarderweiterungen für deutlich gelungener. Wäre die Kernsprache kleiner gehalten und stärker um Annexes herum aufgebaut worden, hätte sie sich wohl weiter verbreitet
Einer der Gründe, warum Ada gemieden wurde, war, dass Compiler Zehntausende Dollar kosteten. In einer Zeit ohne kostenlose oder Open-Source-Compiler konnten andere Sprachen gratis genutzt werden. Das war ein entscheidender Faktor
Beim Lesen fand ich sowohl Ada als auch den Text selbst interessant, aber einige sachliche Fehler fielen mir auf. Zum Beispiel wurde behauptet, nur Ada trenne Implementierung und Spezifikation vollständig, obwohl auch JavaScript in ES6-Modulen private Elemente definieren kann. Auch die Erklärung der
private-Sichtbarkeit in Java war falsch. Solche Fehler mindern die Glaubwürdigkeit des Textesprivate-Typ von außen nicht auf interne Felder zugegriffen werden. In JavaScript dagegen kann man bei jedem Objekt frei Eigenschaften hinzufügen oder entfernen. Das Schutzniveau zur Compile-Zeit in Ada ist also mit JS nicht vergleichbarsetAccessible(true)lässt sich sogar das Innere von String verändernInsgesamt war der Text gut, aber die ständig wiederholte Formulierung „Sprache X bekam dieses Feature später als Ada“ war ermüdend. Mit Code-Beispielen wäre er viel überzeugender gewesen
Dieser Twitter-Account wurde im April 2026 erstellt und nennt keinen Autor. In kurzer Zeit war er extrem produktiv, und dass kein Name genannt wird, ist interessant
Die Behauptung „Alle Sprachen haben in den letzten 20 Jahren Sum Types hinzugefügt, aber Ada hatte sie von Anfang an“ stimmt zwar, aber der Ursprung liegt nicht bei Ada. Die Hope-Sprache oder NPL waren früher
UNIONvor, das später in ALGOL 68 sowie Hope, Miranda usw. weiterentwickelt wurde. Dasunionin C ist etwas anderesDer Text gefiel mir so gut, dass ich hoffte, er sei nicht von einer KI geschrieben, aber das Tempo der Twitter-Posts machte mich misstrauisch
Die US Air Force wollte ursprünglich Ada verwenden, griff wegen der verspäteten Entwicklung aber zu JOVIAL. Ich machte 1981 mein erstes Projekt in JOVIAL, damals war Ada noch in der Spezifikationsphase
Auf der Startseite der Website steht der Satz „Das ist keine Position, sondern ein Vorschlag“, und darauf gestützt wird behauptet, es sei eine von KI geschriebene Website
Im Text hieß es, „das Modulsystem von JavaScript könne wie Ada die interne Repräsentation eines Typs nicht verbergen“, aber tatsächlich kann JS alles ausreichend verbergen, solange es nicht exportiert wird. Ich fragte mich, worin Ada hier wirklich besser sein soll