Ada: Unterschied zwischen den Versionen

Aus FabLab Region Nürnberg
 
(29 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
= Ada =
= Ada =


[[Datei:Ada Lovelace 1838 small.png|mini|Ada Lovelace 1838<ref>https://en.wikipedia.org/wiki/File:Ada_Lovelace_1838.jpg</ref>]]


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. <ref>https://de.wikipedia.org/wiki/Ada_(Programmiersprache)</ref>
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.<ref>https://en.wikipedia.org/wiki/Ada_(programming_language)</ref> <ref>https://en.wikipedia.org/wiki/Charles_Babbage</ref>
Die Programmiersprache Ada ist in der ISO/IEC 8652:2012 genormt und in der LNCS 8339 hinterlegt.
== Benötigte Pakete ==
=== Debian (Linux) ===
{| class="wikitable"
|+ 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 ==
== Framework ==
Zeile 39: Zeile 76:
Dieses Programm gibt die Zeichenkette "Hallo Welt!" unter Verwendung der Bibliothek "Ada.Text_IO" in der Kommandozeile aus.
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 Procedure "Goodby" ausgeführt.  
Des Weiteren wird ein Paket "Greetings_PKG" herangezogen und in diesem Paket die Prozedur "Goodby" ausgeführt.  


=== ada_body/main.adb:    Main-Implementierungs-Datei ===
=== ada_body/main.adb:    Main-Implementierungs-Datei ===
Zeile 94: Zeile 131:
|+  
|+  
|-
|-
! greetings_pkg.ads
! greetings_pkg.adb
|-
|-
|  
|  
Zeile 107: Zeile 144:
     0009:                                                                                                       
     0009:                                                                                                       
|}
|}


=== makefile ===
=== 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 und zusätzliche Paket-Implementierungs-Dateie erweitert wird.
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.
Die Variablen "PROJECT_NAME" und "TARGET_EXEC_NAME" müssen aber bei Projektstart definiert werden.
Zeile 149: Zeile 183:
     0019:  # ############################################################################
     0019:  # ############################################################################
     0020:   
     0020:   
     0021:  PROJECT_NAME                = ADA_PRGM_0000_hello_world
     0021:  '''PROJECT_NAME'''                 = '''ADA_PRGM_0000_hello_world'''
     0022:   
     0022:   
     0023:  TARGET_EXEC_NAME            = hello_world.exec
     0023:  '''TARGET_EXEC_NAME'''             = '''hello_world.exec'''
     0024:   
     0024:   
     0025:   
     0025:   
Zeile 158: Zeile 192:
     0028:  # ############################################################################
     0028:  # ############################################################################
     0029:   
     0029:   
     0030:  GNAT                        = /usr/bin/i686-linux-gnu-gcc
     0030:  GNAT                        = gcc
     0031:  GNATBIND                    = /usr/bin/i686-linux-gnu-gnatbind
     0031:  GNATBIND                    = gnatbind
     0032:  GNATLINK                    = /usr/bin/i686-linux-gnu-gnatlink
     0032:  GNATLINK                    = gnatlink
     0033:   
     0033:   
     0034:  FOLDERS                      = work \
     0034:  FOLDERS                      = work \
Zeile 167: Zeile 201:
     0037:  ADA_BODIES                  = $(shell cd ada_body; ls *.adb)
     0037:  ADA_BODIES                  = $(shell cd ada_body; ls *.adb)
     0038:                                 
     0038:                                 
     0039:  .PHONY: all
     0039:  '''.PHONY: all'''
     0040:  all: $(FOLDERS)
     0040:  '''all:''' $(FOLDERS)
     0041:  cp  $(shell pwd)/ada_body/*.adb  $(shell pwd)/ada_package/*.ads  $(shell pwd)/work
     0041:  cp  $(shell pwd)/ada_body/*.adb  $(shell pwd)/ada_package/*.ads  $(shell pwd)/work
     0042:  (cd $(shell pwd)/work; \
     0042:  (cd $(shell pwd)/work; \
Zeile 177: Zeile 211:
     0047:  $(GNATLINK) main; \
     0047:  $(GNATLINK) main; \
     0048:  cp main ../$(TARGET_EXEC_NAME))
     0048:  cp main ../$(TARGET_EXEC_NAME))
     0049:  echo "all done"
     0049:  @echo "all done"
     0040:  echo "$(ADA_BODIES)"
     0050@echo "$(ADA_BODIES)"
    0041: 
    0042:  # ############################################################################
    0043:  # $(FOLDERS)
    0044:  # ############################################################################
    0045: 
    0046:  work:
    0047:  mkdir -p $@
    0048: 
    0049:  ../BACKUP:
    0050:  mkdir -p $@
     0051:   
     0051:   
     0052:   
     0052:   
     0053:  # ############################################################################
     0053:  # ############################################################################
     0054:  # edit, clean
     0054:  # $(FOLDERS)
     0055:  # ############################################################################
     0055:  # ############################################################################
     0056:   
     0056:   
     0057:  .PHONY: edit
     0057:  work:
     0058: edit:
     0058: mkdir -p $@
     0059: kate makefile  ada_body/*.adb  ada_package/*.ads &
     0059:
     0060: echo "edit done"
     0060: ../BACKUP:
     0061:
     0061: mkdir -p $@
     0062:   
     0062:   
     0063:  .PHONY: clean
     0063:   
     0064:  clean:
     0064:  # ############################################################################
    0065:  rm -f  $(shell pwd)/*.exec
     0065:  # edit, clean
    0066:  rm -f  $(shell pwd)/work/*      $(shell pwd)/work/*.*
     0066:  # ############################################################################
    0067:  echo "clean done"
    0067: 
    0068: 
    0068:  '''.PHONY: edit'''
    0069: 
    0069:  '''edit:'''
    0070:  # ############################################################################
    0070:  kate makefile  ada_body/*.adb  ada_package/*.ads &
     0071:  # backup
    0071:  @echo "edit done"
     0072:  # ############################################################################
    0072: 
     0073:   
     0073:   
     0074:  BACKUP_OBJECTS                                 = makefile  ada_body/*.adb  ada_package/*.ads
     0074:  '''.PHONY: clean'''
     0075:   
    0075:  '''clean:'''
     0076:  .PHONY: backup
    0076:  rm -f  $(shell pwd)/*.exec
     0077:  backup: $(FOLDERS)
    0077:  rm -f  $(shell pwd)/work/*      $(shell pwd)/work/*.*
     0088:  zip -r ../BACKUP/ZIP__$(PROJECT_NAME)__$$(date +"%Y_%m%d_%H%M%S" -u).zip $(BACKUP_OBJECTS) >
    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
  ../BACKUP/ZIP__$(PROJECT_NAME)__$$(date +"%Y_%m%d_%H%M%S" -u).txt
     0089:  @echo "backup done"
     0090:  @echo "backup done"
     0090:                                                                                                       
     0091:                                                                                                       
|}
|}
= Liste von Standard-Bibliotheken =
== Ada ==
{| class="wikitable"
|+ 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. <ref>http://www.ada-auth.org/standards/12rm/html/RM-A-15.html</ref>
|-
| Ada.Text_IO ||
Dieses Paket ermöglicht das Zugreifen in Dateien. <ref>http://www.ada-auth.org/standards/12rm/html/RM-A-10-1.html</ref>
|-
| Ada.Numerics ||
Diese Bibliothek ist ein Eltern-Paket für zahlreiche Bibliotheken zur Behandlung nummerischer Operationen. <ref>http://www.ada-auth.org/standards/12rm/html/RM-A-5.html</ref>
|-
| Ada.Numerics.Generic_Elementary_Functions ||
Dieses Paket stellt elementare mathematische Funktionen zur Verfügung. <ref>http://www.ada-auth.org/standards/12rm/html/RM-A-5-1.html</ref>
|-
| ... || ...
|}
== GNAT ==
{| class="wikitable"
|+ 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. <ref>https://en.wikibooks.org/wiki/Ada_Programming/Libraries/GNAT.Sockets</ref>
|-
| ... || ...
|}
== FLEF ==




Stand: 2023_0101


Stand: 2022_1202
= Links und Quellen =

Aktuelle Version vom 21. Februar 2023, 01:24 Uhr

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