Elaboráció (Parancssori paraméterek rendezése)
Ebben a cikkünkben az elaboráció fogalmával ismerkedünk.
Az elaboráció nem más, mint a deklarációk kiértékelődése (végrehajtása).
A folyamat és annak ismerete fontos szerepet játszik a programunk tervezésekor, fordításakor és későbbi futtatásakor is. (Szorosan kötődik a nyelvhez és annak implementációjához.)
Ennek a mechanizmusnak a segítségével olyan programrészeket írhatunk, amelyek még a főprogram futtatása előtt ((esetenként még fordítási időben)) végrehajtódnak, és ezáltal segítenek a megfelelő kezdeti állapotba hozni a programunkat...
Az ilyen kódrészekre azonban fokozott figyelmet kell fordítanunk. Az elaborációs időben fellépő hibák és kivételek sok esetben nehezen kezelhetőek, és néha a nem megfelelő tervezésre vezethetőek vissza.
A GNAT fordító számos segítséget nyújt az elaborációs hibák elkerüléséhez (azáltal, hogy alapértelmezett viselkedésként tulajdonképpen a fordítónak, magának szóló utasításokat (pragmákat) helyez el a programunkban, még a tényleges fordítás előtt), de ennek hátrányai is vannak. (A pragmákkal fokozatosan ismerkedünk a későbbiek folyamán.) (Megjegyezzük, hogy bár az elaborációs körökről fordítási időben értesülünk, ez nem mondható el általában az elaborációs hibákról.) Amennyiben olyan programot szeretnénk írni Ada nyelven, amely más fordítók használatával is biztosan lefordítható és elvárásainknak megfelelően működik, ismernünk kell, hogy hogyan befolyásolhatjuk programegységeink „elkészítésének” valamit változó- és típusdeklarációink kiértékelődésének a sorrendjét.
Ahhoz, hogy biztos ismereteink legyenek az elaboráció folyamatával kapcsolatban, a részletek miatt mindig tanulmányozzuk az Ada referencia könyvét.
Ebben a programunkban az összefésüléses rendezést mutatjuk be egy szokatlan formában.
Mivel az algoritmus működése és különböző megvalósításai jól ismertek, a hatékony implementáció helyett egy az elaboráció fogalmával megismertető formát választottunk.
A bemutatott megközelítéssel a rendezés nem más, mint egy generic csomag példányosítása.
Láthatunk példát in out módú sablon csomag paraméterre is.
Ezenfelül megmutatjuk azt is, hogy egy bizonyos implementáció választásának hatására milyen bonyolult összefüggések állhatnak elő a programrészeink között.
megjegyzések:
Létezik egy széles körben elterjedt inicializálási módszer, ahol a „tényleges utasítások” előtt (egységenként egy-) egy inicializáló eljárás / metódus meghívásával állítjuk be a programunk bonyolult kezdőállapotát (ezáltal az inicializálást nem az Environment Task végzi a használt pragmák figyelembevételével, hanem mi magunk végezzük el azt). Ezt a megközelítést használva tehát nincsen szükség arra, hogy inicializálásra a csomag törzsének utasításait használjuk. (Ez generált kódok esetében is gyakori módszer.)
Egy másik módszer szerint az elaborációs inicializáló kódokat gyerekcsomagokban helyezzük el...
A pragmákat funkciójuktól függően kódunk meghatározott részeinél helyezhetjük el. (pl. a with-ek alá írjuk azokat, amit másoktól követelünk meg, a „mi” specifikációnkba pedig azokat a dolgokat, amelyeket magunktól várunk el. Megjegyezzük, mivel a pragmák a fordítónak szólnak, ha olyan programot szeretnénk írni amely több különböző fordítóval is lefordítható sokszor a kényelmesnél összetettebb megoldást kell választanunk.)
Az elaboráció folyamatához kapcsolódó számos pragmával hatékonyabbá / egyszerűbbé tehetjük a programunkat azáltal, hogy nem kell ellenőriznünk olyan dolgokat, amelyeknek megköveteljük a teljesülését. (például bizonyos csomagoktól megkövetelhetjük, hogy „korábban készüljenek el” mint más csomagok, ezáltal az utóbbiak biztosan tudják használni a előbbiek által nyújtott szolgáltatásokat.)
Egyszerűbbé tisztábbá tehetjük az inicializálási folyamatot (pragma Pure), azáltal, hogy kijelentjük a fordító számára / megköveteljük magunktól, hogy csomagunkat olyan módon készítjük el, hogy annak ne legyen állapota (nem tartalmaz „globális” változókat a specifikációja és törzse), elaborációs kódja, és ne tartalmazzon taskot sem védett egységet valamint bizonyos fajta típusdeklarációkat (pl. névvel ellátott mutató típusokat) sem.
A pragma Preelaborate enyhít ezeken a megszorításokon...
Mindig tanulmányozzuk a referenciakönyvet és az adott fordító dokumentációját, ha pragmákat szeretnénk használni!
rendezett_parancssori_parameterek.ads
rendezett_parancssori_parameterek.adb
parancssori_parameterek_rendezese.adb
Attachment | Size |
---|---|
elaboracio.zip | 3.27 KB |