Sytuacja kobiet w IT w 2024 roku
31.07.20197 min
Maciej Sobczak
EDC - Engineering Design Center

Maciej SobczakSenior EngineerEDC - Engineering Design Center

Nie tylko C, C++ i Java – poznajcie Adę

Ada to język niezwykle przydatny w systemach krytycznych, w świecie lotnictwa i kosmonautyki. Przyjrzyjmy się językowi Ada, jego ciekawej historii oraz unikalnym właściwościom.

Nie tylko C, C++ i Java – poznajcie Adę

Przeglądając oferty pracy dla programistów można odnieść wrażenie, że język Ada przeszedł do lamusa. W rzeczywistości jest on wciąż w użyciu w kilku ważnych ośrodkach w Polsce. Osoby interesujące się branżą lotniczą czy kosmiczną w szczególności powinny rozważyć poszerzenie swoich programistycznych horyzontów. Jednak na poznaniu Ady mogą skorzystać nawet osoby, które nie planują aktywnie używać tego języka. Co sprawia, że Ada jest tak wyjątkowa? 

W połowie czerwca tego roku w Sieci Badawczej Łuksiewicz - Instytucie Lotnictwa miała miejsce konferencja Ada-Europe 2019. Jest to cykliczna konferencja, organizowana co roku w innym miejscu Europy. To czas, kiedy eksperci i miłośnicy języka programowania Ada, a także osoby zainteresowane tworzeniem niezawodnych systemów spotykają się, aby odświeżyć branżowe znajomości i wiedzę o rozwoju tej technologii.

W Polsce branża systemów krytycznych wciąż jest stosunkowo niewielka. Na rynku dominują inne języki programowania, dlatego też taka konferencja jest doskonałą okazją do zaprezentowania języka Ada potencjalnym nowym użytkownikom. 

Niektórym programistom Ada kojarzy się z czymś przestarzałym i niewartym uwagi. Jest ona jednak językiem młodszym od najpopularniejszego w świecie systemów wbudowanych języka C, a jako standard ISO rozwija się w rytmie podobnym do języka C++. Okazuje się też, że w dziedzinach takich jak lotnictwo, udział Ady w projektach programistycznych jest porównywalny z językiem C. Te dwa języki tworzą trzon rozwiązań technicznych w systemach tworzonych dla lotnictwa i kosmonautyki. Jest to jeden z powodów, dla których w Engineering Design Center, będącym wspólnym przedsięwzięciem Sieci Badawczej Łukasiewicz - Instytutu Lotnictwa i General Electric Company Polska, staramy się utrzymywać i rozwijać kompetencje w tej dziedzinie.

Czym jest Ada?

Ada to język programowania, stworzony na początku lat 80. na zlecenie Departamentu Obrony USA, gdy postanowiono uporządkować ówczesne projekty angażujące nawet 400 różnych języków. Stworzono wtedy precyzyjne kryteria dotyczące tego, jakie cechy ma posiadać idealny nowy język - z naciskiem na niezawodność, odporność na błędy programistyczne, czytelność kodu i wsparcie dla bardzo dużych i długoterminowych projektów. Te wymagania narzuciły styl pracy nad nowym językiem i znacząco wpłynęły na całą dalszą kulturę jego rozwoju i użycia. Ada jest dzisiaj jednym z niewielu języków, które powstały w wyniku konkursu - spisane kryteria zostały opublikowane, a kilka zespołów projektowych z różnych ośrodków przystąpiło do pracy. Jej efektem było wyłonienie propozycji, która wśród całej grupy najlepiej spełniała zdefiniowane początkowo oczekiwania. Zwycięski język programowania nazwano Ada - od imienia Ady Lovelace, która w historii matematyki i informatyki wsławiła się jako "pierwsza programistka", dzięki swojemu wizjonerskiemu potraktowaniu mechanicznej maszyny analitycznej zbudowanej przez jej mentora, Charlesa Babbage'a.

Ada została oparta o istniejącą już tradycję składniową języka Algol i w tym sensie należy do tej samej rodziny, co późniejsze języki Pascal i Modula. Różni się od popularnych dzisiaj "klamerkowców" właśnie bardziej "słownym" wyglądem, gdzie wiele elementów składniowych to czytelne słowa języka angielskiego. Nawet najprostszy, tradycyjny program Hello World w Adzie prezentuje główne założenia co do czytelności kodu źródłowego:

    with Ada.Text_IO;

    procedure Hello is

    begin

       Ada.Text_IO.Put_Line ("Hello, world!");

    end Hello;


