Hlavní navigace

Programovací jazyk Ada: starý projekt v novém prostředí, úprava GPS

9. 7. 2015
Doba čtení: 10 minut

Sdílet

Minulý díl našeho seriálu jsme ukončili instalací a zprovozněním vývojového prostředí Eclipse s příslušným pluginem včetně vytvoření jednoduchého projektu. V dnešním dílu se budeme vývojovým prostředím Eclipse zabývat podrobněji a zahájíme práci na úpravě GPS na nejnovější sadu nástrojů GNAT.

minulém dílu jsme také mimo jiné rozebírali rozdíl mezi kódem projektu generovaném Eclipse a GPS. Zkusíme tedy změnit původně generovaný kód tak, jak by vypadal v GPS:

with Ada.Text_IO;  use Ada.Text_IO;  --1
procedure main is            --2
begin                        --3
   Put_Line ("Hello World - Ada!");      --4
end main;                    --5

Po uložení změn se provede automatické sestavení, ale překlad nikoliv. Pokud tedy zkusíme spustit novou verzi aplikace pomocí prostřední ikony ve třetí sekci zleva (bílá šipka v zeleném kroužku Run main.adb), objeví se formulář, který je vidět na prvním obrázku první galerie. Pokud necháme nastavení beze změny a stiskneme tlačítko Run, dole v konzoli se sice objeví výsledek, ale pořád ještě z původního kódu – viz další obrázek. Spustíme proto příkaz hlavního menu Project → Rebuild Current Project, který proběhne bez problémů. Pokud znovu spustíme ikonu Run main.adb a z následného formuláře tlačítko Run, dostaneme již nový výsledek – viz třetí obrázek první galerie.

Nyní se blíže podíváme na to, co nám vytvoření nového projektu „provedlo“ v pracovním adresáři Eclipse (workspace). Když si otevřeme příslušný adresář, zjistíme, že je v něm kromě jiného nový podadresář s názvem hello1 a v něm dva další podadresáře obj a src a soubor hello1.gpr. Soubor zatím necháme stranou a podíváme se na obsah uvedených adresářů. V ../obj je celkem 7 souborů Z toho tři jsou nám již známé – main.ali, main.o a spustitelný soubor main. Dále jsou zde další 4 soubory s názvem b~main a příponami .adb, .ads. ali a .o. Kdo chce, může si prohlédnout jejich obsah, ale v rámci článku se jím zabývat nebudeme. Obsah všech uvedených adresářů je na čtvrtém obrázku v první galerii.

Abychom mohli alespoň trochu srovnat výsledky generování nového projektu v GPS a GNATbench, zkusíme vytvořit novou verzi našeho posledního projektu na výpočet kořenů kvadratické rovnice. Než se ale pustíme do práce, ukážeme si úpravu vývojového prostředí tak, abychom měli k dispozici i novější verzi nástrojů jazyka Ada. Otevřeme tedy menu Window → Preferences → Ada → Toolchains a otevře se před námi formulář velmi podobný tomu, který jsme viděli při zakládání nového projektu. Tam jsme zkoušeli funkci Scan, která ale nebyla funkční. Nyní použijeme další dostupnou funkci – Add. Po jejím spuštění se otevře další formulář – viz pátý obrázek v první galerii. V něm je nutné vyplnit několik editačních polí. První pole s názvem Name obsahuje rozbalovací box s množstvím platforem, pro které je možné v jazyce Ada vyvíjet. Pro nás tam ale není nic zajímavého, takže prohlídku necháme pouze a jenom na případných zájemcích. My provedeme minimální nastavení nástrojů, které je vidět na dalším obrázku první galerie. Název je libovolný, ale další tři položky Ada Compiler, GNAT List a GNAT Driver se musí odkazovat na konkrétní aplikace s konkrétním umístěním. Pokud jsme provedli nastavení správně, po stisku tlačítka OK se objeví předchozí formulář, kde jsou ale k dispozici již dvě sady nástrojů – viz sedmý obrázek první galerie. Jak je z obrázku patrné, objevil se zde námi zadaný název (sloupec Name), umístění nástrojů (Location, vychází z námi zadaného adresáře s příslušnými aplikacemi) a verze (Version, opět automaticky načtená z příslušných adresářů). Jasně zde vidíme, že nová sada obsahuje nejnovější verzi Ada nástrojů, které jsme instalovali v minulých dílech. Nové nastavení uložíme pomocí tlačítek Apply a OK.

