Ada (gjuhë programimi)

**Ada** është një gjuhë programimi e nivelit të lartë e strukturuar, e shtypur në mënyrë statike, e domosdoshme dhe e orientuar nga objekti, e frymëzuar nga Pascal dhe gjuhët e tjera programuese. Ka mbështetje të integruar gjuhësore për *dizajn me kontratë* (DbC), shtypje jashtëzakonisht të fortë, njëkohësi të qartë, detyra, kalim sinkron të mesazheve, objekte të mbrojtura dhe jo-determinizëm . Ada përmirëson sigurinë dhe mirëmbajtjen e kodit duke përdorur përpiluesin për të gjetur gabime në favor të gabimeve të kohës së ekzekutimit . Ada është një standard teknik ndërkombëtar, i përcaktuar bashkërisht nga Organizata Ndërkombëtare për Standardizim (ISO) dhe Komisioni Ndërkombëtar Elektroteknik (IEC). , standardi, i quajtur Ada 2022 joformalisht, është ISO/IEC 8652:2023.  Ada u emërua pas Ada Lovelace (1815-1852), e cila është vlerësuar si programuesja e parë kompjuterike. 

## Veçoritë 
Ada fillimisht u krijua për sisteme të integruara dhe në kohë reale . Rishikimi i Ada 95, i projektuar nga S. Tucker Taft i Intermetrics midis 1992 dhe 1995, përmirësoi mbështetjen për sistemet, programimin numerik, financiar dhe të orientuar drejt objekteve (OOP).

Veçoritë e Ada përfshijnë: shtypjen e fortë, mekanizmat e programimit modular (paketat), kontrollimin e kohës së ekzekutimit, përpunimin paralel ( detyrat, kalimin njëkohësisht i mesazheve, objektet e mbrojtura dhe deklaratat e përzgjedhjes jo-përcaktuese), trajtimin e përjashtimeve dhe gjenerikët . Ada&nbsp;95 shtoi mbështetje për programimin e orientuar nga objekti, duke përfshirë dërgimin dinamik .

Sintaksa e Ada minimizon zgjedhjet e mënyrave për të kryer operacionet bazë dhe preferon fjalë kyçe angleze (të tilla si "or else" dhe "and then") në vend të simboleve (të tilla si "||" dhe "&&"). Ada përdor operatorët bazë aritmetikë "+", "-", "*" dhe "/", por shmang përdorimin e simboleve të tjera. Blloqet e kodit kufizohen me fjalë të tilla si "declare" - (deklaro), "begin" - (fillo) dhe "end" - (mbaro), ku "end" (në shumicën e rasteve) pasohet nga identifikuesi i bllokut që mbyllet (p.sh., if *... end if*, loop *... end loop* ). Në rastin e blloqeve të kushtëzuara, kjo shmang një *else të varur* që mund të lidhet me shprehjen e gabuar të mbivendosur if në gjuhë të tjera si C ose Java.

Ada është dizajnuar për zhvillimin e sistemeve softuerike shumë të mëdha. Paketat Ada mund të përpilohen veçmas. Specifikimet e paketës Ada (ndërfaqja e paketës) gjithashtu mund të përpilohen veçmas pa implementim për të kontrolluar konsistencën. Kjo bën të mundur zbulimin e problemeve herët gjatë fazës së dizajnimit përpara fillimit të zbatimit.

Një numër i madh kontrollesh gjatë kohës së përpilimit mbështeten për të ndihmuar në shmangien e gabimeve që nuk do të zbuloheshin deri në kohën e ekzekutimit në disa gjuhë të tjera ose do të kërkonin shtimin e kontrolleve të posaçme në kodin burimor. Për shembull, sintaksa kërkon mbylljen e blloqeve me emër të qartë për të parandaluar gabimet për shkak të mospërputhjes së argumenteve fundore. Përmbushja e tipizimit të fortë lejon zbulimin e shumë gabimeve të zakonshme të softuerit (parametra të gabuar, shkelje të diapazonit, referenca të pavlefshme, mospërputhje të tipeve, etj.) qoftë gjatë kohës së përpilimit ose përndryshe gjatë kohës së ekzekutimit. Meqenëse ndërkohësia është pjesë e specifikimit të gjuhës, përpiluesi në disa raste mund të zbulojë bllokime të mundshme - deadlocks.  Përpiluesit gjithashtu zakonisht kontrollojnë për identifikues të shkruar gabimisht, dukshmërinë e paketave, deklaratat e tepërta, etj. dhe mund të japin paralajmërime dhe sugjerime të dobishme se si të rregullohet gabimi.

