Ada
Ada to język programowania, który łączy cechy strukturalne, kompilowane, imperatywne, statycznie typowane oraz obiektowe. Został opracowany przez Jean Ichbiaha oraz zespół z CII Honeywell Bull w latach 70. XX wieku. Język ten zdobył pierwsze miejsce w konkursie zorganizowanym przez Departament Obrony USA (U.S. Department of Defense – DoD), pokonując 19 innych propozycji. Jego nazwa, nadana przez DoD, pochodzi od lady Augusty Ady Lovelace.
Historia
W latach 70. Departament Obrony USA zauważył problem związany z używaniem zbyt wielu różnych języków programowania do realizacji wewnętrznych projektów informatycznych dla systemów wbudowanych. Wiele z tych języków było przestarzałych lub zbyt silnie związanych ze sprzętem, a żaden z nich nie wspierał bezpiecznego programowania modułowego. W 1975 roku powołano grupę roboczą High Order Language Working Group (HOLWG), której celem było ograniczenie liczby używanych narzędzi lub stworzenie nowego języka programowania, który spełniałby wymagania wszystkich projektów. W wyniku działań grupy powstał język Ada, a liczba używanych języków spadła z ponad 450 w 1983 roku do 37 w 1996 roku.
Grupa robocza HOLWG rozpoczęła prace od publikacji Wymagań językowych Steelmana (ang. Steelman Language Requirements), serii dokumentów określających wymagania, jakie powinny spełniać języki programowania. Następnie przeprowadzono formalną weryfikację wielu istniejących języków, jednak w 1977 roku stwierdzono, że wszystkie mają poważne wady uniemożliwiające ich użycie. W związku z tym ogłoszono konkurs na stworzenie nowego języka, zapraszając cztery zespoły oznaczone kolorami:
- Czerwony (Intermetrics, kierowany przez Benjamina Brosgola),
- Zielony (CII Honeywell Bull, prowadzony przez Jeana Ichbiaha),
- Niebieski (SofTech, pod przewodnictwem Johna Goodenough),
- Żółty (SRI International, kierowany przez Jaya Spitzena).
W kwietniu 1978 roku, po publicznych badaniach, propozycje zespołów czerwonego i zielonego przeszły do kolejnej fazy. Rok później ostateczne zwycięstwo przyznano koncepcji zielonej opracowanej przez CII Honeywell Bull, która otrzymała nazwę Ada na cześć lady Augusty Ady Lovelace. Zwycięska propozycja czerpała inspiracje z języka LIS, opracowanego przez Ichbiaha i jego grupę w latach 70. Pierwsze wydanie dokumentacji języka Ada ukazało się w ACM SIGPLAN Notices w czerwcu 1979 roku, a dokumentacja standardu wojskowego została zatwierdzona 10 grudnia 1980 roku (urodziny Ady Lovelace) pod numerem MIL-STD-1815.
W 1981 roku C.A.R. Hoare skrytykował Adę, określając ją jako język zbyt skomplikowany i przez to zawodny, jednak później prawdopodobnie zmienił zdanie, co wyraził w przedmowie do podręcznika dotyczącego Ady.
Pojawienie się Ady wzbudziło duże zainteresowanie wśród programistów w pierwszych latach jej istnienia. Wśród zwolenników pojawiały się opinie, że może ona stać się dominującym językiem programowania ogólnego przeznaczenia. Jean Ichbiah publicznie stwierdził, że w ciągu 10 lat na rynku pozostaną jedynie dwa języki: Ada i Lisp. Wczesne kompilatory Ady miały trudności z implementacją tego złożonego języka, a wydajność generowanego kodu oraz procesu kompilacji, jak również jakość narzędzi, pozostawiały wiele do życzenia. Twórcy kompilatorów skupili się na uzyskaniu certyfikacji ACVC, wymaganej przez agencje rządowe. Pierwszą certyfikowaną implementacją Ady był translator NYU Ada/Ed, który uzyskał ten status 11 kwietnia 1983 roku, zaimplementowany w wysokopoziomowym języku SETL.
W 1987 roku Departament Obrony USA wydał zarządzenie nakładające obowiązek stosowania Ady w każdym projekcie programistycznym, w którym nowy kod stanowił ponad 30% całości, jednak często dopuszczano wyjątki. Reguła ta została zniesiona 10 lat później.
W latach 80. i 90. poprawiono jakość i wydajność kompilatorów Ady, jednak nadal występowały istotne problemy związane z pełnym wykorzystaniem możliwości języka. Jednym z nich był zaproponowany model wielozadaniowości, który odbiegał od dotychczasowych rozwiązań znanych programistom. Dzięki kluczowym mechanizmom bezpieczeństwa, Ada jest obecnie wykorzystywana nie tylko w aplikacjach wojskowych, ale także w projektach komercyjnych, gdzie błędy programistyczne mogą prowadzić do poważnych konsekwencji. Przykłady zastosowań obejmują kontrolę lotów, awionikę samolotów, satelity, automatyczne systemy transportowe oraz bankowość. Na przykład, oprogramowanie systemu Fly-by-wire w samolocie Boeing 777 zostało w całości napisane w Adzie.
Pochodne i rozszerzenia
Ada++ to jedno z proponowanych rozszerzeń standardu Ada83, które wspiera paradygmat programowania obiektowego. Straciło na znaczeniu po opublikowaniu standardu Ada95, który już wspierał ten paradygmat.
Ada# (w budowie)
Właściwości
Ada jest językiem programowania ogólnego przeznaczenia, który obsługuje wiele paradygmatów. Jego składnia została zaprojektowana z myślą o zminimalizowaniu ryzyka popełnienia trudnych do wykrycia błędów. Osiągnięto to dzięki przemyślanemu doborowi składni oraz jednoznaczności jej elementów.
Wśród kluczowych właściwości języka można wymienić:
- bezpieczny, ścisły system typów, skoncentrowany na semantyce, a nie na fizycznej reprezentacji danych,
- wsparcie dla programowania obiektowego,
- zaawansowany mechanizm pakietów i modułów,
- wsparcie dla zaawansowanych modeli współbieżności,
- mechanizmy zarządzania pamięcią,
- wsparcie dla programowania kontraktowego,
- ustandaryzowane interfejsy do integracji kodu Ady z językami C, C++, FORTRAN oraz COBOL.
Standaryzacja
Język Ada został uznany za standard ANSI w 1983 roku (ANSI/MIL-STD 1815A), a następnie w 1987 roku stał się standardem ISO (ISO-8652:1987) bez dodatkowych modyfikacji. Ustandaryzowana wersja języka jest powszechnie określana jako Ada 83 lub Ada 87, w zależności od daty ogłoszenia standardu.
Wspólny standard ANSI/ISO, Ada 95 (ISO-8652:1995), został opublikowany w lutym 1995 roku, co uczyniło Adę pierwszym obiektowo zorientowanym, ustandaryzowanym językiem programowania. Aby wspierać rozwój i przyjęcie standardu, US Air Force sfinansowało prace nad kompilatorem GNAT, który obecnie jest częścią pakietu GNU Compiler Collection.
Prace nad standaryzacją Ady są kontynuowane. W październiku 2001 roku opublikowano techniczną erratę do standardu Ada 95, a w 2007 roku – pierwszą znaczącą poprawkę ISO/IEC 8652:1995/Amd 1:2007. Nowy, zaktualizowany tekst standardu ukazał się 9 marca 2007 roku. Ostatnia rewizja została wydana w grudniu 2012 roku (ISO/IEC 8652:2012 Ed. 3).
Przykłady
Poniżej znajduje się prosty przykład kodu w Adzie (funkcja Ackermanna), który demonstruje kilka jej cech.
Program musi być zapisany w pliku „ackermann.adb” (wielkość liter nie ma znaczenia).
Można zauważyć, że:
- Wszystkie nazwy są nieczułe na wielkość liter.
- Cały program to jedna duża procedura, która może zawierać podprocedury (w tym przypadku funkcję ack).
- Wszystkie zamknięcia oznaczane są przez end co_zamykamy, co pozwala uniknąć przypadkowych pomyłek, ale wielu programistów uważa to za nadmiarowe.
- Przypisanie zapisuje się jako „:=”, natomiast porównanie jako „=”. Argumentuje się to tym, że w C zdarzają się pomyłki polegające na użyciu „=” zamiast „==”.
- Nie istnieje odpowiednik funkcji printf, uznawanej za niebezpieczną. Chociaż funkcje Put i New_Line (z modułu Gnat.Io) są bezpieczniejsze, to jednak są niewygodne w użyciu.
- „elseif” pisze się łącznie, a nie oddzielnie jak w C, co jest pewnym udogodnieniem stosowanym w wielu nowoczesnych językach.
- Składnia atrybutów to obiekt’atrybut (lub klasa’atrybut), w przeciwieństwie do bardziej tradycyjnych selekcji „. czy „::”.
- Rzutowania przeprowadza się za pomocą składni Klasa’Value(wartość). To znaczące ulepszenie w porównaniu do C++, gdzie (klasa)wartość prowadzi do niepewnej kolejności wykonywania działań i często w większych wyrażeniach zapisywane jest jako ((klasa)(wartość)).
- W Adzie występuje rozróżnienie między „procedurami” (w nomenklaturze C: funkcje niezwrotne) a „funkcjami” (w nomenklaturze C: funkcje zwracające wartość). Większość współczesnych języków nie wprowadza tego rozróżnienia.
Wartościowanie leniwe
Operatorami short circuit nazywamy te, które nie są obliczane, jeśli nie jest to konieczne. Inną nazwą tego rodzaju jest wartościowanie leniwe.
W Adzie występują następujące konstrukcje:
- A or B
Obliczane jest A. Jeśli A jest prawdziwe, obliczane jest B. Niezależnie od wyniku B, wynik wyrażenia to „prawda”. Jeśli A jest fałszywe, obliczane jest B. Jeśli B jest prawdziwe, wynik to „prawda”, w przeciwnym razie „fałsz”. - A or else B
Obliczane jest A. Jeśli A jest prawdziwe, wynik to „prawda”, a B nie jest obliczane. Jeśli A jest fałszywe, obliczane jest B. Jeśli B jest prawdziwe, wynik to „prawda”, w przeciwnym razie „fałsz”. - A and B
Obliczane jest A. Jeśli A jest prawdziwe, obliczane jest B. Jeśli B jest prawdziwe, wynik to „prawda”, w przeciwnym razie „fałsz”. Jeśli A jest fałszywe, obliczane jest B, ale niezależnie od wyniku B, wynik wyrażenia to fałsz. - A and then B
Obliczane jest A. Jeśli A jest prawdziwe, obliczane jest B. Jeśli B jest prawdziwe, wynik to „prawda”, w przeciwnym razie „fałsz”. Jeśli A jest fałszywe, wynik to „fałsz”, a B nie jest obliczane.
Przykład („short_circuit.adb”):
W przykładzie widać również użycie podwójnego znaku „” do zaznaczenia ” w łańcuchu. Umożliwia to ominięcie skomplikowanych i podatnych na błędy zasad escape’owania znaków. W C taka składnia byłaby niemożliwa, ponieważ C pozwala na zapisanie „łańcuch 1” „łańcuch 2” (z rozdzielającymi spacjami lub bez), co oznacza to samo co „łańcuch 1łańcuch 2” i jest przydatne w preprocessingu.
Oto przykład programu, który wyświetla zawartość plików na ekranie. Program przyjmuje nazwy plików jako argumenty z linii poleceń. W przypadku podania błędnej nazwy wzniesie flagę błędu.
Program korzysta z biblioteki Ada.Command_Line, która służy do obsługi linii poleceń.