Kirjautuminen

Haku

Tehtävät

Joulukalenteri 2009: Ada

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.

Esimerkki: Tekstin tulostus

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.

Esimerkki: Fibonaccin luvut

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).

Yksinkertainen rinnakkainen ohjelma

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 -> !

Kielestä sanottua

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ä

Linkkejä

Ada 2005-kielen standardi
GNAT - GNU Ada
AdaCore - kaupallisen GNAT-version kehittäjä

Tietoa sivustosta