Ada gjithashtu mbështet kontrollet e kohës së ekzekutimit për t'u mbrojtur nga aksesi në memorien e paalokuar, gabimet e mbingarkesës e buffer-it, shkeljet e diapazonit, gabimet e shkëputura nga një, gabimet e aksesit në grup dhe gabimet e tjera të zbulueshme. Këto kontrolle mund të çaktivizohen në interes të efikasitetit të kohës së ekzekutimit, por shpesh mund të përpilohen në mënyrë efikase. Përfshin gjithashtu mundësi për të ndihmuar verifikimin e programit . Për këto arsye, Ada ndonjëherë përdoret në sisteme kritike, ku çdo anomali mund të çojë në pasoja shumë të rënda, p.sh. vdekje aksidentale, lëndim ose humbje të rënda financiare. Shembuj të sistemeve ku përdoret Ada përfshijnë avionin, kontrollin e trafikut ajror, hekurudhat, bankat, teknologjinë ushtarake dhe hapësinore .  

Menaxhimi dinamik i kujtesës i Ada është i nivelit të lartë dhe i sigurt për tipin. Ada nuk ka tregues të përgjithshëm ose të pashtypshëm; as nuk deklaron në mënyrë implicite ndonjë lloj treguesi. Në vend të kësaj, të gjitha alokimet dhe de-alokimet dinamike të memories duhet të ndodhin përmes *llojeve të aksesit* të deklaruara në mënyrë eksplicite. Çdo lloj aksesi ka një *grup ruajtjeje* të lidhur që trajton detajet e nivelit të ulët të menaxhimit të kujtesës; programuesi ose mund të përdorë grupin e paracaktuar të ruajtjes ose të përcaktojë të reja (kjo është veçanërisht e rëndësishme për Qasjen e Kujtesës Jo Uniforme ). Është madje e mundur të deklarohen disa lloje të ndryshme aksesi që të gjitha i referohen të njëjtit lloj, por përdorin grupe ruajtjeje të ndryshme. Po ashtu, gjuha ofron *kontrolle të aksesueshmërisë*, si gjatë kohës së përpilimit ashtu edhe gjatë kohës së ekzekutimit, që sigurojnë se një *vlerë aksesi* nuk mund të jetoj më shumë se lloji i objektit që ajo i referohet.

Megjithëse semantika e gjuhës lejon grumbullimin automatik të mbeturinave të objekteve të paaksesueshme, shumica e implementimeve nuk e mbështesin atë si parazgjedhje, pasi do të shkaktonte sjellje të paparashikueshme në sistemet në kohë reale. Ada mbështet një formë të kufizuar të menaxhimit të kujtesës të bazuar në rajon ; gjithashtu, përdorimi kreativ i grupeve të ruajtjes mund të sigurojë një formë të kufizuar të grumbullimit automatike të mbetjeve, pasi shkatërrimi i një grupi ruajtjeje shkatërron gjithashtu të gjitha objektet në grup. 

Një vizë e dyfishtë ("--"), që i ngjan një vize të gjatë, tregon tekstin e komentit. Komentet ndalen në fund të rreshtit; qëllimisht nuk ka asnjë mënyrë për të bërë një koment të shtrihet në shumë rreshta, për të parandaluar që komentet e pambyllura të çaktivizojnë aksidentalisht seksione të tëra të kodit burimor. Prandaj, për të çaktivizuar një bllok të tërë kodi, është e nevojshme që secili rresht (ose kolonë) të paraprihet individualisht me "--". Ndërsa kjo tregon qartë kodin e çaktivizuar duke krijuar një kolonë me "--" të përsëritura poshtë faqes, ajo gjithashtu e bën çaktivizimin/ri-aktivizimin eksperimental të blloqeve të mëdha një proces më të zgjatur në redaktorët pa mbështetje për komentimin e bllokut.