Nyní už se můžeme pustit do vytvoření nového projektu, jak jsme avizovali výše v textu. Spustíme tedy funkci New Ada Project a nazveme projekt starým názvem Kvadrov. Hlavní jednotku necháme přednastavenou, ale hlavní podprogram nastavíme jinak a necháme vygenerovat příslušný soubor solve – viz první obrázek druhé galerie. Nastavení adresářů neměníme, ale parametry sestavení už ano. Použijeme verzi Ada 2012 a nově vytvořenou sadu nástrojů GNAT 2014 (je možné použít i více sad současně, ale my použijeme pouze jednu) – viz další obrázek ve druhé galerii. Po nastavení parametrů projektu a zahájení jeho generace se ale bohužel objeví chybové hlášení a projekt nelze založit – viz třetí obrázek ve druhé galerii (nedojde k vytvoření adresáře ../src a v něm očekávaného souboru solve.adb). Přerušíme tedy vytváření projektu a začneme znovu. Vše bude stejné, jenom na posledním formuláři nastavíme použití verze Ada 2012 a ponecháme nastavenou sadu nástrojů native 4.8.2. Pak proběhne založení projektu bez problémů a objeví se v přehledu projektů včetně potřebné adresářové struktury.

Bylo by ale škoda nevyužít možností nejnovější sady nástrojů GNAT a proto se pokusíme provést změnu následně. Jak vidíme na čtvrtém obrázku druhé galerie, je součástí projektu Kvadrov také Ada Runtime verze GNAT 4.8.2. Otevřeme menu Project → Properties → GNATbench Properties a změníme sadu nástrojů – viz další obrázek ve druhé galerii. Změnu uložíme tlačítky Apply a OK a pravým tlačítkem myši otevřeme kontextové menu projektu a vybereme položku Refresh (v nápovědě je i možnost stisku tlačítka F5). Změna se okamžitě projeví a je viditelná na předposledním obrázku druhé galerie. Nyní se znovu vrátíme k příkladu, který pouze implementujeme v novém prostředí. Nejde ani tak o samotný příklad, ale o jeho uspořádání. Jedná se o to, že jako hlavní podprogram v projektu není možné použít balíček, který je součástí dvojice specifikace/implementace. Vždy je nutné mít nějaký soubor, který je deklarován jako procedura a určen za hlavní podprogram projektu a teprve z něj je možné volat další balíčky a procedury už bez ohledu na jejich formát.

Pokud si otevřeme nově vytvořenou proceduru solve.adb, má velmi jednoduchý obsah:

procedure solve is
begin
   null; + nápověda
end solve;

Ještě než začneme tento a další soubor upravovat, vytvoříme si další dva potřebné soubory – kvadrov.ads a kvadrov.adb. K tomu potřebujeme dva kroky – ve struktuře projektu vybrat adresář src a použít prostřední ikonu ve druhé sekci zleva – New Ada Source File. Pak stačí pouze zadat název obou souborů včetně přípon a vytvořit je. Jako první otevřeme soubor kvadrov.ads a vložíme do něj již známý kód:

package kvadrov is

procedure Quadra (A, B, C : in  Float; R1, R2, I1, I2 : out Float; Result : out Character);

end kvadrov;

Při psaní kódu si můžeme všimnout, že Eclipse označuje klíčová slova, ale nenapovídá jejich názvy a neumožňuje vybrat jejich doplňování. Po vložení kódu soubor uložíme a pokračujeme tělem balíčku kvadrov.adb:

with Ada.Numerics.Elementary_Functions; use  Ada.Numerics.Elementary_Functions;

package body kvadrov is

