Ada

Aus FabLab Region Nürnberg

Ada

Ada Lovelace 1838[1]

Ada ist eine Text-basierte Programmiersprache, welche in den 1970-er Jahren im Auftrag der US-Regierung entwickelt wurde. Sie findet u.a. Anwendung im Bereich der Luft- und Raumfahrttechnik und ist daher für sehr große und sehr langlebige Softwareprojekte geeignet. [2]

Die Programmiersprache wurde nach Lady Ada Lovelace (1815–1852) benannt. Sie war Mitarbeiterin von Charles Babbage (1791-1871), dem theoretischen Urgroßvater des Computers, und gilt als erste Programmiererin der Neuzeit.[3] [4]

Die Programmiersprache Ada ist in der ISO/IEC 8652:2012 genormt und in der LNCS 8339 hinterlegt.




Benötigte Pakete

Debian (Linux)

Benötigte Pakete für Debian
stretch (oldoldstable) buster (oldstable) bullseye
1 libgnat-6 (6.3.0-18+deb9u1) libgnat-7 (7.4.0-6) libgnat-10 (10.2.1-6)
2 libgnatvsn6 (6.3.0-18+deb9u1) libgnatvsn7 (7.4.0-6) libgnatvsn9 (9.3.0-22)
3 libgnatprj6 (6.3.0-18+deb9u1) - -
4 gnat-6 (6.3.0-18+deb9u1) gnat-8 (8.3.0-6) gnat-10 (10.2.1-6)


Ubuntu 20.04

Ubuntu 20.04 (oder Linux Mint 20.3) basieren zwar auf Debian bullseye, funktionieren aber nicht mit den oben genannten Paketen. Statt dessen wird benötigt:

  sudo apt install gnat make kate

Framework

Zum Erstellen eines lauffähigen Programms unter Linux muss der Quelltext, welcher kompiliert werden soll, in ein Framework eingefügt werden. Dieses besteht im Wesentlichen aus einer flachen Ordnerstruktur, in welcher neben Paket-Header-Dateien (engl: *.ads) und Paket-Implementierungs-Dateien (engl: *.adb) temporäre Dateien sortiert sind. Zur Kompilierung und zur Dateiverwaltung unter Verwendung des Steuerprogramms "make" genügt eine Steuerdatei namens "makefile" im Wurzelverzeichnis. Die Bedienung des Frameworks erfolgt unter Verwendung der Kommandozeile.

Die Ordner "work" und "../BACKUP" werden in der Steuerdatei "makefile" automatisch angelegt, wenn diese noch nicht vorhanden sind.

Ordner "ada_package"

In diesem Ordner werden alle Paket-Header-Dateien (engl: *.ads) abgelegt.

Ordner "ada_body"

In diesem Ordner werden alle Paket-Implementierungs-Dateien (engl: *.adb) abgelegt.

Ordner "work"

Hier werden während des Kompiliervorgangs temporäre Dateien erzeugt. Der Inhalt des Ordners muss weder bearbeitet noch archiviert werden.

Ordner "../BACKUP"

Es besteht die Möglichkeit, unter Verwendung der Steuerdatei Zwischenstände abzuspeichern. Die Quelltexte in den Ordnern "ada_body" und "ada_package" werden zusammen mit der Steuerdatei "makefile" in einer Zip-Datei archiviert. Der Name der Zip-Datei wird in der Steuerdatei unter Verwendung des Projektnamens, eines Datumstempels und eines Zeitstempels automatisch vergeben.

Steuerkommandos

make all

Kompiliere den Quelltext und erzeuge die Excutable. Der Name der Excutable muss in der Steuerdatei "makefile" in einer Variablen definiert werden.

make edit

Öffne alle relevanten Dateien in der IDE "kate". Diese verfügt über eine Kommandozeilen-Eingabe und unterstützt durch Texthervorhebung die Ada-Syntax.

make clean

Lösche alle temporäre Dateien und generierten Excutables.

make backup

Die Quelltexte in den Ordnern "ada_body" und "ada_package" werden zusammen mit der Steuerdatei "makefile" in einer Zip-Datei archiviert. Der Name der Zip-Datei wird in der Steuerdatei unter Verwendung des Projektnamens, eines Datumstempels und eines Zeitstempels automatisch vergeben.