Pikëpresja (";") është një terminator i deklaratës, dhe deklarata null ose jo-operacion është `null;` . Një pikëpresje e vetme `;` pa një deklaratë për të përfunduar nuk lejohet.

Ndryshe nga shumica e standardeve ISO, përkufizimi i gjuhës Ada (i njohur si *Manuali i Referencës Ada* ose *ARM*, ose ndonjëherë *manuali i referencës së gjuhës* ose *LRM* ) është përmbajtje falas . Kështu, është një referencë e zakonshme për programuesit Ada, jo vetëm për programuesit që implementojnë përpilues të Ada. Përveç manualit të referencës, ekziston gjithashtu një dokument i gjerë arsyetimi që shpjegon dizajnin e gjuhës dhe përdorimin e konstruksioneve të ndryshme të gjuhës. Ky dokument përdoret gjithashtu gjerësisht nga programuesit. Kur gjuha u rishikua, u shkrua një dokument i ri arsyetim.

Një mjet i shquar i softuerit falas që përdoret nga shumë programues të Ada për t'i ndihmuar ata në shkruajtjen e kodit burimor të Ada është Studio e Programimit GNAT dhe GNAT e cila është pjesë e Koleksionit të Përpiluesit GNU .

*Alire* është një mjet i menaxhimit të paketave dhe zinxhirit të mjeteve për Ada. 

## Historia 
Në vitet 1970, Departamenti i Mbrojtjes i SHBA (DoD) u shqetësua për numrin e madh të gjuhëve të ndryshme programuese që po përdoren për projektet e tij të sistemeve kompjuterike të integruara, shumica e të cilave ishin të vjetruara ose të varura nga hardueri dhe asnjëra prej të cilave nuk mbështeste programim të sigurt modular. Në vitin 1975, u formua një grup pune, Grupi i Punës së Gjuhëve të Rendit të Lartë (HOLWG), me synimin për të reduktuar këtë numër duke gjetur ose krijuar një gjuhë programuese përgjithësisht të përshtatshme për kërkesat e departamentit dhe të Ministrisë së Mbrojtjes të Mbretërisë së Bashkuar . Pas shumë përsëritjesh duke filluar me një propozim origjinal model  gjuha përfundimtare e programuese u quajt Ada. Numri i përgjithshëm i gjuhëve të programimit të nivelit të lartë në përdorim për projekte të tilla ra nga mbi 450 në 1983 në 37 deri në 1996.

HOLWG hartoi kërkesat për gjuhën Steelman, një seri dokumentesh që përshkruanin kërkesat që ata mendonin se një gjuhë programuese duhet t'i plotësonte. Shumë gjuhë ekzistuese u rishikuan zyrtarisht, por ekipi arriti në përfundimin në vitin 1977 se asnjë gjuhë ekzistuese nuk i plotësonte specifikimet.parapamje|225x225px| Piktura me bojëra uji e Ada Lovelace
Kërkesat për propozime për një gjuhë të re programuese u shpallën dhe katër kontraktorë u punësuan për të zhvilluar propozimet e tyre nën emrat Red ( Intermetrics i udhëhequr nga Benjamin Brosgol), Green ( Honeywell, i udhëhequr nga Jean Ichbiah ), Blue ( SofTech, i udhëhequr nga John Goodenough )  dhe Yellow ( SRI International, i udhëhequr nga Jay Spitzen). Në prill 1978, pas shqyrtimit publik, propozimet e Red dhe të Green kaluan në fazën tjetër. Në maj 1979, propozimi i Green, i projektuar nga Jean Ichbiah në Honeywell, u zgjodh dhe iu dha emri Ada - sipas Augusta Ada King, konteshë e Lovelace, e njohur zakonisht si Ada Lovelace . Ky propozim u ndikua nga gjuha LIS që Ichbiah dhe grupi i tij kishin zhvilluar në vitet 1970. Manuali paraprak i referencës Ada u botua në ACM SIGPLAN Notices në qershor 1979. Manuali i referencës së Standardeve Ushtarake u miratua më 10 dhjetor 1980 (ditëlindja e Ada Lovelace) dhe iu dha numri MIL-STD-1815 për nder të vitit të lindjes së Ada Lovelace. Në vitin 1981, Tony Hoare shfrytëzoi fjalimin e tij për çmimin Turing për të kritikuar Ada-n për kompleksitetin e tepërt dhe si rrjedhim jo i besueshëm,  por më pas u duk se u tërhoq në parathënien që shkroi për një libër shkollor Ada. 

