
Die Programmiersprache Ada wurde Mitte der 1970er Jahre geboren, als das US-Verteidigungsministerium und das britische Verteidigungsministerium beschlossen, Hunderte spezialisierter Programmiersprachen für eingebettete Computersysteme zu ersetzen, die zunehmend in militärischen Projekten verwendet wurden. Die Ada-Sprache wurde so entwickelt, dass sie die einzige Sprache ist, die auf all diesen eingebetteten Systemen funktioniert und gleichzeitig Zuverlässigkeit und Leistung auf einem Niveau gewährleistet, das nicht schlechter ist als das von Spezialisten.
Nach dem Update von 1995 wurde die Sprache für Allzwecksysteme angepasst und durch objektorientierte Programmierung ergänzt, ohne die wichtigsten Werte aus den Augen zu verlieren - Zuverlässigkeit, einfache Unterstützung und Effizienz. In Ada geschriebene Software bildet heute nicht nur die Grundlage für militärische Ausrüstung, sondern auch für kommerzielle Projekte im Bereich Avionik und Flugsicherungssysteme. Der Ada-Code steuert Raketen wie
Arian 4 und 5, viele Satelliten und unzählige andere Systeme, bei denen kleine Unterbrechungen schwerwiegende Folgen haben können.
Vielleicht eignet sich Ada für Ihr nächstes eingebettetes Projekt.
Militärische Qualitätsplanung
Um eine neue Programmiersprache auszuwählen, setzte das Verteidigungsministerium eine „
Arbeitsgruppe für Sprache hoher Ordnung (HOLWG)“ zusammen, die aus militärischen und wissenschaftlichen Experten bestand und deren Aufgabe es war, eine Liste von Abfragen zusammenzustellen und Kandidatensprachen auszuwählen. Infolgedessen wird das sogenannte "
Stillmans Anfragen ":
Die Hauptpunkte der Anfragen waren:
- Ein flexibler Allzweck-Workflow, der sich an die Anforderungen eingebetteter Computeranwendungen anpasst.
- Zuverlässigkeit Die Sprache sollte die Gestaltung und Entwicklung zuverlässiger Programme erleichtern.
- Einfache Unterstützung. Der Code sollte lesbar und die Softwarelösungen klar sein.
- Einfache Erstellung von effizientem Code. Es sollte möglich sein, ineffiziente Designs leicht zu identifizieren.
- Keine unnötige Komplexität. Die semantische Struktur sollte konsistent sein und die Anzahl der Konzepte minimieren.
- Unabhängigkeit vom Auto. Die Sprache sollte nicht an Details des Betriebssystems oder der Hardware gebunden sein.
- Vollständige Definition. Alle Teile der Sprache müssen vollständig und explizit definiert sein.
Der Bericht schloss mit der Ansicht, dass die erste Verteidigungslinie gegen Softwareprobleme darin besteht, zu verhindern, dass Programmierer Fehler machen. Indem wir die Möglichkeit eines subtilen Fehlers ausschließen, beispielsweise durch implizite Typkonvertierungen oder andere gefährliche Konstruktionen, machen wir den Code automatisch sicherer und erleichtern die Wartung.
Die Gruppe kam zu dem Schluss, dass unter den zu diesem Zeitpunkt existierenden Sprachen zwar keine für die Bedürfnisse des Verteidigungsministeriums geeignet war, es jedoch durchaus realistisch war, eine neue Sprache zu schaffen, die all diesen Fragen gerecht wird. Vier Designer haben es geschafft. Das Zwischenauswahlverfahren wählte die beiden am besten geeigneten Arbeitsmethoden aus. Infolgedessen gewann nur eine Sprache den Wettbewerb und erhielt den Namen "
Ada ".