procedure Quadra (A, B, C : in  Float; R1, R2, I1, I2 : out Float; Result : out Character) is
   D, Z : Float;
   chyba : exception;
begin

    if A = 0.0 then
        raise chyba;
    end if;

   D := B**2 - 4.0 * A * C;
   Z := 2.0 * A;
   if D < 0.0 then
      Result := 'K';
      R1 := -B / Z;
      R2 := R1;
      I1 := Sqrt (-D) / Z;
      I2 := -Sqrt (-D) / Z;
   elsif D = 0.0 then
      Result := 'D';
      R1 := -B / Z;
      R2 := R1;
      I1 := 0.0;
      I2 := I1;
   else
      Result := 'R';
      R1 := (-B + Sqrt (D)) / Z;
      R2 := (-B - Sqrt (D)) / Z;
      I1 := 0.0;
      I2 := I1;
   end if;

    exception
      when chyba => Result := 'E';
    return;

   end Quadra;

begin

   null;

end kvadrov;

Při psaní je možné si opět všimnout dvou věcí: Eclipse krásně odsazuje úseky kódy a psaní je pak jednodušší a rychlejší. Na rozdíl od GPS ale nenapovídá ani při psaní „tečkových“ notací, a to je docela zásadní problém. Soubor opět uložíme a vrátíme se k souboru solve.adb, který upravíme následovně:

with Ada.Text_IO;
with Ada.Float_Text_IO;
with Ada.Integer_Text_IO;
with kvadrov;

procedure solve is

    package TIO renames Ada.Text_IO;
    package FIO renames Ada.Float_Text_IO;
    package DIO is new Ada.Text_IO.Float_IO(Float);

    package IIO renames Ada.Integer_Text_IO;

   r1,r2,i1,i2 :Float;
   vysledek : Character;

   int : Integer := 10;

begin

   kvadrov.Quadra(1.0,3.0,1.0,r1,r2,i1,i2,vysledek);

   if vysledek = 'E' then
        TIO.Put_Line(" Vypocet prerusen z duvodu spatneho zadani koeficientu!");
   return;
   end if;

   TIO.Put_Line("Vysledky reseni: " & vysledek);
   TIO.Put("K1 = " );
   FIO.Put(Item => r1, Fore => 3, Aft => 6, Exp => 0);
   TIO.Put(" ");
   FIO.Put(Item => i1, Fore => 3, Aft => 6, Exp => 0);
   TIO.Put(" i");

   TIO.New_Line;
   TIO.Put("K2 = " );
   DIO.Put(Item => r2, Fore => 3, Aft => 6, Exp => 0);
   TIO.Put(" ");
   DIO.Put(Item => i2, Fore => 3, Aft => 6, Exp => 0);
   TIO.Put(" i");

   TIO.New_Line;
   TIO.Put("INT-B10 = ");
   IIO.Put(Item => Int, Width => 3, Base => 10);

   TIO.New_Line;
   TIO.Put("INT-B2 = ");
   IIO.Put(Item => Int, Width => 8, Base => 2);

   TIO.New_Line;
   TIO.Put("INT-B8 = ");
   IIO.Put(Item => Int, Width => 8, Base => 8);

   TIO.New_Line;
   TIO.Put("INT-B16 = ");
   IIO.Put(Item => Int, Width => 8, Base => 16);

   end solve;

Jenom krátce k psaní kódu: při odkazu na proceduru Kvadrov.Quadra se nápověda objeví a s ní i přehled procedur v daném balíčku obsažených. Po uložení kódu je nutné spustit nové přeložení příkazem Project → Rebuild Current Project. Pokud jsou v kódu nějaké chyby, tak se objeví ve spodní části Problems. Pokud je vše v pořádku, můžeme aplikaci spustit a v konzoli vidíme, že to bylo úspěšné – viz poslední obrázek ve druhé galerii

Kompletní kód výše uvedených procedur a balíčků je v přílohách solve.adbkva­drov.adb a kvadrov.ads.