Ada tërhoqi shumë vëmendje nga komuniteti i programimit në tërësi gjatë ditëve të para. Mbështetësit e saj dhe të tjerët parashikuan se ajo mund të bëhej një gjuhë dominuese për programimin e qëllimeve të përgjithshme dhe jo vetëm për punë të lidhura me mbrojtjen.  Ichbiah deklaroi publikisht se brenda dhjetë viteve do të mbesin vetëm dy gjuhë programimi: Ada dhe Lisp .  Përpiluesit e hershëm të Ada-s u kishin vështirësi në implementimin e gjuhës së madhe dhe komplekse, dhe performanca në kohën e përpilimit dhe ekzekutimin prireshin të ishin të ngadalta dhe mjetet primitive. i çertifikuar më 11 prill 1983. NYU Ada/Ed zbatohet në gjuhën e grupit të nivelit të lartë SETL .  Disa kompani komerciale filluan të ofrojnë përpilues të Ada-s dhe mjete zhvillimi të lidhura, duke përfshirë Alsys, TeleSoft, DDC-I, Teknikat e Avancuara Kompjuterike, Tartan Laboratories, Irvine Compiler, TLD Systems dhe Verdix .  Prodhuesit e kompjuterëve të cilët kishin një biznes të rëndësishëm në industrinë e mbrojtjes, hapësirës ajrore ose industritë e ngjashme, ofruan gjithashtu përpilues dhe mjete Ada në platformat e tyre; këto përfshinin Concurrent Computer Corporation, Cray Research, Inc., Digital Equipment Corporation, Harris Computer Systems dhe Siemens Nixdorf Informationssysteme AG .  edhe pse shpesh jepeshin përjashtime nga ky rregull.

Nga fundi i viteve 1980 dhe fillimi i viteve 1990, përpiluesit e Ada-s kishin përmirësuar performancën, por ende ekzistonin pengesa për të shfrytëzuar plotësisht aftësitë e Ada-s, duke përfshirë një model të menaxhimit të detyrave që ishte ndryshe nga ajo që shumica e programuesve të sistemeve në kohë reale ishin mësuar. 

Për shkak të veçorive të mbështetjes kritike për sigurinë e Ada-s, ajo tani përdoret jo vetëm për aplikime ushtarake, por edhe në projekte komerciale ku një gabim i softuerit mund të ketë pasoja të rënda, p.sh., avionika dhe kontrolli i trafikut ajror, raketat komerciale si Ariane 4 dhe 5, satelitët dhe sistemet e tjera hapësinore, transporti hekurudhor dhe bankat.  Për shembull, Sistemi Primar i Kontrollit të Fluturimit, softueri i sistemit fly-by-wire në Boeing 777, u shkrua në Ada, siç ishin sistemet fly-by-wire për Eurofighter Typhoon të paqëndrueshëm aerodinamikisht,  Saab Gripen,  Lockheed Martin F-22 Raptor dhe sistemi zëvendësues i kontrollit të fluturimit DFCS për Grumman F-14 Tomcat . Sistemi i Automatizuar i Trafikut Ajror Kanadez u shkrua në 1 milion rreshta Ada (numri SLOC ). Ai paraqiste përpunim të advancuar të shpërndarë, një bazë të dhënash të shpërndarë Ada dhe dizajn të orientuar nga objekti. Ada përdoret gjithashtu në sisteme të tjera të trafikut ajror, p.sh., sistemi i kontrollit të trafikut ajror të gjeneratës së ardhshme të Mbretërisë së Bashkuar për Mbështetjen e Mjeteve të Kontrollit të Përkohshëm të Ardhmërisë ( iFACTS ) është projektuar dhe zbatuar duke përdorur SPARK Ada.  Përdoret gjithashtu në sistemin francez të sinjalizimit të kabinës TVM në sistemin hekurudhor të shpejtësisë së lartë TGV dhe në trenat periferike të metrosë në Paris, Londër, Hong Kong dhe New York City. 