Programiści popularnych dzisiaj C, C++ lub Javy natychmiast zauważą słowa "begin" i "end" tam, gdzie na codzień użyliby nawiasów klamrowych. Szybko zauważą też rozróżnienie między procedurami i funkcjami - procedury nie zwracają wartości tak jak właśnie najprostsze Hello. W miarę poznawania języka okaże się też, że chociaż zmusza nas on do napisania nieco większej ilości tekstu niż w przypadku innych języków, to procentuje to później podczas sprawdzania jego poprawności. Kod programu jest bardziej czytelny i precyzyjniej opisuje oczekiwania programisty.

Precyzję zapisu, a także w konsekwencji większą odporność na błędy programisty, znajdziemy też w rozbudowanym systemie typów, który pozwala nie tylko odróżnić od siebie przysłowiowe "jabłka od pomarańczy", ale przede wszystkim wyrazić spodziewane poprawne wartości dla różnych typów danych:

    type Index_Range is 1 .. 100;


Tak zdefiniowany Index_Range jest typem całkowitym, najprawdopodobniej zrealizowanym jako słowo maszynowe o naturalnym dla docelowego procesora rozmiarze - czyli czymś, do czego programista C lub Javy użyłby od razu typu int. Różnica polega jednak na tym, że w Adzie programista mógł wyrazić swoje oczekiwanie, że właściwymi wartościami tego typu są tylko liczby od 1 do 100. Kompilator użyje tej informacji, generując kod sprawdzający operacje arytmetyczne lub dostępu do tablicy, zapobiegając w ten sposób błędom, takim jak przepełnienie arytmetyczne lub dostęp do nieistniejących komórek tablicy. W wielu przypadkach kompilator może wykonać odpowiednią weryfikację statycznie (istnieją też dodatkowe narzędzia do takich celów) i od razu wskazać programiście jego pomyłkę - w pozostałych kompilator automatycznie wstawi do programu odpowiednie warunki, które w razie ich niespełnienia spowodują przerwanie wykonania programu i rzucenie wyjątku. Dzięki temu nie jest możliwe powstawanie takich błędów jak np. buffer overflow.

W powyższym przykładzie widać też nacisk na poprawne modelowanie dziedziny problemu, w przeciwieństwie do koncentracji na niskopoziomowych parametrach platformy docelowej. Tam, gdzie programista C samodzielnie wybiera np. typ całkowity o odpowiednim rozmiarze, tam programista Ady skupi się na modelowaniu problemu. W Adzie nie ma znaczenia, ile bitów ma jakaś wartość - znaczenie ma, jaki jest zakres wartości poprawnych w danym zastosowaniu. Programowanie na tym poziomie abstrakcji sprzyja czytelności i konsekwentnie pozwala uniknąć wielu problemów typowych dla języków, które kierują uwagę programisty w stronę sprzętu zamiast w stronę rozwiązywanego problemu.

W tym miejscu można zwrócić uwagę na potencjalną rozbieżność celów - z jednej strony, język powstał w kontekście potrzeb systemów wbudowanych, które kojarzą się właśnie z programowaniem niskopoziomowym; z drugiej strony, język promuje wysokopoziomowe modelowanie problemu zamiast pracy na poziomie bitów i bajtów. Nie ma w tym żadnej sprzeczności - wszystkie mechanizmy, które mogą być potencjalnie potrzebne w programowaniu systemów wbudowanych, takie jak przerwania, swobodny dostęp do rejestrów, czy możliwość pracy na poziomie bitów, są dostępne. W odróżnieniu jednak od języka C, niskopoziomowe mechanizmy nigdy nie mogą być użyte przez przypadek i wymagają od programisty czytelnego wyrażenia swoich intencji. Dzięki temu wysokopoziomowy charakter Ady nie tylko nie jest przeszkodą w korzystaniu z niskopoziomowych funkcji udostępnianych przez docelowy procesor, ale zmusza programistę do korzystania z tych funkcji w sposób bezpieczny i łatwy w weryfikacji.

