Ada (język programowania) - Ada (programming language)


Z Wikipedii, wolnej encyklopedii
Ada
Paradygmat Wielu paradygmat
Zaprojektowany przez
  • MIL-STD-1815 / Ada 83: Jean Ichbiah
  • Ada 95: Tucker Taft
  • Ada 2005: Tucker Taft
  • Ada 2012: Tucker Taft
Po raz pierwszy pojawiły się Luty 1980 ; 38 lat temu ( 1980/02 )
Wersja stabilna
Ada 2012 TC1 / 01 lutego 2016 ; 2 lata temu ( 1.02.2016 )
preview release
Ada 2012 TC1 / kwiecień 2015 ; 3 lata temu ( 2015-04 )
dyscyplina Typing statyczne , mocny , bezpieczny , mianownik
OS Cross-platform (wieloplatformowy)
Plik rozszerzenia .adb, .ads
Stronie internetowej www .adaic .org
Ważniejsze realizacje
AdaCore GNAT (do pobrania za darmo: http://libre.adacore.com/download ),
Green Hills Software Optymalizacja Ada 95 kompilator,
PTC, Inc. PTC ApexAda i PTC ObjectAda,
"MapuSoft Ada-C / C ++ zmieniarka" .Poprzednio znany jako „AdaMagic pośredniego z C”
DDC-I nik
dialekty
SPARK , profil Ravenscar
Wpływem
ALGOL 68 , Pascal , C ++ (Ada 95), Smalltalk (Ada 95), Modula-2 (Ada 95) Java (ADA 2005), Eiffel (ADA 2012)
wpływ
C ++ , kaplica , "Drago" ., Eiffel , "Griffin" ., Java , Nim , parasail , PL / SQL , PL / pgSQL , Ruby , Seed7 , "SPARforte" ., Sparkel , SQL / PSM , VHDL

Ada jest uporządkowany , statycznie wpisane , imperatywem i zorientowanym obiektowo wysokiego poziomu komputera język programowania , przedłużony od Pascala i innych językach. Posiada wbudowaną obsługę języka dla projektowania-by-umowy , niezwykle silnego typowania, wyraźnej współbieżności, zadania, synchronicznego Message Passing, chronionych obiektów i braku determinizmu . Ada poprawia bezpieczeństwo kodu i konserwacji za pomocą kompilatora znaleźć błędy na korzyść błędów runtime. Ada jest międzynarodowym standardem; Aktualna wersja (znana jako Ada 2012) jest zdefiniowany przez ISO / IEC 8652: 2012.

Ada została zaprojektowana przez zespół kierowany przez Jean Ichbiah z CII Honeywell Bull w ramach umowy z Departament Obrony Stanów Zjednoczonych (DoD) od 1977 do 1983 roku, aby zastąpić ponad 450 języków programowania używanych przez DoD w tym czasie. Ada została nazwana Ada Lovelace (1815-1852), który został zaliczony jako pierwszy programista komputerowy.

funkcje

Ada została pierwotnie skierowane do osadzonych oraz w czasie rzeczywistym systemów. Ada 95 rewizja, zaprojektowany przez S. Tucker Taft z Intermetrics między rokiem 1992 a 1995, ulepszone wsparcie dla systemów liczbowych, finansowych i programowania obiektowego (OOP).

Cechy Ada to: silne pisanie , mechanizmy modułowość (opakowań), run-time kontroli , przetwarzania równoległego ( zadania , synchroniczne przekazywanie komunikatów , chronionych obiektów i niedeterministycznych select ), obsługę wyjątków i rodzajowych . Ada 95 dodano wsparcie dla programowania obiektowego , w tym dynamicznym wysyłki .

Składnia Ada minimalizuje wybory sposobów wykonywania podstawowych operacji, a preferuje angielskich słów kluczowych (takich jak „albo” i „a następnie”) na symbole (takie jak „||” i „&&”). Ada wykorzystuje podstawowe operatory arytmetyczne „+”, „-”, „*” i „/”, ale unika się stosowania innych symboli. Bloki kodu są ograniczone przez takich słów jak „zadeklarować”, „rozpocząć” i „koniec”, gdzie „end” (w większości przypadków) następuje identyfikator bloku zamyka (np jeśli ... koniec jeśli , pętla ... koniec pętli ). W przypadku bloków warunkowych ten sposób unika się zwisające inny , który mógłby powiązać ze złym zagnieżdżonego IF-wypowiedzi w innych językach takich jak C lub Java.

Ada jest przeznaczony na rozwój bardzo dużych systemów oprogramowania. Ada pakiety mogą być kompilowane osobno. Dane pakietowe Ada (interfejs) Pakiet może być również zestawiane oddzielnie bez wdrożenia do sprawdzenia spójności. To sprawia, że ​​możliwe jest wykrycie problemów na wczesnym etapie fazy projektowej, przed rozpoczęciem realizacji.

Duża liczba kontroli w czasie kompilacji są obsługiwane, aby uniknąć błędów, które nie byłyby wykrywalne dopiero w czasie wykonywania niektórych innych języków lub wymagałyby jawne kontrole mają być dodane do kodu źródłowego. Na przykład, składnia wymaga wyraźnie nazwany zamknięcia bloków, aby zapobiec błędom z powodu niedopasowanych tokenów końcowych. Przestrzeganie silnego typowania umożliwia wykrycie wielu typowych błędów oprogramowania (niewłaściwych parametrów, zakres naruszenia, nieważne referencji, niedopasowane typów, etc.) albo podczas kompilacji, lub w inny sposób w czasie wykonywania. Jak współbieżności jest częścią specyfikacji języka, kompilator może w niektórych przypadkach wykrycia potencjalnych zakleszczenia. Kompilatory również powszechnie sprawdzić błędne identyfikatory, widoczność opakowań, zbędnych deklaracji itp i może zapewnić ostrzeżenia i przydatnych wskazówek, w jaki sposób naprawić ten błąd.

Ada obsługuje również kontrole w czasie wykonywania w celu ochrony przed dostępem do pamięci nieprzydzielone, przepełnienie buforu błędów, naruszeń zasięgu, off-by-one błędy , błędy dostępu do tablicy i innych wykrywalnych błędów. Kontrole te mogą być wyłączone w interesie efektywności wykonawczego, ale często mogą być skompilowane sprawnie. Obejmuje ona także udogodnienia, które pomogą weryfikację programu. Z tych powodów, Ada jest szeroko stosowany w systemach krytycznych, gdy jakakolwiek anomalia może prowadzić do bardzo poważnych konsekwencji, np przypadkowej śmierci, uszkodzenia ciała lub ciężkiego straty finansowe. Przykłady systemów, w których używany jest Ada to awionikę , ATC , koleje, bankowości, wojska i technologii kosmicznej.

Ady dynamiczne zarządzanie pamięcią jest wysoki poziom i rodzaj bezpieczny. Ada nie posiada rodzajowe lub bez typu wskaźników ; ani nie niejawnie zadeklarować dowolny typ wskaźnika. Zamiast tego, wszystkie dynamiczny przydział pamięci i dealokacji musi odbywać się poprzez jawnie zadeklarowanych typów dostępu . Każdy rodzaj dostępu jest skojarzony pulę pamięci , który obsługuje dane niskiego poziomu zarządzania pamięcią; programista może użyć domyślnej puli pamięci lub zdefiniować nowe (jest to szczególnie istotne dla Non-Uniform Memory Access ). Jest nawet możliwe, aby zadeklarować kilka różnych typów dostępu, które wszystkim wyznaczenie tego samego typu, ale używają różnych pul pamięci. Również język przewiduje kontroli dostępu , zarówno w czasie kompilacji iw czasie wykonywania, który zapewnia, że wartość dostępu nie może przeżyć typ obiektu to wskazuje.

Choć semantyka języka pozwala na automatyczne zbieranie śmieci niedostępnych obiektów, większość implementacji nie obsługują go domyślnie, gdyż spowodować nieprzewidywalne zachowanie w systemach czasu rzeczywistego. Ada nie obsługuje ograniczoną formę zarządzania pamięcią regionie oparte ; również, twórcze wykorzystanie pul pamięci można dostarczyć do ograniczonej formie automatycznego zbierania śmieci, ponieważ niszcząc pulę pamięci również niszczy wszystkie obiekty w basenie.

Dwukrotnie myślnik ( „-”), przypominający pauzy , oznacza tekst komentarza. Komentarze zatrzymują się na końcu linii, aby zapobiec przypadkowemu niezamknięte komentarzy mikcji całych fragmentów kodu źródłowego. Wyłączania całego bloku kodu wymaga obecnie poprzedzanie każdej linii (lub kolumn) indywidualnie „-”. Choć wyraźnie oznaczający kod niepełnosprawnej z kolumną powtórzony „-” w dół strony to czyni dis experimental / ponowne uaktywnianie dużych bloków bardziej wyciągnięta procesu.

Średnik ( „;”) jest terminator oświadczenie , a zerowy lub nie-działanie stwierdzenie null;. Pojedynczy ;bez oświadczenia o wypowiedzeniu nie jest dozwolone.

W przeciwieństwie do większości ISO standardów, definicji języka Ada (znany jako podręcznika Ada Referencyjnego lub ARM , lub czasem z Podręcznika Język lub LRM ) jest zawartość wolnego . Tak więc, jest to wspólny punkt odniesienia dla programistów Ada i nie tylko programistów realizujących kompilatory Ada. Oprócz podręcznika znajduje się również obszerny dokument, który wyjaśnia uzasadnienie projektu języka i stosowanie różnych konstrukcji językowych. Dokument ten jest również szeroko wykorzystywany przez programistów. Gdy język został zmieniony, nowy dokument uzasadnienie zostało napisane.

Jedną z istotnych wolne oprogramowanie narzędzie, które jest używane przez wielu programistów Ada, aby pomóc im w pisaniu kodu źródłowego Ada jest Studio GNAT programowania .

Historia

W roku 1970, amerykański Departament Obrony (DoD) został objęty liczbą różnych języków programowania wykorzystywany do swoich projektów wbudowanych systemów komputerowych, z których wiele było przestarzałe lub sprzętowo-zależne, a żaden z którego obsługiwana bezpiecznego programowania modularnego. W 1975 roku grupa robocza The Wysoka Zamówienie Grupa Robocza Język (HOLWG), została utworzona z zamiarem zmniejszenia tej liczby poprzez znalezienie lub stworzenie języka programowania ogólnie nadaje się do dział i do Ministerstwa Obrony Wielkiej Brytanii wymagań. Po wielu iteracji rozpoczynających się od oryginalnego człowieka wniosku Straw ewentualne język programowania został nazwany Ada. Łączna liczba języków programowania wysokiego poziomu w użyciu dla takich projektów spadł z ponad 450 w roku 1983 do 37 w 1996.

Grupa robocza HOLWG spreparowanego wymagania steelman językowych , szereg dokumentów stwierdzających wymagania poczuli język programowania powinien spełniać. Wiele istniejących języków zostały formalnie przeglądowi, ale zespół stwierdził, że w 1977 roku nie istniejący język spełnił wymagania.

Wnioski o propozycji nowego języka programowania zostały wydane i cztery wykonawcy zostali zatrudnieni rozwijać swoje propozycje pod nazwami czerwonego ( Intermetrics kierowanego przez Benjamina Brosgol), zielony ( CII Honeywell Bull , kierowany przez Jean Ichbiah ), niebieski ( Softech , prowadzonych przez John Goodenough) i Żółty ( SRI International , prowadzony przez Jay spitzen). W kwietniu 1978 roku, po kontroli publicznej, czerwony i zielony propozycje przeszły do następnego etapu. W maju 1979 roku, Green propozycja, zaprojektowany przez Jeana Ichbiah w CII Honeywell Bull, został wybrany i otrzymał imię Ada-po Augusta Ada, hrabina Lovelace . Propozycja ta została pod wpływem języka programowania LIS że Ichbiah i jego grupa opracowanych w 1970 roku. Wstępna Ada instrukcja referencyjna została opublikowana w Informacjach ACM SIGPLAN w czerwcu 1979. Instrukcja odniesienia Wojskowy standard został zatwierdzony w dniu 10 grudnia 1980 roku ( Ada Lovelace urodzinowy „s), a biorąc pod uwagę liczbę MIL-STD-1815 na cześć urodzin Ady Lovelace rok. W 1981 CAR Hoare skorzystał z jego Nagroda Turinga mowy Ada krytykować za to, że zbyt skomplikowane i stąd niewiarygodne, ale potem wydawało się odwołać w przedmowie pisał dla podręcznika Ady.

Ada przyciąga wiele uwagi ze strony społeczności programowania jako całości podczas jej pierwszych dni. Jego zwolennicy i inni przewidział, że może stać się dominującym językiem programowania ogólnego przeznaczenia, a nie tylko prace związane z obronnością. Ichbiah publicznie stwierdził, że w ciągu dziesięciu lat, tylko dwa języki programowania pozostanie, Ada i Lisp . Wczesne kompilatory Ada starały się realizować duży, skomplikowany język, a zarówno w czasie kompilacji i run-time wydajność tendencję do być powolne i narzędzia prymitywne. Sprzedawcy kompilatora wydatkowane większość swoich wysiłków w zdaniu masywny, językowo-testów zgodności, wymagane przez rząd „ACVC” sprawdzania, który był wymagany w innym Nowością nakładem języka Ada.

Pierwszy zatwierdzony realizacja Ada był tłumacz NYU Ada / Ed, poświadczone w dniu 11 kwietnia 1983 roku NYU Ada / Ed realizowanego w wysokim szczeblu zestaw języka SETL . Wiele firm zaczęło oferować komercyjne kompilatory Ada i powiązanych narzędzi programistycznych, w tym Alsys , TeleSoft , DDC-I , Zaawansowane techniki komputerowe , tartan Laboratories , TLD Systems , Verdix i innych.

Augusta Ada Król , hrabina Lovelace.

W 1991 roku Departament Obrony USA zaczęły wymagać użycia Ada (The mandatu Ada ) dla wszystkich programów, choć wyjątki od tej reguły były często przyznawane. Departament Obrony Ada mandat został skutecznie usunięty w 1997 roku, jako DoD zaczął objąć COTS technologii. Podobne wymagania istniały w innych NATO krajach: Ada była wymagana dla systemów z udziałem NATO dowodzenia i kontroli oraz inne funkcje, a Ada była upoważniona lub preferowany język dla aplikacji związanych z obronnością w krajach takich jak Szwecja, Niemcy i Kanada.

Pod koniec 1980 i na początku 1990, kompilatory Ada uległa poprawie wydajności, ale nie było jeszcze bariery dla pełnego wykorzystania możliwości Ady, w tym modelu tasking że był inny od tego, co większość programistów w czasie rzeczywistym zostały wykorzystane do.

Ze względu Ady krytycznych dla bezpieczeństwa funkcji wsparcia, jest obecnie wykorzystywana nie tylko do zastosowań wojskowych, ale również w projektach komercyjnych, gdzie błąd oprogramowania może mieć poważne konsekwencje, np awioniki i kontroli ruchu lotniczego , rakiety komercyjnych, takich jak Ariane 4 i 5 , satelity i inne systemy kosmiczne, transport kolejowy i bankowych. Na przykład, system zarządzania informacją Samolot The fly-by-wire oprogramowanie systemowe w Boeing 777 , został napisany w Ada. Opracowany przez Honeywell Air Systemów Transportowych we współpracy z konsultantami z DDC-I stało się prawdopodobnie najbardziej znanym każdego projektu Ada, cywilnej lub wojskowej. Zautomatyzowany system Air Traffic kanadyjski została napisana w 1 mln linii Ada ( SLOC count). Zawierała zaawansowanego przetwarzania rozproszonego, rozproszoną bazę danych Ada i projektowania obiektowego. Ada jest również stosowany w innych systemach ruchu lotniczego, np następnej generacji w Wielkiej Brytanii Interim Future Area Control Narzędzia Support (iFACTS) system kontroli ruchu lotniczego został zaprojektowany i wdrożony za pomocą SPARK Ada. Jest również stosowany w francuski TVM in- kabiny sygnalizacji systemu na TGV systemu kolei dużych prędkości i podmiejskich pociągów metra w Paryżu, Londynie, Hong Kongu i Nowym Jorku.

Normalizacja

Język stał się ANSI standard (1983 / MIL-STD 1815A ANSI , a po przeliczeniu) w języku francuskim i bez dalszych zmian w angielski stał się standardem ISO 1987 (ISO-8652: 1987). Ta wersja języka jest powszechnie znany jako Ada 83, od daty jej przyjęcia przez ANSI, ale jest czasami określane również jako Ada 87, od daty jej przyjęcia przez ISO.

Ada 95, wspólny standard ISO / ANSI ( ISO-8652: 1995 ) została opublikowana w lutym 1995 roku, co czyni Ada 95 pierwszy standard języka programowania obiektowego ISO. Aby pomóc w standardowej rewizji i przyszłej akceptacji The US Air Force finansowany rozwój GNAT Compiler . Obecnie komara Compiler jest częścią GNU Compiler Collection .

Prowadzone są dalsze prace nad poprawą i aktualizacji zawartości technicznej języka programowania Ada. Sprostowanie techniczna Ada 95 został opublikowany w październiku 2001 roku, a także znaczącym zmianom, ISO / IEC 8652: 1995 / Amd 1: 2007 została opublikowana w dniu 9 marca 2007. Na Ada-Europe 2012 konferencji w Sztokholmie, Stowarzyszenie Zasobów Ada (ARA) i Ada-Europe ogłosiła zakończenie projektowania najnowszej wersji języka programowania Ada i złożenia instrukcji odniesienia do Międzynarodowej Organizacji Normalizacyjnej (ISO) do zatwierdzenia. ISO / IEC 8652: 2012 został opublikowany w grudniu 2012 roku.

Inne pokrewne obejmują standardy ISO 8651 -3: 1988 grafika-Graficzne systemy przetwarzania informacji Kernel-Computer System (GKS) Wiązania-Part język 3: Ada .

konstrukcje językowe

Ada jest ALGOL -jak język programowania wyposażony struktury sterujące ze słowami zastrzeżonymi takimi jak gdyby , następnie , else , podczas gdy , dla , i tak dalej. Jednak Ada ma również wiele udogodnień strukturyzacji danych i inne abstrakcje, które nie zostały ujęte w pierwotnym Algol 60 , takich jak definicje typu , rekordy , wskaźników , wyliczeń . Takie konstrukty częściowo odziedziczone lub inspirowane przez Pascala .

"Witaj świecie!" Ada

Typowym przykładem języka w składni jest Program Hello world (hello.adb)

with Ada.Text_IO; use Ada.Text_IO;
procedure Hello is
begin
  Put_Line ("Hello, world!");
end Hello;

Ten program może być skompilowany przy użyciu swobodnie dostępne open source kompilator gnat , wykonując

gnatmake hello.adb

typy danych

System typu Ady nie opiera się na zbiorze predefiniowanych typów pierwotnych , ale pozwala zadeklarować swoje typy. Deklaracja ta z kolei nie opiera się na wewnętrznej reprezentacji typu ale opisując cel, który powinien zostać osiągnięty. Pozwala to kompilator, aby określić odpowiedni rozmiar pamięci dla danego typu i sprawdzić za łamanie definicji typu w czasie kompilacji i uruchamiania czasu (czyli zakres naruszenia, przekroczenia buforowe, typ konsystencja, itp). Ada obsługuje typy numeryczne zdefiniowane przez szereg modulo typów, rodzajów kruszywa (rekordy i tablice) oraz typy wyliczenia. Typy dostępu określają odwołanie do wystąpienia określonego typu; bez typu wskaźniki nie są dozwolone. Typy specjalne przewidziane przez język są typy zadań i chronione rodzaje.

Na przykład, termin może być przedstawiony jako:

type Day_type   is range    1 ..   31;
type Month_type is range    1 ..   12;
type Year_type  is range 1800 .. 2100;
type Hours is mod 24;
type Weekday is (Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday);

type Date is
   record
     Day   : Day_type;
     Month : Month_type;
     Year  : Year_type;
   end record;

Typy mogą być rafinowane deklarując podtypy:

subtype Working_Hours is Hours range 0 .. 12;            -- at most 12 Hours to work a day
subtype Working_Day is Weekday range Monday .. Friday;   -- Days to work

Work_Load: constant array(Working_Day) of Working_Hours  -- implicit type declaration
   := (Friday => 6, Monday => 4, others => 10);           -- lookup table for working hours with initialization

Typy mogą mieć modyfikatorów, takich jak ograniczona, streszczenie, prywatne typy itp prywatne mogą być dostępne i ograniczone typy mogą być modyfikowane lub kopiowane tylko w ramach pakietu, który definiuje je tylko. Ada 95 dodaje dodatkowe funkcje do obiektowego rozszerzenie typów.

Struktury kontrolne

Ada to strukturalny programowania język, co oznacza, że przepływ sterowania jest podzielony na standardowych stwierdzeń. Wszystkie standardowe konstrukcje i głęboki poziom wcześnie exit są obsługiwane więc korzystanie z również wspierany „ idź do ” jest rzadko potrzebne polecenia.

-- while a is not equal to b, loop.
while a /= b loop
  Ada.Text_IO.Put_Line ("Waiting");
end loop;

if a > b then
  Ada.Text_IO.Put_Line ("Condition met");
else
  Ada.Text_IO.Put_Line ("Condition not met");
end if;

for i in 1 .. 10 loop
  Ada.Text_IO.Put ("Iteration: ");
  Ada.Text_IO.Put (i);
  Ada.Text_IO.Put_Line;
end loop;

loop
  a := a + 1;
  exit when a = 10;
end loop;

case i is
  when 0 => Ada.Text_IO.Put ("zero");
  when 1 => Ada.Text_IO.Put ("one");
  when 2 => Ada.Text_IO.Put ("two");
  -- case statements have to cover all possible cases:
  when others => Ada.Text_IO.Put ("none of the above");
end case;

for aWeekday in Weekday'Range loop               -- loop over an enumeration
   Put_Line ( Weekday'Image(aWeekday) );         -- output string representation of an enumeration
   if aWeekday in Working_Day then               -- check of a subtype of an enumeration
      Put_Line ( " to work for " &
               Working_Hours'Image (Work_Load(aWeekday)) ); -- access into a lookup table
   end if;
end loop;

Pakunki, procedury i funkcje

Wśród części programu Ada to pakiety, procedury i funkcje.

Przykład: opis pakietu (example.ads)

package Example is
     type Number is range 1 .. 11;
     procedure Print_and_Increment (j: in out Number);
end Example;

Ciało pakiet (example.adb)

with Ada.Text_IO;
package body Example is

  i : Number := Number'First;

  procedure Print_and_Increment (j: in out Number) is

    function Next (k: in Number) return Number is
    begin
      return k + 1;
    end Next;

  begin
    Ada.Text_IO.Put_Line ( "The total is: " & Number'Image(j) );
    j := Next (j);
  end Print_and_Increment;

-- package initialization executed when the package is elaborated
begin
  while i < Number'Last loop
    Print_and_Increment (i);
  end loop;
end Example;

Ten program może być zestawiane, na przykład, za pomocą swobodnie dostępne open source kompilator gnat , wykonując

gnatmake -z example.adb

Pakunki, procedury i funkcje mogą zagnieździć na każdej głębokości i każda może być także blok logiczny peryferyjnych.

Każdy pakiet, procedura lub funkcja może mieć własne deklaracje stałych, typów, zmiennych i innych procedur, funkcji i pakietów, które mogą być zadeklarowane w dowolnej kolejności.

Konkurencja

Ada ma wsparcie językowe dla współbieżności zadaniowego. Podstawową jednostką współbieżne w Ada to zadanie , które jest wbudowane w ograniczony typ. Zadania określone są w dwóch częściach - deklaracja zadanie definiuje interfejs zadań (podobny do deklaracji typu), ciało zadanie określa realizację zadania. W zależności od wykonania zadania Ada albo są odwzorowywane na wątków lub procesów systemu operacyjnego, czy planowane są wewnętrznie przez program Ady.

Zadania mogą mieć wpisy dla synchronizacji (forma synchronicznego Message Passing ). Zadanie wpisy są deklarowane w opisie zadań. Każdy wpis Zadanie może mieć jeden lub więcej przyjmować deklaracje wewnątrz ciała zadań. Jeśli przepływ sterowania zadania osiąga oświadczenie przyjąć, zadanie jest zablokowane, dopóki odpowiedni wpis nazywany jest przez innego zadania (podobnie, zadanie wywołujący jest blokowany do momentu nazywany zadaniem osiągnie odpowiedni zaakceptować oświadczenie). Wpisy zadanie może mieć parametry podobne do procedur, dzięki czemu zadania synchronicznie wymieniać dane. W połączeniu z wybranymi sprawozdań możliwe jest zdefiniowanie strażników Accept sprawozdania (podobnych do Dijkstry strzeżonych poleceń ).

Ada oferuje również obiektów chronionych dla wzajemnego wykluczania . Obiekty chronione są monitora jak konstrukcja, ale zamiast używać osłony zmiennych warunkowych dla sygnalizacji (podobnie warunkowego regionów krytycznych). Chronione obiekty łączą enkapsulacji danych i bezpiecznego wzajemnego wykluczenia z monitorami i strażników wpis z warunkowych regionów krytycznych. Główną zaletą w stosunku do klasycznych monitorów jest to, że zmienne warunkowe nie są wymagane dla sygnalizacji, unikając potencjalnych zakleszczenia na skutek nieprawidłowego semantyki blokujących. Jak zadań, chroniony obiekt jest wbudowany ograniczony typ, i ma też część deklaracji i ciało.

Chroniony obiekt składa kapsułkowanych prywatnych danych (które są dostępne tylko od wewnątrz chronionego obiektu) i procedur, funkcji i pozycji, które są gwarantowane się wykluczać (z jednym wyjątkiem funkcji, które muszą być skutkiem ubocznym wolne i dlatego może działać równocześnie z innymi funkcjami). Zadanie wywołanie chroniony obiekt jest zablokowany, jeśli inny zadanie jest aktualnie wykonywany wewnątrz samego obiektu chronionego, a wydany gdy inne zadanie opuszcza chroniony obiekt. Zablokowane zadania w kolejce na chronionym obiekcie zlecenie godzinie przyjazdu.

Chronione wpisy obiektów są podobne do procedur, ale dodatkowo ma strażników . Jeśli strażnik ma wartość false, zadanie wywołujący jest zablokowane i dodawane do kolejki tego wpisu; teraz kolejne zadanie może być dopuszczone do chronionego obiektu, a nie zadanie jest aktualnie wykonywany wewnątrz chronionego obiektu. Strażnicy są ponownie ocenić, kiedy zadanie pozostawia chronionego obiektu, ponieważ jest to jedyny czas, kiedy ocena strażników może się zmienić.

Rozmowy do wpisów można requeued do innych wpisów z tym samym podpisem. Zadanie to jest requeued jest zablokowany i dodawane do kolejki wejścia docelowej; Oznacza to, że chroniony obiekt zostaje zwolniony i umożliwia przyjęcie innego zadania.

Wybierz oświadczenie w Ada mogą być wykorzystane do realizacji bez blokowania połączeń wejścia i przyjmuje niedeterministyczne Wybór wpisów (również ze strażników), czas-out i przerywa.

Poniższy przykład ilustruje pewne koncepcje programowania współbieżnego w Ada.

with Ada.Text_IO; use Ada.Text_IO;

procedure Traffic is

   type Airplane_ID is range 1..10;             -- 10 airplanes

   task type Airplane (ID: Airplane_ID);        -- task representing airplanes, with ID as initialisation parameter
   type Airplane_Access is access Airplane;     -- reference type to Airplane

   protected type Runway is                     -- the shared runway (protected to allow concurrent access)
      entry Assign_Aircraft (ID: Airplane_ID);  -- all entries are guaranteed mutually exclusive
      entry Cleared_Runway (ID: Airplane_ID);
      entry Wait_For_Clear;
   private
      Clear: Boolean := True;                   -- protected private data - generally more than just a flag...
   end Runway;
   type Runway_Access is access all Runway;

   -- the air traffic controller task takes requests for takeoff and landing
   task type Controller (My_Runway: Runway_Access) is
      -- task entries for synchronous message passing
      entry Request_Takeoff (ID: in Airplane_ID; Takeoff: out Runway_Access);
      entry Request_Approach(ID: in Airplane_ID; Approach: out Runway_Access);
   end Controller;

   --  allocation of instances
   Runway1    : aliased Runway;              -- instantiate a runway
   Controller1: Controller (Runway1'Access); -- and a controller to manage it

   ------ the implementations of the above types ------
   protected body Runway is
      entry Assign_Aircraft (ID: Airplane_ID)
 when Clear is   -- the entry guard - calling tasks are blocked until the condition is true
      begin
       Clear := False;
       Put_Line (Airplane_ID'Image (ID) & " on runway ");
      end;

      entry Cleared_Runway (ID: Airplane_ID)
 when not Clear is
      begin
         Clear := True;
         Put_Line (Airplane_ID'Image (ID) & " cleared runway ");
      end;

      entry Wait_For_Clear
 when Clear is
      begin
         null;      -- no need to do anything here - a task can only enter if "Clear" is true
      end;
   end Runway;

   task body Controller is
   begin
      loop
         My_Runway.Wait_For_Clear;   -- wait until runway is available (blocking call)
         select                      -- wait for two types of requests (whichever is runnable first)
            when Request_Approach'count = 0 =>  -- guard statement - only accept if there are no tasks queuing on Request_Approach
             accept Request_Takeoff (ID: in Airplane_ID; Takeoff: out Runway_Access)
             do                                 -- start of synchronized part
               My_Runway.Assign_Aircraft (ID);  -- reserve runway (potentially blocking call if protected object busy or entry guard false)
               Takeoff := My_Runway;            -- assign "out" parameter value to tell airplane which runway
             end Request_Takeoff;               -- end of the synchronised part
         or
            accept Request_Approach (ID: in Airplane_ID; Approach: out Runway_Access) do
               My_Runway.Assign_Aircraft (ID);
               Approach := My_Runway;
            end Request_Approach;
         or                          -- terminate if no tasks left who could call
            terminate;
         end select;
      end loop;
   end;

   task body Airplane is
      Rwy : Runway_Access;
   begin
      Controller1.Request_Takeoff (ID, Rwy); -- This call blocks until Controller task accepts and completes the accept block
      Put_Line (Airplane_ID'Image (ID) & "  taking off...");
      delay 2.0;
      Rwy.Cleared_Runway (ID);               -- call will not block as "Clear" in Rwy is now false and no other tasks should be inside protected object
      delay 5.0; -- fly around a bit...
      loop
         select   -- try to request a runway
            Controller1.Request_Approach (ID, Rwy); -- this is a blocking call - will run on controller reaching accept block and return on completion
            exit; -- if call returned we're clear for landing - leave select block and proceed...
         or
            delay 3.0;  -- timeout - if no answer in 3 seconds, do something else (everything in following block)
            Put_Line (Airplane_ID'Image (ID) & "   in holding pattern");  -- simply print a message
         end select;
      end loop;
      delay 4.0;  -- do landing approach...
      Put_Line (Airplane_ID'Image (ID) & "            touched down!");
      Rwy.Cleared_Runway (ID);  -- notify runway that we're done here.
   end;

   New_Airplane: Airplane_Access;

begin
   for I in Airplane_ID'Range loop  -- create a few airplane tasks
      New_Airplane := new Airplane (I); -- will start running directly after creation
      delay 4.0;
   end loop;
end Traffic;

pragma

Pragma jest dyrektywa kompilator , który przekazuje informacje do kompilatora, aby umożliwić specyficzną manipulację skompilowanej wyjścia. Pewne pragma są wbudowane w języku, podczas gdy inne są specyficzne dla implementacji.

Przykłady typowych wykorzystaniem pragma kompilatora byłoby wyłączyć określone funkcje, takich jak kontrola typu run-czasowego lub tablicy indeksem kontroli granicznej, albo instruuje kompilator wstawiania kodu obiektowego zamiast wywołania funkcji (w C / C ++ robi z inline Funkcje).

Zobacz też

  • APSE - specyfikację dla środowiska programowania, aby wspierać rozwój oprogramowania w Ada
  • Profil Ravenscar - podzbiór funkcji wielozadaniowości Ada zaprojektowanych dla bezpieczeństwa krytycznych dysku komputerów w czasie rzeczywistym
  • SPARK (język programowania) - język programowania, składający się z bardzo ograniczonego podzbioru Ady, opatrzone meta informacje opisujące pożądane zachowanie komponentu i indywidualne wymagania wykonawcze

Referencje

Międzynarodowe standardy

Racjonalne uzasadnienie

(Dokumenty te zostały opublikowane w różnych formach, w tym druku).

Książki

Archiwa

  • Język programowania Ada Materiały 1981/90 . Charles Babbage Institute , University of Minnesota. Obejmuje literaturę na temat produktów oprogramowania przeznaczonych dla języka Ada; Publikacje rządu USA, w tym Ada 9X raportów projektowych, raportów technicznych, dokumentów roboczych, biuletyny; i informacje o grupie użytkownika.

Linki zewnętrzne