## Standardizimi 
Ada paraprake mund të gjendet në ACM Sigplan Notices Vol 14, No 6, Qershor 1979 

Ada u botua për herë të parë në 1980 si një standard ANSI ANSI/ **MIL-STD 1815** . Meqenëse ky version i parë kishte shumë gabime dhe paqartësi, botimi i rishikuar u botua në 1983 si ANSI/MIL-STD 1815A. Pa ndonjë ndryshim të mëtejshëm, ai u bë një standard ISO në 1987.  Ky version i gjuhës njihet zakonisht si **Ada&nbsp;83**, nga data e miratimit të tij nga ANSI, por nganjëherë referohet edhe si **Ada&nbsp;87**, nga data e miratimit të tij nga ISO.  Ekziston edhe një përkthim në frëngjisht; DIN e përktheu atë në gjermanisht si DIN 66268 në 1988.

**Ada&nbsp;95**, standardi i përbashkët ISO/IEC/ANSI ISO/IEC 8652:1995   u botua në shkurt 1995, duke e bërë atë gjuhën e parë të programimit standard ISO të orientuar drejt objektit. Për të ndihmuar me rishikimin standard dhe pranimin në të ardhmen, Forcat Ajrore të SHBA financuan zhvillimin e Përpiluesit GNAT . Aktualisht, përpiluesi GNAT është pjesë e Koleksionit të Përpiluesit GNU .

Puna ka vazhduar për përmirësimin dhe përditësimin e përmbajtjes teknike të gjuhës Ada. Një korrigjim teknik për Ada&nbsp;95 u botua në tetor 2001, dhe një amendament i madh, ISO/IEC 8652:1995/Amd 1:2007   u botua më 9 mars 2007, i njohur zakonisht si **Ada&nbsp;2005** sepse puna për standardin e ri u përmbyll atë vit.

Në konferencën Ada-Europe 2012 në Stokholm, Shoqata e Burimeve të Ada-s (ARA) dhe Ada-Europe njoftuan përfundimin e dizajnit të versionit më të fundit të gjuhës Ada dhe dorëzimin e manualit të referencës në ISO/IEC JTC 1/ SC 22 / WG 9 e Organizatës Ndërkombëtare për Standardizim (ISO) dhe Komisionit Ndërkombëtar Elektroteknik (IEC) për miratim. ISO/IEC 8652:2012  (shih Ada 2012 RM ) u botua në dhjetor 2012, i njohur si **Ada&nbsp;2012** . Një korrigjim teknik, ISO/IEC 8652:2012/COR 1:2016, u botua  (shih RM 2012 me TC 1 ).

Më 2 maj 2023, komuniteti Ada pa miratimin formal të publikimit të edicionit **Ada 2022** të standardit të gjuhës së programimit. 

Pavarësisht emrave Ada 83, 95 etj., ligjërisht ekziston vetëm një standard Ada, ai i standardit të fundit ISO/IEC: me pranimin e një versioni të ri standard, ai i mëparshmi tërhiqet. Emrat e tjerë janë thjesht joformalë që i referohen një botimi të caktuar.

Standarde të tjera të lidhura përfshijnë ISO/IEC 8651 -3:1988 *Sistemet e përpunimit të informacionit—Grafika kompjuterike—Lidhjet gjuhësore të Sistemit Grafik të Kernelit (GKS)—Pjesa 3: Ada* .