Przez bogaty system typów oraz bardzo ścisłe reguły języka dotyczące np. konwersji danych, Ada może sprawiać wrażenie języka bardzo rygorystycznego, a kompilator często uznany jest za "czepialski". Istotnie, jednym z pierwszych doświadczeń w nauce Ady jest dostrzegany "opór" kompilatora przed kompilacją spontanicznie pisanego kodu. Programiści opowiadający swoje historie często wspominają, że początkowo traktowali kompilator jako wroga, który robi wszystko, co może, żeby utrudnić napisanie programu. Po jakimś czasie okazywało się jednak, że zwykle kompilator był "czepialski" nie bez przyczyny, a zgłaszane przez niego problemy były realnymi niedopowiedzeniami lub wręcz jawnymi błędami programisty - często takimi, które mogły być niezauważone przez kompilatory innych, mniej rygorystycznych języków. Zwykle był to też moment, w którym programista dostrzegał, że rygor języka i kompilatora są jego sprzymierzeńcami - ostatecznie, lepiej wykryć błąd wcześniej, niż np. w trakcie testów albo, w najgorszym przypadku, w trakcie użytkowania programu. Ada przez swój rygor ułatwia wczesne wykrywanie problemów, a przez to sprawia, że są one łatwiejsze (i znacznie tańsze!) do poprawienia.

Poza różnicami składniowymi i wynikającymi z obecności bogatego systemu typów, Ada mieści się w tej samej kategorii języków programowania co C lub C++. Oznacza to, że jest językiem imperatywnym, gdzie programista tworzy program w oparciu o pętle, warunki, zmienne, funkcje (i procedury) itp. Dostępne są również metody obiektowe (dynamiczny polimorfizm), generyki, wsparcie dla współbieżności, kontrakty, oraz dojrzały system pakietów pozwalający zarządzać fizyczną architekturą kodu w większej skali. Oznacza to, że nauka Ady jest relatywnie łatwa dla osób, które już znają jeden z imperatywnych języków takich jak C, Java czy też Python.

Czy warto uczyć się Ady?

Zdecydowanie tak. Pomimo faktu, że nie można potwierdzić takiej potrzeby przeglądając oferty pracy dla programistów na polskim rynku, Ada jest w użyciu w kilku ośrodkach w Polsce. W szczególności, osoby interesujące się branżą lotniczą lub kosmiczną powinny rozważyć Adę jako tzw. "nice to have" na liście swoich kompetencji, gdyż projekty prowadzone w tych branżach z dużym prawdopodobieństwem oparte są właśnie na tym języku. Interesujące może być pytanie, dlaczego pracodawcy w tej branży jawnie nie stawiają takich wymagań w swoich ogłoszeniach. Otóż wynika to ze zrozumienia, że popularność Ady w innych dziedzinach jest na tyle mała, że takie wymaganie właściwie uniemożliwiłoby znalezienie kandydatów do pracy. Tymczasem Ada jest na tyle umocowana w paradygmacie imperatywnym, że można szybko wyszkolić programistę znającego już np. język C do poziomu, w którym będzie mógł skutecznie uczestniczyć w projekcie. To doświadczenie jest powszechne i często potwierdzane przez firmy działające w branży systemów krytycznych.

Nauka Ady może być też użyteczna w celu poszerzenia swoich programistycznych horyzontów - nawet wtedy, gdy nie planujemy aktywnie tego języka używać. Wynika to z faktu, że idiomy Ady sprzyjają czytelności i niezawodności, ale nie są ograniczone tylko do tego języka i mogą nakierować programistę na korzystniejsze rozwiązania również w innych językach.

W środowisku Ady istnieje powiedzenie: dobry programista potrafi pisać w Adzie w każdym języku. I to jest właśnie powód, dla którego warto Adę poznać bliżej.

Warto zwrócić też uwagę na fakt, że środowisko inżynierów skupionych wokół Ady jest miejscem ciekawych prac w pokrewnych dziedzinach związanych z systemami krytycznymi. Jednym z ciekawszych produktów, które rozwinęły się w tym środowisku, jest język SPARK - jest to język programowania, który jeszcze bardziej kładzie nacisk na zdolność do statycznego (tzn. przed uruchomieniem) wykrywania błędów, docelowo całkowicie eliminując tzw. zachowania niezdefiniowane z fazy wykonania programu. Dzięki włączeniu metod formalnych do zestawu narzędzi SPARKa, programiści mają potężne narzędzie do tworzenia systemów, którym stawia się najwyższe wymagania jakościowe.

Jako punkt startowy przygody z Adą proponuję stronę Ada Information Clearinghouse, która zbiera w jednym miejscu znaczne zasoby oraz linki do innych stron na ten temat.

<p>Loading...</p>