Výše v textu jsme si popsali, jak nastavit novější sadu nástrojů v Eclipse. Jisté je, že to nebylo úplně jednoduché a přímočaré. Zkusíme to tedy obdobným způsobem u GPS a uvidíme, jaký bude výsledek. Spustíme tedy GPS včetně nějakého projektu, konkrétně Regres (jedná se o projekt, který byl vytvořen v rámci výukového kurzu a v článcích se o něm jinak nepíše. Není to ale podstatné, postup je stejný pro libovolný projekt GPS!). Použijeme ikonu v přehledu struktury projektu – Open the project properties editor a otevřeme okno s nastavením projektu. Přejdeme na záložku Languages a uvidíme stav, který ukazuje první obrázek ve třetí galerii. Jak je z obrázku patrné, je situace stejná, jako ve standardním nastavení Eclipse+GNATbench. Je to asi logické, že je to opět verze 4.8.2 pocházející z GCC-GNAT. K dispozici jsou dvě ovládací tlačítka – Scan a + Add. Vyzkoušíme to první a výsledek se nebude moc odlišovat od původního stavu – viz druhý obrázek třetí galerie. Na tomto obrázku je okno zvětšené, takže je v dolní části vidět oddíl Details → Tools a Compilers, kde jsou základní systémové nástroje pro práci s projekty GPS Ada. Nápověda nám přímo vnucuje použití tlačítka pro přidání další sady nástrojů, takže toho zkusíme využít. Klikneme tedy na tlačítko + Add a otevře se další okno New toolchain, do kterého doplníme název sady tak, jak jsme to dělali u Eclipse. Okno je vidět na třetím obrázku galerie. Po zadání názvu se na dalším obrázku objeví dvě sady nástrojů. Na tomto obrázku si povšimněte červených popisů u jednotlivých nástrojů a hlavně toho v prvním řádku – GNAT Driver. Z obrázku jsou patrné dvě věci:

root_podpora

  1. položku nelze následně uživatelsky změnit či nastavit
  2. název položky se nastaví automaticky podle vzoru ZadanyNazev-gnat

Pátý obrázek třetí galerie ukazuje zásadní problém, který tím vzniká – žádný soubor tohoto názvu není k dispozici v systémové cestě. On ani vlastně být nemůže, protože žádný takový soubor neexistuje! Jediné, co máme k dispozici, je systémová proměnná, která ukazuje do adresáře /usr/gnat/2014/bin a zde je soubor s názvem gnat. Poslední tři obrázky ve třetí galerii ukazují několik marných pokusů. Zde jsem zkoušel různá zadání názvu s odkazy na příslušné adresáře, vytvoření odkazu na soubor gnat s příslušným názvem atd. Nebudu zde vše zbytečně popisovat, protože to vždy skončilo nějakým nezdarem – častými pády GPS, problémy s hlášením, že některé nástroje jsou definované dvakrát, odmítnutí překladu apod. To bylo docela nepříjemné překvapení a musel jsem se zamyslet nad tím, jak celou situaci řešit. Bylo samozřejmě možné používat Eclipse a GPS nechat stranou. Druhou možností bylo použití GPS jenom pro systémovou sadu nástrojů. Oboje mi ale přišlo nepříliš vhodné. GPS má totiž svoje neoddiskutovatelné výhody a určitě by bylo nepříjemné nemoci použít nejnovější verzi GNAT. Hledal jsem tedy nějaké rozumné a schůdné řešení. Zdá se (nemám to ale ověřeno), že ve verzi GNAT PRO jde položka GNAT Driver nastavit v GPS podobně, jako v Eclipse. Nakonec se podařilo uspokojivé řešení najít a popis nutných kroků k jeho realizaci si necháme na příští díl.

V dnešním dílu jsme se vývojovým prostředím Eclipse zabývali trochu podrobněji a zahájili práci na úpravě GPS na nejnovější sadu nástrojů GNAT. V příštím dílu si ukážeme, jak tuto úpravu provést a také si porovnáme obě popsaná vývojová prostředí. Zahájíme také popis nástroje pro vývoj aplikací s grafickým rozhraním GtkAda.

Byl pro vás článek přínosný?