## Konstruktet gjuhësore 
Ada është një gjuhë programimi e ngjashme me ALGOL që përmban struktura kontrolli me fjalë të rezervuara si *if*, *then*, *else*, *while*, *for*, etj. Megjithatë, Ada ka gjithashtu shumë mundësi për struktura të të dhënave dhe abstraksione të tjera që nuk ishin përfshirë në origjinalin ALGOL 60, të tilla si përkufizimet e tipit, regjistrimet, treguesit, numërimet . Konstruksione të tilla ishin pjesërisht të trashëguara ose të frymëzuara nga Pascal .

### "Përshëndetje, botë!" në Ada 
Një shembull i zakonshëm i sintaksës së një gjuhe është programi Hello world : (hello.adb)
```ada
with Ada.Text_IO;
procedure Hello is
begin
   Ada.Text_IO.Put_Line ("Hello, world!");
end Hello;
```
Ky program mund të përpilohet duke përdorur përpiluesin me burim të hapur GNAT i cili është në dispozicion falas, duke ekzekutuar
```bash
gnatmake hello.adb
```

### Llojet e të dhënave 
Sistemi i tipit Ada nuk bazohet në një grup tipash primitivë të paracaktuar, por i lejon përdoruesit të deklarojnë llojet e tyre. Kjo deklaratë nga ana tjetër nuk bazohet në paraqitjen e brendshme të tipit, por në përshkrimin e qëllimit që duhet të arrihet. Kjo i lejon kompajlerit të përcaktojë një madhësi të përshtatshme memorie për llojin dhe të kontrollojë për shkelje të përkufizimit të tipit gjatë kohës së përpilimit dhe ekzekutimit (dmth., shkeljet e diapazonit, tejkalimet e buferit, konsistenca e tipit, etj.). Ada mbështet llojet numerike të përcaktuara nga një gamë, llojet e modulit, llojet e agregatit (regjistrat dhe grupet) dhe llojet e numërimit. Llojet e aksesit përcaktojnë një referencë në një instancë të një tipi të specifikuar; treguesit pa tip te specifikuar nuk lejohen. Llojet e veçanta të ofruara nga gjuha janë llojet e detyrave dhe llojet e mbrojtura.

Për shembull, një datë mund të përfaqësohet si:
```ada
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;
```
Është e rëndësishme të theksohet: Day_type, Month_type, Year_type, Hours janë lloje të papajtueshme, që do të thotë se për shembull shprehja e mëposhtme është e paligjshme:
```ada
Today: Day_type := 4;
Current_Month: Month_type := 10;
... Today + Current_Month ...  -- illegal
```
Operatori plus i paracaktuar mund të shtojë vetëm vlera të të njëjtit lloj, kështu që shprehja është e paligjshme.

Llojet mund të rafinohen duke deklaruar nëntipe :
```ada
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
```
Llojet mund të kenë modifikues si *të kufizuar, abstrakt, privat* etj. Llojet private nuk tregojnë strukturën e tyre të brendshme; objektet e llojeve të kufizuara nuk mund të kopjohen.  Ada 95 shton veçori të tjera për zgjerimin e llojeve të orientuara nga objekti.

### Strukturat e kontrollit 
Ada është një gjuhë programimi e strukturuar, që do të thotë se rrjedha e kontrollit është e strukturuar në deklarata standarde. Të gjitha konstruktet standarde dhe daljet e thella të hershme janë të mbështetura, kështu që përdorimi i komandave " go to " të cilat gjithashtu mbështeten, është rrallë i nevojshëm.
```ada
-- 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;
```

### Paketat, procedurat dhe funksionet 
Ndër pjesët e një programi Ada janë paketat, procedurat dhe funksionet.

Funksionet ndryshojnë nga procedurat në atë që duhet të kthejnë një vlerë. Thirrjet e funksioneve nuk mund të përdoren "si një deklaratë" dhe rezultati i tyre duhet t'i caktohet në një variabël. Megjithatë, që nga Ada 2012, funksionet nuk kërkohet të jenë të pastra dhe mund të ndryshojnë parametrat e tyre të deklaruar në mënyrë të përshtatshme ose gjendjen globale. 

