4 Punkte von GN⁺ 12 일 전 | 1 Kommentare | Auf WhatsApp teilen
  • 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 .. 150 erzeugt einen eigenständigen Typ mit Bereichsbeschränkung
    • Übergaben zwischen unzulässigen Typen werden als Compile-Time-Fehler erkannt
  • 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
  • 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)
  • Ada 95 führte das Protected Object ein
    • Es schützt den Datenzugriff und unterscheidet zwischen procedure, function und entry
    • Es bietet automatische Barrier-Bedingungen und lockfreie Synchronisation
  • 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
  • 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 null ein 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

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

 
GN⁺ 12 일 전
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

    • In ML-Sprachen können Nutzer nicht selbst bounded Integer-/Floating-Point-Typen definieren. Genau dieses Typsystem ist eines der Kernmerkmale von Ada. Wenn man Adas Typsystem einmal erlebt hat, ist man erstaunt, wie sehr es Codequalität und Zuverlässigkeit erhöht
  • 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

    • Dass Ada nie aus der Nische herauskam, hatte mehrere Gründe. Die Komplexität der Sprache und der damalige Stand der Compilertechnik machten es unmöglich, sie auf Mikrocomputern der 1980er vernünftig zu betreiben. Intel baute mit dem i432 zwar Hardware, die Ada-Konzepte aufnahm, aber die Leistung war miserabel. Danach übernahmen Mikrocomputer die Welt, und das Erbe von C und Assembler hielt sich mehr als 20 Jahre
    • Ich habe Ada einige Jahre verwendet, aber dass Kollegen aus Spaß andere Sprachen nutzten, half der Verbreitung von Ada nicht. Die String-Verarbeitung war schwach, und die Geschwindigkeit war langsam. Besonders die Nebenläufigkeit war unpraktisch, weil keine OS-Threads verwendet wurden. Am Ende nutzten wir die Echtzeit-Erweiterungen von HPUX und ließen mehrere Prozesse laufen
    • Seit Mitte der 90er gab es GNAT, und in dieser Zeit waren auch kommerzielle Compiler verbreitet. Dass Ada blockiert blieb, lag an der Wahrnehmung eines „unnötigen Overheads“. Es hatte also den Ruf, außerhalb von Militär- oder sicherheitskritischen Systemen keinen Grund für seinen Einsatz zu bieten
    • Der GNU Ada Compiler (GNAT) wurde 1995 erstmals veröffentlicht
    • Tatsächlich war in den 80ern die Qualität von Compilern für praktisch jede Sprache mäßig. Auch GCC wurde erst später wirklich brauchbar. Wenn man eine neue Sprache nutzte, war ein unreifer Compiler ganz normal. Selbst C++ lag damals weit hinter Ada zurück, und das eigentliche „Killer Feature“ von C++ war im Grunde, dass man es wie C verwenden konnte. Hätte Ada einen Pascal-Kompatibilitätsmodus angeboten, wäre die Geschichte vielleicht anders verlaufen
  • 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 Textes

    • In Ada kann bei einem private-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 vergleichbar
    • In Java kann man über Reflection auf private Member zugreifen. Mit setAccessible(true) lässt sich sogar das Innere von String verändern
    • Ich fand die Bemerkung treffend, dass LLMs beim Schreiben für menschliche Leser wie eine Art Gell-Mann-Amnesie funktionieren
  • Insgesamt 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

    • Tatsächlich wurden viele Funktionen von Ada aus bestehenden Sprachen (PASCAL, CLU, MODULA, CSP usw.) übernommen. Es ging weniger um völlig neue Konzepte als um die Integration bewährter Ideen
    • Einige der Konzepte, die laut Text zuerst von Ada eingeführt wurden, waren in Wirklichkeit oft anders umgesetzt. Deshalb wären Vergleichsbeispiele nötig gewesen
    • Dieser Text behauptet nicht „Ada ist die beste Sprache“, sondern zeigt, welche Entwurfsentscheidungen Ada für Sicherheit und Zuverlässigkeit getroffen hat. Der Jahresvergleich ist in diesem Kontext sinnvoll
    • Ich habe Claude nach Ada-Democode gefragt, und das Ergebnis war ziemlich gut. Ich kannte Ada schon lange, aber nachdem ich es selbst ausprobiert habe, spürte ich FOMO
    • Aus Sicht von Ada-Entwicklern kann dieses Vergleichsmuster ermüdend wirken, weil es seit vielen Jahren immer wiederholt wird
  • 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

    • Manche meinen, es gebe keinen Autor, weil es ein Bot sei
  • 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

    • Tatsächlich liegt der Ursprung von Sum Types in John McCarthys Aufsatz „Definition of new data types in ALGOL X“ von 1964. Dort schlug er das Schlüsselwort UNION vor, das später in ALGOL 68 sowie Hope, Miranda usw. weiterentwickelt wurde. Das union in C ist etwas anderes
  • Der Text gefiel mir so gut, dass ich hoffte, er sei nicht von einer KI geschrieben, aber das Tempo der Twitter-Posts machte mich misstrauisch

    • Der Text wirkte etwas weitschweifig und repetitiv, was nach KI klang
    • Heutzutage gibt es viele KI-Tools, die Blogposts automatisch umschreiben, deshalb kam der Verdacht auf
    • Ich habe den Text auch gern gelesen, aber nachdem ich 110 Gedankenstriche gesehen hatte, dachte ich plötzlich: „Vielleicht KI?“ Es ist traurig, dass man inzwischen sogar Blogposts mit Medienkompetenz lesen muss
    • Ich selbst habe in 3 Jahren 50 Texte geschrieben, von denen die meisten unveröffentlicht geblieben sind. Vielleicht war es bei diesem Autor ähnlich und er hat erst kürzlich den Mut gefunden. Ich verstehe, wie frustrierend es ist, für KI gehalten zu werden
    • Wenn KI Texte auf diesem Niveau schreiben kann, dann wäre das es wert, selbst wenn es Zeit kostet
  • 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

    • JOVIAL war eine aus IAL, dem Vorgänger von ALGOL 60, abgeleitete Sprache und beeinflusste die frühen Anforderungen an Ada (STRAWMAN bis STEELMAN). Später verbesserte Ada Funktionen von JOVIAL und führte Neuerungen wie die explizite Kennzeichnung von in/out-Parametern ein. Dadurch brauchte man keine komplexen Copy-Konstruktoren oder Move-Semantics wie in C++
  • 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

    • Dieser Satz ist aber kein Beleg dafür, dass der Text von KI stammt
  • 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

    • Nimmt man TypeScript als Maßstab, können bei JS-Objekten von außen weiterhin Eigenschaften hinzugefügt oder verändert werden. In Ada sind bei Instanzen privater Typen keine Operationen außerhalb der definierten API möglich
    • Ein konkretes Beispiel findet sich in diesem Kommentar