Kirjoittaja: Schedler (11.12.2009)
Ada-ohjelmointikieli sai alkunsa Yhdysvaltojen puolustusministeriön tarpeesta laajojen ja kriittisten ohjelmistojen kehittämiseen ja ylläpitoon. 1970-luvulla järjestelmien kehittyessä entistä monimutkaisemmiksi, ohjelmistojen osuus järjestelmien kokonaiskustannuksista kasvoi räjähdysmäisesti. Puolustusministeriön selvityksessä kävi ilmi, että ohjelmistoja kehitettiin sadoilla eri kielillä. Ada kehitettiin korvaamaan nämä lukemattomat kielet yhdellä standardoidulla kielellä.
Ensimmäinen virallinen Ada-versio julkaistiin vuonna 1983 (Ada-83). Seuraava versio julkaistiin vuonna 1995 (Ada-95). Julkaisi sisälsi huomattavia parannuksia mm. rinnakkaisten ohjelmistojen kehittämiseen. Viimeisin kieliversio julkaistiin vuonna 2005 (Ada-2005), ja kehitystyössä otettiin huomioon erityisesti olio-ohjelmoinnin tarpeet.
Johtuen Adan juurista, kielen suunnittelun yhtenä tärkeänä perusteena on ollut ylläpidettävyys. Ylläpidettävyyden takaamiseksi kieli on suunniteltu luettavaksi, ymmärrettäväksi ja mahdollisimman yllätyksettömäksi.
Yksinkertainen tekstin tulostus:
with Ada.Text_IO; -- Paketti tarvitaan teksti-I/O:lle procedure Hello is begin Ada.Text_IO.Put_Line ("Hyvää Joulua!"); -- Tulostetaan standardiin tulostuslaitteeseen end Hello;
Adassa kommentit aloitetaan kahdella -- -merkillä, kommentti jatkuu rivin loppuun.
with Ada.Text_IO; procedure Fib_Example is Type Fib_Num_Type is range 0..100; -- Määritellään tyyppi Fib-funktion syötteelle ja paluuarvolle. -- Tehtävänannon perusteella tiedetään ettei funktion syöte -- tai tulos voi koskaan olla pienempi kuin 0, eikä -- ylittää arvoa 100. -- Perinteinen rekursiivinen toteutus function Fib (N : in Natural) return Fib_Num_Type is begin if N = 0 then return 0; elsif N = 1 then return 1; else return Fib (N - 1) + Fib (N - 2); end if; end Fib; N : Natural := 0; begin loop -- Luodaan päättymätön silmukka Ada.Text_IO.Put_Line (Fib_Num_Type'image(Fib(N))); N := N + 1; end loop; exception when Constraint_Error => Ada.Text_IO.Put_Line ("Liian suuri numeroarvo!"); end Fib_Example;
Esimerkissä on käytetty poikkeuksia osittain hyvän ohjelmointitavan vastaisesti, koska on haluttu korostaa Adan vahvaa tyyppijärjestelmää. Ohjelman tuloste näyttää seuraavalta:
0 1 1 2 3 5 8 13 21 34 55 89 Liian suuri numeroarvo!
Ohjelman suoritus päättyy Constraint_Error-poikkeukseen, koska summa Fib(N-1) + Fib(N-2) (tyypin arvoalue 0..100) ylittää sallitun arvoalueen (55 + 89 > 100).
with Ada.Text_IO; use Ada.Text_IO; procedure Concurrent is Text : constant String := "Hello World!"; -- Määritellään tehtävätyyppi Printer task type Printer (Start_Index : Integer) is entry Start; end Printer; -- Tehtävätyypin Printer toteutus task body Printer is I : Integer := Start_Index; begin accept Start; -- Odotetaan kunnes saadaan lupa jatkaa... -- Text'Last palauttaa taulukkomuuttujan Text viimeisen -- elementin indeksin; suoritetaan silmukkaa vain viimeiseen -- merkkiin asti while I <= Text'Last loop Put ("Task " & Integer'Image(Start_Index) & " -> "); Put (Text(I)); New_Line; delay 0.10; I := I + 2; end loop; end Printer; A : Printer (1); B : Printer (2); begin A.Start; -- Annetaan A:lle lupa jatkaa suoritustaan delay 0.05; B.Start; -- Annetaan B:lle lupa jatkaa suoritustaan end Concurrent;
Ylläolevassa koodissa luodaan rinnakkainen tehtävätyyppi (task type) Printer. Tehtävätyyppille annetaan parametri Start_Index, joka määrittää mistä taulukon elementistä tehtävätyyppi aloittaa tulostuksensa.
Suoritettuna ohjelma tulostaa seuraavaa:
Task 1 -> H Task 2 -> e Task 1 -> l Task 2 -> l Task 1 -> o Task 2 -> Task 1 -> W Task 2 -> o Task 1 -> r Task 2 -> l Task 1 -> d Task 2 -> !
When Roman engineers built a bridge, they had to stand under it while the first legion marched across. If programmers today worked under similar ground rules, they might well find themselves getting much more interested in Ada.
--Robert Dewar, ensimmäisen validoidun Ada-kääntäjätiimin vetäjä
Ada 2005-kielen standardi
GNAT - GNU Ada
AdaCore - kaupallisen GNAT-version kehittäjä