Wspó
łbieżność w języku Ada
1
Skrócony opis języka ADA
1. Wstęp
Ada jest rozbudowanym j
ęzykiem programowania przeznaczonym do
tworzenia oprogramowania w du
żej skali ze szczególnym względnieniem
systemów czasu rzeczywistego i systemów wbudowanych.
Projekt zosta
ł zainicjowany przez Departament Obrony USA. Język Ada
jest u
żywany do programowania systemów militarnych. Opracowany w
firmie Honeywell w latach 70 XX wieku.
Istniej
ą dwa standardy Ady:
•
starszy - Ada83
•
nowszy - Ada95 w którym dodano m.in. obs
ługę obiektów.
Nazwa ADA jest akronimem i pochodzi od lady Ady Lovelace (1815-
1852) uwa
żanej za pierwszą programistkę – współpracowała z
Charlesem Babbage. Ada Lovelace by
ła córką poety Lorda Byrona.
Istniej
ą bezpłatne wersje Ady na wiele systemów operacyjnych
(Windows, Linux, Solaris, HP-UX):
•
GNAT (GNU Ada Translator) - http://www.gnu.org/software/gnat/,
•
MINGW - http://www.mingw.org
Literatura:
[1] Z. Huzar, Z. Fry
źlewicz, I. Dubielewicz, ADA 95, wyd. Helion 1998.
[2] Gilles Motet, Tomasz Szmuc, Programowanie systemów czasu
rzeczywistego z zastosowaniem j
ęzyka ADA, AGH uczelniane
wydawnictwo naukowo dydaktyczne, Kraków 2002.
[3] Pyle I. C. Ada, Warszawa WNT 1986.
[4] Richard Riehle, Ada Distilled, An Introduction to Ada Programming
for Experienced Computer Programmers
http://www.adaic.org/docs/distilled/adadistilled.pdf
PDF created with pdfFactory trial version
Wspó
łbieżność w języku Ada
2
G
łówne cechy języka to:
•
Czytelno
ść
•
Scis
ła typizacja
•
Wsparcie dla programowania w du
żej skali (ang. programming in the
large)
•
Ukrywanie szczegó
łów i abstrakcja danych – oddzielna część
specyfikacyjna i deklaracyjna
•
Rozbudowany mechanizm wspó
łbieżności
•
Wsparcie dla akcji zwi
ązanych z czasem
•
Wsparcie dla systemów czasu rzeczywistego
•
Wsparcie dla niezawodnego programowanie (m. in. obs
ługa
wyj
ątków)
•
Mechanizmy dla programowanie systemowego i le
żącego blisko
sprz
ętu.
•
Wsparcie dla programowania rozproszonego
•
Mechanizmy programowania obiektowego
•
Aplikacje o d
ługim czasie życia
Notacja BNF
Symbol
Znaczenie
::=
Jest definiowany jako
[ ]
Element w nawiasach wyst
ępuje lub nie
{ }
Iteracja – element w nawiasach wyst
ępuje N>=0 razy
|
Alternatywa
PDF created with pdfFactory trial version
Wspó
łbieżność w języku Ada
3
2. Elementy struktury
2.1 Jednostki programowe
Podstawowe jednostki programowe:
1. Podprogramy (ang.
subprograms) – funkcje i procedury
2. Pakiety (ang.
packages) – zbiór danych podprogramów i innych
jednostek które mog
ą stanowić element biblioteki
3. Zadania (ang.
tasks) – reprezentują wykonywane współbieznie
procesy
4. Obiekty chronione (ang.
protected objects) – implementują pamięć
dzielon
ą i zapewniają do niej dostęp zapewniający wzajemne
wykluczanie.
5. Jednostki rodzajowe (ang.
generic units) – umożliwiają
definiowanie jednostek programowych niezale
żnych od typów
danych.
2.2 Jednostki leksykalne
Tekst programu zapisany ma by
ć jako plik tekstowy utworzony za
pomoc
ą 8 bitowych znaków ze zbioru Latin1. Każdy program zawiera
przynajmniej jedn
ą jednostkę programową która jest procedurą bez
parametrów b
ędącą programem głównym.
Jednostkami leksykalnymi s
ą:
•
Identyfikatory – ma
łe i duże litery nie są rozróżniane
•
Liczby – np. 3.14, 0.11E-2, 2#1111#
•
Napisy
•
Komentarze
2.3 Pierwszy program
Aby uruchomi
ć program w Adzie należy dysponować odpowiednim
środowiskiem. Tutaj posłużono się środowiskiem GNAT które można
uzyska
ć bezpłatnie pod adresem
http://www.gnu.org/software/gnat/
Nale
ży pobrać plik odpowiedni dla systemu operacyjnego. Dla Windows
jest to plik gnu-ada-3.4.2.gz. Plik nale
ży rozpakować i zainstalować
zgodnie z instrukcj
ą.
Program tworzy si
ę dowolnym edytorem tekstowym.
PDF created with pdfFactory trial version
Wspó
łbieżność w języku Ada
4
with Ada.Text_IO; use Ada.Text_IO;
procedure Hello is
begin
Put_Line ("Hello World. Welcome to GNAT");
end;
Program hello.adb
Aby skompilowa
ć i uruchomić program należy:
•
Otworzy
ć okno poleceń tekstowych.
•
Przej
ść do katalogu z programem źrodłowym.
•
Napisa
ć polecenie:
gnatmake hello
•
Uruchomi
ć program: hello
Mo
żna się także posłużyć środowiskiem zintegrowanym GPS
https://libre2.adacore.com/gps/
).
Środowisko zintegrowane GPS - Gnat Programming Studio
PDF created with pdfFactory trial version
Wspó
łbieżność w języku Ada
5
3. Typy
J
ęzyk Ada wymaga aby każdy występujący w nim obiekt miał określony
typ co pozwala na kontrol
ę poprawności jego stosowania.
Typ jest to zbiór warto
ści wraz ze zbiorem operacji które są na tych
warto
ściach wykonywane.
•
Typy dziel
ą się na elementarne i złożone (z typów składowych).
•
Typy elementarne dziel
ą się na skalarne (dyskretne i rzeczywiste) i
wska
źnikowe.
•
Typy dyskretne dziel
ą się na całkowite i wyliczeniowe.
•
Typy z
łożone dzielą się na tablice, rekordy, rozszerzenia rekordów,
zadania i typy chronione.
znakowe
boolowskie
wyliczeniowe
inne
ze znakiem
dyskretne
ca
łkowite
resztowy
zmienno
przecinkowe
zwyk
łe
skalarne
rzeczywiste
sta
ło przecinkowe
dziesi
ętne
wska
źnik do
obiektu
proste
wska
źnikowe
wska
źnik do
podprogramu
łańcuch
tablica
inna
rekord
rekord z
wariantami
zadanie
z
łożone
Obiekt chroniony
Tab. 3-1 Typy w języku Ada
Podstawowe typy danych zdefiniowane s
ą w pakiecie Standard. W
pakiecie tym zdefiniowane typy proste: Integer, Positive, Natura, Float,
Boolean, Charakter, Wide_Character, String, Wide_String, Duration.
PDF created with pdfFactory trial version
Wspó
łbieżność w języku Ada
6
Definicja typu wprowadzana jest zwykle podczas jego deklaracji.
Deklaracja_typu ::=
type
nazwa_typu
is
definicja_typu
Na przyk
ład:
type
Kolor
is
(White, Red, Green, Blue, Black);
type
Kolumna
is
range 1 .. 72;
type
Tablica
is
array(1 .. 10) of
Integer
;
Dla danego typu zdefiniowa
ć można podtyp operujący na
zaw
ężonym zbiorze wartości. Operacje są takie same jak na
typie bazowym.
Deklaracja_podtypu ::=
subtype
nazwa_podtypu
is
Identyfikator_typu
[Zaw
ężenie]
Na przyk
ład:
subtype
Small_Int
is Integer range
–10 .. 10;
3.1 Typy skalarne
Typy skalarne – warto
ści tych typów są uporządkowane liniowo.
Typ wyliczeniowy
Typ wyliczeniowy jest typem dyskretnym którego warto
ści są wprost
wymienione za pomoc
ą zbioru różnych literałów znakowych.
type
Kolor
is
(White, Red, Green, Blue, Black);
Pierwotnie zdefiniowany typ znakowy
character
jest typem
wyliczeniowym którego warto
ści są znakami kodu Latin1.
PDF created with pdfFactory trial version
Wspó
łbieżność w języku Ada
7
Pierwotnie zdefiniowany typ wyliczeniowy
boolean
jest typem
wyliczeniowym którego warto
ści są
False
i
True
.
Dla typu
boolean
zdefiniowane s
ą operacje
not
,
and
,
or
,
xor
.
Typ całkowity
Typ ca
łkowity może być całkowity ze znakiem (Integer) albo resztowy.
Dla typów ca
łkowitych zdefiniowane są operacje:
*, /, +, - , **, mod (modulo), rem (reszta).
type
Page_Num
is range
1 .. 2_000;
type
Line_Size
is range
1 .. Max_Line_Size;
subtype
indeks
is
Line_Size
range
1 .. 10;
Typ zmiennopozycyjny
Typ_zmiennopozycyjny ::=
digits
Wyra
żenie_statyczne [
range
Proste_wyra
żenie_statyczne1 .. Proste_wyrażenie_statyczne2]
Wyst
ępujące po
digits
wyra
żenie definiuje minimalną liczbę cyfr
dziesi
ętnych reprezentującą wartość tego typu. Wyrażenia po
range
definiuj
ą zakres wartości.
type
przeplyw
is digits
3
range
20.5 .. 40.0;
W pakiecie
Standard zawarty jest predefiniowany typ Float.
3.2 Typy złożone
Typ tablicowy
Typ tablicowy jest typem z
łożonym którego składowe są tego samego
typu (typu bazowego). Sk
ładowe są identyfikowane przez indeks.
type
Table
is array
(1..10)
of Integer
;
type
Line
is array
(1..Max)
of Character
;
type
Buffer
is array
(1..10,1..80)
of Character
;
PDF created with pdfFactory trial version
Wspó
łbieżność w języku Ada
8
Rekordy
Rekord jest struktur
ą grupującą elementy róznego typu. Język ADA
definiuje ró
żnorodne typy rekordów. Tutaj podana będzie tylko
najprostsza definicja.
type
Data
is
record
dzien:
Integer range 1..31;
miesiac: Integer range 1..12;
rok:
Integer range 2000..2100;
end record
;
Dost
ęp do elementów rekordu nastepuje poprzez notację kropkową lub
konstrukcj
ę agregatową.
Urodziny: Data;
Urodziny.dzien := 26;
Urodziny.miesiac := 11;
Urodziny.rok := 1952;
Lub
Urodziny := (dzien=>27, miesiac=>11, rok=>1952);
PDF created with pdfFactory trial version
Wspó
łbieżność w języku Ada
9
4. Instrukcje
Instrukcje okre
ślają działania na zbiorze danych.
Pusta null
Przypisania
Wywo
łania procedury
Wywo
łania wejścia
requeue
delay
abort
sekwencyjne
code
exit
skok
goto
raise
Proste
steruj
ące
return
Warunkowa
if
Wybor
case
P
ętla
loop
Blok
declare
accept
Z
łożone
select
4.1 Instrukcja przypisania
Nazwa_zmiennej := wyra
żenie
4.2 Instrukcja bloku
Instrukcja bloku pozwala na zagnie
żdżanie bloków. Każda jednostka
programowa sk
łada się z jednego lub więcej bloków.
Ka
żdy blok składa się z:
1. Deklaracji jednostek (sta
łych, typów, zmiennych, podprogramów)
lokalnych dla danego bloku.
2. Sekwencji instrukcji
3. Obs
ługi wyjątków
PDF created with pdfFactory trial version
Wspó
łbieżność w języku Ada
10
[Identyfikator_bloku:]
[
declare
deklaracje ]
begin
sekwencja instrukcji
[
exception
obs
ługa wyjątków ]
end
[Identyfikator_bloku:];
Podzia
ł na bloki umożliwia wyodrębnienie spójnych fragmentów
programu i jest narz
ędziem strukturalizacji programu.
Przyk
ład:
Swap:
declare
Temp : Integer;
begin
Temp := V; V := U; U := Temp;
end Swap
;
4.3 Instrukcja warunkowa
if
Pozwala wybra
ć który ciąg instrukcji ma być wykonany. Warunki są
wyra
żeniami logicznymi.
Instrukcja_if ::=
if
warunek1
then
Instrukcje1
{
elsif
warunek2
then
Instrukcje}
[
else
instrukcje0 ]
end if
;
PDF created with pdfFactory trial version
Wspó
łbieżność w języku Ada
11
Przyk
ład:
if (x >= 1) and (x < 10) then
y := x + y;
elsif (x >= 10) and (x < 20) then
New_Line;
Put(Item);
else
Put(Item);
end if;
4.4 Instrukcja wyboru case
Instrukcja_wyboru ::=
case
wyrażenie_wyboru
is
when
Lista1 => Instrukcje1
....
when
ListaN => InstrukcjeN
[
when others
=> Instrukcje0]
end case
;
Wyra
żenie wyboru musi być typem dyskretnym. Lista elementów musi
by
ć wyrażeniami statycznymi rozdzielonymi pionowymi kreskami.
Wykonanie instrukcji:
1. Obliczenie warto
ści wyrażenia wyboru.
2. Gdy wyra
żenie jest na którejś liście to wykonanie instrukcji po =>
3. Gdy wyra
żenia brak na listach to zgłoszenie wyjątku
Constraint_Error.
case i is
when 1 | 2 | 3 => x = 1;
when range 4..10 => x = 2;
when others => x = 3;
end case;
4.5 Instrukcja pętli
Instrukcja p
ętli umożliwia wielokrotne wykonanie pewnego bloku
instrukcji. Pierwsz
ą konstrukcją jest pętla nieskończona.
PDF created with pdfFactory trial version
Wspó
łbieżność w języku Ada
12
Pętla_nieskonczona ::=
[Identyfikator_pętli]
loop
ciąg instrukcji
end loop
[Identyfikator_pętli];
Wyj
ście z pętli następuje po wykonaniu instrukcji
exit
.
loop
i:= i+1;
if i >= 10 then exit; end if;
end loop;
Liczb
ę powtórzeń wyspecyfikować można używając klauzul
while
i
for
.
Pętla_while ::=
[Identyfikator_pętli]
while
[Wyrażenie_logiczne]
loop
Ciąg instrukcji
end loop
[Identyfikator_pętli];
Ci
ąg instrukcji powtarzany jest tak długo jak
Wyrażenie_logiczne
pozostaje prawdziwe.
Pętla_for ::=
[Identyfikator_pętli]
for
Identyfikator
in
[
reverse
]Podtyp_dyskretny
loop
Ciąg instrukcji
end loop
[Identyfikator_pętli];
Instrukcja for powoduje powtórzenie
Ciągu_instrukcji
dla ka
żdej
warto
ści określonej przez
Podtyp_dyskretny
.
PDF created with pdfFactory trial version
Wspó
łbieżność w języku Ada
13
with ada.text_io; use ada.text_io;
procedure Suma is
Tab: array( Integer range 1..10) of Integer;
Suma: Integer;
begin
Suma := 0;
for i in Integer range 1..10 loop
Tab(i) := i;
Suma := Suma + i;
end loop;
put_line("Suma: " & Integer'Image(Suma));
end suma;
Przykład 4-1 Sumowanie liczb
4.6 Instrukcja skoku
Wykonanie instrukcji
goto
etykieta
powoduje przekazanie
sterowania do instrukcji oznaczonej etykiet
ą.
petla: loop
i:= i+1;
if i >= 10 then goto petla; end if;
end loop;
PDF created with pdfFactory trial version
Wspó
łbieżność w języku Ada
14
5. Podprogramy
Podprogramy s
ą podstawowymi jednostkami tworzącymi program Ady.
Podprogramy umo
żliwiają uzyskanie następujących efektów:
•
Dekompozycja programu na hierarchi
ę jednostek - strukturalizacja
•
Tworzenie komponentów wielokrotnego u
żytku - biblioteki
Zdefiniowane s
ą dwa rodzaje podprogramów:
•
Procedury
•
Funkcje
Definicja podprogramu sk
łada się z:
•
deklaracji podprogramu – opis interfejsu
•
tre
ści – opis działania
Definicja_podprogramu :=
[Specyfikacja_podprogramu]
Specyfikacja_podprogramu is
[Deklaracje]
begin
Ci
ąg_instrukcji
end
[nazwa_podprogramu]
Specyfikacja podprogramu okre
śla:
•
Jego rodzaj (procedura czy funkcja)
•
Nazw
ę
•
Parametry formalne: nazwy, typy, kierunek przesy
łania
•
W funkcji typ zwracanej warto
ści
5.1 Funkcje
Funkcja to rodzaj podprogramu który zwraca pewn
ą wartość. Dlatego
mog
ą być wykorzystane do obliczania wartości w wyrażeniach.
PDF created with pdfFactory trial version
Wspó
łbieżność w języku Ada
15
Tre
śc_funkcji :=
function
nazwa_funkcji [(parametry_formalne_funkcji)]
return
Typ_zwracany
is
deklaracje
begin
…
[
return
]
…
end
nazwa_ funkcji;
Lista parametrów formalnych jest postaci:
parametry_formalne_funkcji:=
Nazwa: [
in
] Typ {; Nazwa: [
in
] Typ }
Gdy parametry s
ą tego samego typu to dopuszczalny jest zapis:
Nazwa1, Nazwa2, ..., NazwaN: [Tryb] Typ
W tre
ści funkcji powinno pojawić się przynajmniej jedno słowo kluczowe
return
a po nim wyra
żenie o typie zgodnym z definicją funkcji.
function maxim(par1: Integer; par2: Integer)
return Integer is
begin
if(par1 >= par2) then
return par1;
else
return par2;
end if;
end maxim;
5.2 Procedury
Drugim rodzajem podprogramu jest procedura.
PDF created with pdfFactory trial version
Wspó
łbieżność w języku Ada
16
Tre
śc_procedury :=
procedure nazwa_procedury[(parametry_formalne_procedury)]
is
deklaracje
begin
…
[
return
]
…
end
nazwa_procedury;
parametry_formalne_ procedury :=
Nazwa: [
in
] Typ {; Nazwa: [
in
] Typ }
Tryb jest jedn
ą z trzech wartości:
in
,
in out
,
out
. Oznacza on
kierunek przekazywania danych:
in
Parametr wej
ściowy przekazywany przez wartość
in out
Parametr wej
ściowo wyjściowy przekazywany przez
zmienn
ą
out
Parametr wyj
ściowy przekazywany przez zmienną
Gdy parametry s
ą tego samego typu to dopuszczalny jest zapis:
Nazwa1, Nazwa2, ..., NazwaN: [Tryb] Typ
with Ada.Text_IO; use Ada.Text_IO;
procedure proced1 is
x,y,pt: Float;
procedure pole(a,b: in Float; wynik: out Float) is
begin
wynik := (a * b)/2.0;
end pole;
begin
Put_Line ("Pole trojkata");
x:= 1.2;
y:= 2.4;
pole(x,y,pt);
Put_Line("Pole wynosi"& Float'Image(pt));
end;
Przykład 5-1 Procedura obliczania pola trójkata
PDF created with pdfFactory trial version
Wspó
łbieżność w języku Ada
17
6. Pakiety
Pakiet jest wa
żną konstrukcją języka Ada. Pakiet grupuje deklaracje i
definicje i ukrywa ich wewn
ętrzne szczegóły. Pakiety mogą być
oddzielnie kompilowane, grupowane w biblioteki i u
żywane wielokrotnie.
Specyfikacja_pakietu ::=
package
Nazwa
is
[Deklaracje_sta
łych]
[Deklaracje_typów]
[Deklaracje_zmiennych]
[Deklaracje_podprogramów]
[
private
[Deklaracje_sta
łych]
[Deklaracje_typów]
]
end
Nazwa;
Tre
ść_pakietu ::=
package body
Nazwa
is
[Deklaracje_wewn
ętrzne]
begin
[Instrukcje_inicjalizuj
ące_pakiet]
end
Nazwa;
Specyfikacj
ę pakietu umieszcza się w oddzielnym pliku (z rozszrzeniem
ads).
-- Specyfikacja pakietu, plik stos.ads
package stos is
procedure Push(x: Integer);
function Pop return Integer;
end stos;
Przykład 6-1 Specyfikacja pakietu stos
Deklaracj
ę pakietu umieszcza się w oddzielnym pliku (z rozszrzeniem
adb).
PDF created with pdfFactory trial version
Wspó
łbieżność w języku Ada
18
-- Deklaracja pakietu stos - plik stos.adb
package body stos is
rozmiar: constant := 10;
Buf: array(1..rozmiar) of Integer;
cnt: Integer;
procedure Push(x: Integer)is
begin
if(cnt = rozmiar) then return;
else
Buf(cnt) := x;
cnt := cnt+1;
end if;
end Push;
function Pop return Integer is
begin
if(cnt = 0) then return -1;
else
cnt := cnt-1;
return Buf(cnt);
end if;
end Pop;
begin
cnt := 1;
end stos;
Przykład 6-2 Implementacja pakietu stos
PDF created with pdfFactory trial version
Wspó
łbieżność w języku Ada
19
-- Program testujący pakiet stos
with ada.text_io; use ada.text_io;
with stos; use stos;
procedure stos_test is
x: Integer;
begin
Push(1);
Push(2);
Push(3);
for i in Integer range 1..3 loop
x := Pop;
put_line("Ze stosu: " & Integer'Image(x));
end loop;
end stos_test;
Przykład 6-3 Program testujący pakiet stos
PDF created with pdfFactory trial version