Eingebauter Standardschutz
Das Typsystem in der Hölle ist nicht nur streng - es wird manchmal als super-streng bezeichnet, weil es keine implizite Typkonvertierung zulässt. Nehmen Sie zum Beispiel dieses C-Code-Snippet:
typedef uint32_t myInt; myInt foo = 42; uint32_t bar = foo;
Dies ist ein gültiger Code. es wird kompilieren, starten und ein offensichtliches Ergebnis liefern, das die Antwort auf die Hauptfrage des Lebens, des Universums und all das anzeigt. In der Hölle wird das nicht funktionieren:
type MyInt is Integer; foo: MyInt; bar: Integer; foo := 42; bar := foo;
Der Compiler gibt einen Fehler aus, da Integer und MyInt nicht dasselbe sind. Der Hauptvorteil dieses Ansatzes besteht darin, dass Tausende impliziter Typkonvertierungen in der gesamten Codebasis das Programm nicht in die Luft jagen, wenn der Programmierer dann die Typdefinition ändert. Stattdessen müssen Typen explizit umgewandelt werden - dies fördert einen guten Code und verhindert die Verwechslung von Typen, die "ziemlich ähnlich" sind.
Jeder Programmierer, der aus einer Mischung von Standarddefinitionen der Typen C, Linux und Win32 in einem Sumpf steckt, kann die fehlende Notwendigkeit erkennen, unzählige Seiten mit Dokumentation und schlecht formatiertem Code zu durchsuchen, um zu verstehen, welches Typedef oder Makro eine echte Definition von etwas enthält, das nur Dies verhinderte das Kompilieren oder kroch während des Debuggens heraus.

Ada fügt zusätzliche Überprüfungsschichten bei Überprüfungen während der Kompilierungs- und Startphase hinzu. In Ada muss der Programmierer explizit schließende Anweisungen für Blöcke und die Grenzen angeben, in die der Wert der Variablen passen soll. Ada definiert keine Standardtypen wie int oder float, sondern verlangt vom Programmierer, von Anfang an Typen mit einem bestimmten Bereich zu erstellen. Dies gilt auch für Zeichenfolgen - mit Ausnahme von unbegrenzten Zeichenfolgen haben alle Zeichenfolgen eine feste Länge.
In der Betriebsphase können Sie Fehler wie falschen Speicherzugriff, Pufferüberläufe, Überschreiten der festgelegten Grenzwerte, Fehler ± 1 und Zugriff auf das Array überprüfen. Sie können dann sicher verarbeitet werden, anstatt die gesamte Anwendung zu löschen.
Ada implementiert ein Modell von Referenztypen anstelle von Zeigern auf niedriger Ebene. Jeder Referenztyp wird standardmäßig von einem Speicherpool oder, falls erforderlich, von einem bestimmten Programmierer verarbeitet, um mit exotischeren NUMA-Speicherimplementierungen zu arbeiten. Ein Programmierer muss niemals direkt auf den Speicher zugreifen, sondern muss einen Speicherpool-Handler verwenden.
Schließlich entscheidet der Compiler oder das Programm zur Laufzeit, wie Daten an oder von der Funktion übergeben werden. Und obwohl es notwendig ist, die Übertragungsrichtung jedes Parameters anzugeben ('in', 'out' oder 'in out'), wird die endgültige Entscheidung darüber, ob Daten über Register, Heaps oder durch Referenz übertragen werden, vom Compiler oder Programm zur Laufzeit getroffen, aber kein Programmierer. Dies verhindert Stapelüberlaufprobleme.
Das Ravenscar-Profil und der
SPARK- Dialekt sind Teilmengen von Ada, wobei sich letztere auf Verträge konzentrieren. Im Laufe der Zeit wurden die Merkmale dieser Teilmengen auf die Spezifikation der Hauptsprache übertragen.
Ada Programmierung heute
ANSI hat 1983 die Ada 83-Spezifikation eingeführt. Dann wurde gerade der Intel 80286 veröffentlicht, und das Motorola 68000 war erst vier Jahre alt. Es war der Beginn von Heimcomputern sowie ein ungeschickter Übergang von den 1970er zu den 80er Jahren, als die Popularität von Mikrocontrollern zu wachsen begann. Stellen Sie sich den
Intel 8051- Mikrocontroller mit seinem beeindruckenden 4-KB-EPROM und 128 KB RAM vor.