Erstes Programm: Hallo Welt!

Dieses Programm gibt die Zeichenkette "Hallo Welt!" unter Verwendung der Bibliothek "Ada.Text_IO" in der Kommandozeile aus.

Des Weiteren wird ein Paket "Greetings_PKG" herangezogen und in diesem Paket die Prozedur "Goodby" ausgeführt.

ada_body/main.adb: Main-Implementierungs-Datei

main.adb
   0001:  with Ada.Text_IO;
   0002:  with Greetings_PKG;
   0003:
   0004:  procedure main is
   0005:      use Ada.Text_IO;
   0006:  begin
   0007:      Put_Line( "Hallo Welt!" );
   0008:      Greetings_PKG.Goodby;
   0009:  end main;
   0010:                                                                                                       


ada_package/*.ads: Paket-Header-Dateien

Mit der Ausnahme der Main-Implementierungs-Datei "main.adb" benötigt jede Implementierungs-Datei eine gleichnamige Paket-Header-Datei.

In Paket-Header-Dateien (engl.: *.ads) wird definiert, aus welchen Elementen das jeweilige Paket besteht. Elemente können beispielsweise Variablen, Funktionen und Prozeduren sein. Das zu definierende Paket muss mit der Datei namensgleich sein, wodurch immer nur ein Paket in einer Paket-Header-Dateien definiert werden kann.

Hier besteht das Paket "Greetings_PKG" aus einer Prozedure mit der Bezeichnung "Goodby".

greetings_pkg.ads
   0001:  package Greetings_PKG is
   0002:      procedure Goodby;
   0003:  end Greetings_PKG;
   0004:                                                                                                       


ada_body/*.adb: Paket-Implementierungs-Dateien

In den Paket-Implementierungs-Dateien wird der eigentliche Quelltext eingepflegt. Hier soll definiert werden, was die Elemente eines Paketes während der Programmausführung bewirken.

Hier wird die Prozedur "Goodby" ausformuliert: Sie gibt die Zeichenkette "Goodby" unter Verwendung der Bibliothek "Ada.Text_IO" in der Kommandozeile aus.

greetings_pkg.adb
   0001:  with Ada.Text_IO;
   0002:  
   0003:  package body Greetings_PKG is
   0004:      procedure Goodby is
   0005:      begin
   0006:          Ada.Text_IO.Put_Line("Goodby");
   0007:      end Goodby;
   0008:  end Greetings_PKG;
   0009:                                                                                                       

makefile

Die Steuerdatei "makefile" ermittelt dynamisch den Umfang an Implementierungs-Datein, welche im Framework hinterlegt sind. Somit muss die Steuerdatei nicht verändert werden, wenn das Framework um zusätzliche Paket-Header-Dateien oder zusätzliche Paket-Implementierungs-Dateien erweitert wird.

Die Variablen "PROJECT_NAME" und "TARGET_EXEC_NAME" müssen aber bei Projektstart definiert werden.

PROJECT_NAME

Die Variable sollte den Projektnamen beinhalten. Dieser wird für die Archivierung beim Steuerkommando "make backup" benötigt. Es handelt sich um eine Zeichenkette ohne Leerzeichen.

TARGET_EXEC_NAME

Die Variable sollte den Namen der zu generierenden Excutable beinhalten. Es handelt sich um eine Zeichenkette ohne Leerzeichen.

makefile
   0001:  # ############################################################################
   0002:  #   Copyright (C) 2022 by                                                    #
   0003:  #   Christoph Stadelmann, M.Sc.                                              #
   0004:  #                                                                            #
   0005:  #   This file is free software; you can redistribute it and/or modify        #
   0006:  #   it under the terms of the GNU General Public License as published by     #
   0007:  #   the Free Software Foundation; either version 2 of the License, or        #
   0008:  #   (at your option) any later version.                                      #
   0009:  #                                                                            #
   0010:  #   This program is distributed in the hope that it will be useful,          #
   0011:  #   but WITHOUT ANY WARRANTY; without even the implied warranty of           #
   0012:  #   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            #
   0013:  #   GNU General Public License for more details.                             #
   0014:  #                                                                            #
   0015:  #   You should have received a copy of the GNU General Public License        #
   0016:  #   along with this program; if not, write to the                            #
   0017:  #   Free Software Foundation, Inc.,                                          #
   0018:  #   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.                #
   0019:  # ############################################################################
   0020:  
   0021:  PROJECT_NAME                 = ADA_PRGM_0000_hello_world
   0022:  
   0023:  TARGET_EXEC_NAME             = hello_world.exec
   0024:  
   0025:  
   0026:  # ############################################################################
   0027:  #	all
   0028:  # ############################################################################
   0029:  
   0030:  GNAT                         = gcc
   0031:  GNATBIND                     = gnatbind
   0032:  GNATLINK                     = gnatlink
   0033:  
   0034:  FOLDERS                      = work \
   0035:                                 ../BACKUP
   0036:  
   0037:  ADA_BODIES                   = $(shell cd ada_body; ls *.adb)
   0038:                                 
   0039:  .PHONY: all
   0040:  all: $(FOLDERS)
   0041:  	cp   $(shell pwd)/ada_body/*.adb   $(shell pwd)/ada_package/*.ads   $(shell pwd)/work
   0042:  	(cd $(shell pwd)/work; \
   0043:  	for item in $(ADA_BODIES); do \
   0044:  	     $(GNAT) -c $$item; \
   0045:  	done ; \
   0046:  	$(GNATBIND) main; \
   0047:  	$(GNATLINK) main; \
   0048:  	cp main ../$(TARGET_EXEC_NAME))
   0049:  	@echo "all done"
   0050:  	@echo "$(ADA_BODIES)"
   0051:  
   0052:  
   0053:  # ############################################################################
   0054:  #	$(FOLDERS)
   0055:  # ############################################################################
   0056:  
   0057:  work:
   0058:  	mkdir -p $@
   0059:  
   0060:  ../BACKUP:
   0061:  	mkdir -p $@
   0062:  
   0063:  
   0064:  # ############################################################################
   0065:  #	edit, clean
   0066:  # ############################################################################
   0067:  
   0068:  .PHONY: edit
   0069:  edit:
   0070:  	kate makefile   ada_body/*.adb   ada_package/*.ads &
   0071:  	@echo "edit done"
   0072:  
   0073:  
   0074:  .PHONY: clean
   0075:  clean:
   0076:  	rm -f   $(shell pwd)/*.exec
   0077:  	rm -f   $(shell pwd)/work/*       $(shell pwd)/work/*.*
   0078:  	@echo "clean done"
   0079:  
   0080:  
   0081:  # ############################################################################
   0082:  #	backup
   0083:  # ############################################################################	
   0084:  
   0085:  BACKUP_OBJECTS               = makefile   ada_body/*.adb   ada_package/*.ads
   0086:  
   0087:  .PHONY: backup
   0088:  backup: $(FOLDERS)
   0089:  	zip -r ../BACKUP/ZIP__$(PROJECT_NAME)__$$(date +"%Y_%m%d_%H%M%S" -u).zip $(BACKUP_OBJECTS) >
../BACKUP/ZIP__$(PROJECT_NAME)__$$(date +"%Y_%m%d_%H%M%S" -u).txt
   0090:  	@echo "backup done"
   0091:                                                                                                       

Liste von Standard-Bibliotheken

Ada

Liste von Standard-Bibliotheken
Name der Bibliotheken Beschreibung
Ada.Command_Line

Dieses Paket ermöglicht das Auslesen der Kommandozeilen-Argumente, welche dem Programm beim Start in im Terminal beigefügt wurden. Zu dem ermöglicht die Bibliothek das Setzten der Exit-Kodierung. [5]

Ada.Text_IO

Dieses Paket ermöglicht das Zugreifen in Dateien. [6]

Ada.Numerics

Diese Bibliothek ist ein Eltern-Paket für zahlreiche Bibliotheken zur Behandlung nummerischer Operationen. [7]

Ada.Numerics.Generic_Elementary_Functions

Dieses Paket stellt elementare mathematische Funktionen zur Verfügung. [8]

... ...

GNAT

Liste von Standard-Bibliotheken
Name der Bibliotheken Beschreibung
GNAT.Sockets

Dieses Paket stellt u.a. einen Zugriff auf einen TCP/IP-Socket zur Verfügung. [9]

... ...




FLEF

Stand: 2023_0101

Links und Quellen