Shembull: Specifikimi i paketës (example.ads)
```ada
package Example is
     type Number is range 1 .. 11;
     procedure Print_and_Increment (j: in out Number);
end Example;
```
Trupi i paketës (example.adb)
```ada
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;
```
Ky program mund të përpilohet, p.sh., duke përdorur përpiluesin me burim të hapur GNAT , që është në dispozicion falas, duke ekzekutuar
```ada
gnatmake -z example.adb
```
Paketat, procedurat dhe funksionet mund të vendosen në çdo thellësi, dhe secila mund të jetë gjithashtu blloku logjik më i jashtëm.

Çdo paketë, procedurë ose funksion mund ë ketë deklaratat e veta të konstantave, llojeve, variablave dhe procedurave, funksioneve dhe paketave të tjera, të cilat mund të deklarohen në çdo mënyrë.

### Pragmat 
Një pragmë është një direktivë përpiluesi që i transmeton informacion përpiluesit për të lejuar manipulimin specifik të daljes së përpiluar.  Disa pragma janë të ndërtuara brenda gjuhës,  ndërsa të tjera janë të specifikuara nga implementimi.

Shembuj të përdorimit të zakonshëm të pragmave të përpiluesit do të ishin çaktivizimi i disa veçorive, të tilla si kontrolli i tipit në kohë ekzekutimi ose kontrollimi i kufijve të indekseve të grupeve, ose të jepet udhëzim përpiluesit që të futë kodin e objektit në vend të thirrjes së funksionit (siç bën C/C++ me funksionet inline ).

### Gjenerikët 
Ada ka integruar gjenerikë që nga dizajnimi i saj i parë në vitet 1977–1980. Biblioteka standarde përdor gjenerikët për të ofruar shumë shërbime. Ada 2005 shton një bibliotekë gjithëpërfshirëse të kontejnerëve generikë në bibliotekën standarde, e cila është frymëzuar nga Biblioteka e Modeleve Standarde të C++ (STL).

Një *njësi gjenerike* është një paketë ose një nënprogram që merr një ose më shumë parametra formalë gjenerikë.

Një parametër formal generik mund të jetë një vlerë, një variabël, një konstantë, një tip, një nënprogram ose madje edhe një instancë e një njësie tjetër generike të caktuar. Për tipet formale generike, sintaksa dallon mes tipeve diskrete, me pikë lundruese, me pikë fikse, tipeve të aksesit (pointer), etj. Disa parametra formalë mund të kenë vlera të paracaktuara.

Për të instancuar një njësi gjenerike, programuesi i kalon parametra aktualë për secilin parametër formal. Instanca generike më pas sillet si çdo njësi tjetër. Është e mundur të instancohen njësi generike gjatë kohës së ekzekutimit, për shembull brenda një cikli.

## Shiko dhe 
* Ada compiler
* APSE – një specifikim për një mjedis programimi për të mbështetur zhvillimin e softuerit në Ada
* Profili Ravenscar – një nëngrup i veçorive të detyrave Ada të dizajnuara për llogaritje të vështira në kohë reale të sigurisë kritike
* [SPARK](https://en.m.wikipedia.org/wiki/SPARK_(programming_language)) - një gjuhë programimi e përbërë nga një nëngrup shumë i kufizuar i Ada, i shënuar me meta-informacion që përshkruan sjelljen e dëshiruar të komponentit dhe kërkesat individuale të kohës së ekzekutimit
* VHDL, gjuha e përshkrimit të harduerit të bazuar në Ada

## Referime 
## Lidhje te jashtme 
* Ada Resource Association 
* DOD Ada programming language (ANSI/MIL STD 1815A-1983) specifications 
* JTC1/SC22/WG9 ISO home of Ada Standards
* Ada Programming Language Materials, 1981–1990. Charles Babbage Institute , University of Minnesota.