Heutzutage beliebte Mikrocontroller sind um ein Vielfaches leistungsfähiger als 1983. Sie können jeden ARM, AVR, RISC-V usw. verwenden. (oder Lego Mindstorms NXT-Kit) und beginnen Sie mit der Entwicklung mit denselben C-basierten Tools. Es ist nicht überraschend, dass der beliebte
GNAT Ada-Compiler auf GCC basiert. Im Rahmen des
DragonEgg- Projekts werden auch Tools entwickelt, die auf LLVM basieren.
Es gibt zwei Versionen der GCC-basierten Ada Tools. Die AdaCore-Option wird kommerziell unterstützt, hat jedoch ihre eigenen Eigenschaften. Die Free Software Foundation-Option ist natürlich kostenlos und in ihrer Funktionalität mit AdaCore vergleichbar.
Verwenden Sie für einen einfachen Start entweder die
GNAT Programming Studio IDE (GPS), die im Lieferumfang von
AdaCore (eine
Kopie auf Github ) enthalten ist, oder schreiben Sie den Code in einen Texteditor und kompilieren Sie ihn manuell oder mithilfe von Makefiles. Das Toolkit hier ist etwas komplizierter als das von C oder C ++, aber die Entwicklung wird durch das Dienstprogramm gnatmake erleichtert, das alle Tools enthält und ungefähr wie GCC funktioniert.
Ein Beispiel für ein kleines, aber nicht triviales Projekt in Ada, das von Ihrem bescheidenen Diener als Befehlszeilenargument-Parser geschrieben wurde. Dort finden Sie das Makefile im Ordner ada / project, in dem die Ordner definiert sind, in denen Sie die Paketspezifikationsdateien (.ads) und die Pakete selbst (.adb) finden.
Diese Dateien entsprechen in etwa Dateien mit Headern und Code aus C und C ++, weisen jedoch auch wichtige Unterschiede auf. Im Gegensatz zu C verfügt Ada nicht über einen Präprozessor und kombiniert keinen Code und keine Header, um kompilierte Dateien zu erstellen. Stattdessen gibt es einen Link zu dem in der Spezifikation angegebenen Paketnamen. Der Name der ADS-Datei muss auch nicht mit dem Namen des Pakets übereinstimmen. Dies bietet große Flexibilität und verhindert häufige Probleme in C mit zyklischer Abhängigkeit oder der Notwendigkeit, Header in einer bestimmten Reihenfolge zu verknüpfen.
Wohin als nächstes gehen
Nachdem Sie das GNAT-Toolkit heruntergeladen, GPS oder Vim / Emacs gestartet und eine Weile auf den blinkenden Cursor auf einer leeren Seite geschaut haben, können Sie sich überlegen, wo Sie anfangen sollen. Glücklicherweise haben wir kürzlich ein Ada-basiertes
Projekt mit dem PicoRV32 RISC-V-Kern behandelt. Es verwendet die beliebte ICE40LP8K-CPLD, die von Open-Source-FPGAs wie Yosys unterstützt wird.

In Bezug auf die Dokumentation gibt es
einführende Artikel für Anfänger, die für Java- und C ++ - Entwickler entwickelt wurden, eine
AdaCore- Referenz, eine WikiBooks-Referenz und natürlich die
Programmierung in der Ada 2012- Dokumentation. Dies sind möglicherweise die umfassendsten Referenzen, mit Ausnahme des 945-seitigen
Ada 2012 Language Reference Manual (LRM).
Die Ada-Sprache, obwohl für Programmierliebhaber eher selten, ist eine völlig offene Sprache mit zuverlässigen Entwicklungswerkzeugen mit kommerzieller Unterstützung und wird verwendet, um Software für alles zu erstellen, von Interkontinentalraketen über F-15 bis hin zur Firmware von Medizinprodukten. Obwohl dies eine ziemlich komplizierte Sprache ist, sollte sie auf jeden Fall in die Liste der Sprachen aufgenommen werden, die Sie jemals in Ihren Projekten verwendet haben, um Ihren Lebenslauf cooler aussehen zu lassen.