Programozási paradigmák Az imperatív paradigma II. Vadász 1 Típusok, deklarációk ortogonalitása Bármely típus-konstruktornál alkalmazható bármely már definiált típus (ez korlátlan ortogonalitást jelent). A compiler megvalósítások korlátozhatnak. Megkülönböztethetünk kombinációs ortogonalitást, fajta szerinti ortogonalitást és számbeli ortogonalitást. Vadász 2 Kombinációs ortogonalitás Akármilyen deklarációban akármilyen típusokat használhatunk. Pl. tiszta deklarációban, inicializáló deklarációban és inicializáló konstans deklarációban alaptípusok, tömbök, rekordok stb. deklarálhatók Ez az ortogonalitás a C-ben néha sérül. Vadász 3
Fajta ortogonalitás Ha egy S fajta tagja értelemszerűen használható, akkor akármelyik tagja is használható. A kombinációs ortogonalitás alesete ez valójában. Pl. ha egy rekord tagja lehet alaptípusú, akkor tag lehet tömb, tag lehet rekord s.í.t. C és ADA megfelel ennek! (És a rekurzív struktúra?) Vadász 4 Számbeli ortogonalitás Ha egy S fajta tagja értelemszerűen használható, akkor 0 vagy több tagja is használható. Pl. ahol egy deklaráció használható, ott zéró számú vagy több deklaráció is használható. A zéró változat néha speciális jelölést kíván. Vadász 5 Az ortogonalitás Tisztává tesz egy nyelvet! Fölösleges kérdéseket elkerülhetünk vele! És persze, nemcsak a deklarációkban lehet ortogonalitás.. Nézzük még meg a C-beli komplex deklarációkat... Példa Vadász 6
A C pointerezésből jövő gondolat... A pointer változó tartalmazhat függvény címet is. Ez is adat! Függvény cím versus függvény hívás: mindkettő értéket szolgáltat (de mást és mást). A függvény hívás operátora a függvény címére hat. Szemantikája Képezhetünk tömböt függvény belépési címekből. Indexelésük lehetséges, A példa folyt. Vadász 7 Típusegyezőség Type equivalence: mikor egyeznek típusok? Két fajtája: Strukturális egyezőség: ha a két típus értékkészlete és operációkészlete megegyezik. Kevésbé szigorú. Név egyezőség (csak névvel ellátott típusoknál van értelme): a két adat ugyanolyan típusnevű. Vadász 8 Koerció, típus-átalakítás Mi történjen, ha egy szituációban T 1 típust várnánk és ott T 2 típusú adat van? Implicit konverzió lehetséges bizonyos esetekben, ez a coerció. (C-ben pl. integrális típusok szélesítő konverziója természetes. Más automatikus konverziók is vannak! Pl. float-to-int átalakítás nincs az argumentumoknál. ) A típus-előrevetés (cast) is lehetséges (és néha szükséges, ha a koerciós szabályok ellentmondásos helyzetet adnak). Példák Vadász 9
Értékadás Az állapottér (state) változtatása: belső állapot (változótér), külső állapot (I/O). Balérték (destination), jobbérték fogalom. <left-value><assg-op><expression><delimiter> Értékadó operátorok értékadó kifejezés (mellékhatással) (C-ben), értékadó utasítás. Szimultán értékadás. Példák Vadász 10 Kifejezések (expressions) Operátorokkal összekötött operandusokból álló szerkezet, ami kiértékelhető, kiértékelődik és megjelenik egy adott típusú érték. Operátorok precedenciája, asszociativitása: az operátorok kötődését határozzák meg, közvetve hatnak a kiértékelés sorrendjére. Zárójelezés szerepe. Vadász 11 Operátorok osztályozása Operandusok száma szerint monadic, unary: egyoperandusú, dyadic, binary: kétoperandusú, ternary: háromoperandusú. Helyzetük szerint: infix, prefix, postfix. Vadász 12
Operátor-túlterhelés Tradicionálisan túlterheltek az operátorok. Keveredhetnek bizonyos típusok: automatikus konverziók végbemehetnek (coertion). különlegesnek tűnő operátorok is lehetnek. A függvényezés tekinthető az operációk halmazának bővítéseként (ekkor a szigorú imperatív elvet feladjuk). A resricted operátorok igénye felmerülhet Vadász 13 Input/output A külső állapot fogalma. Egyes nyelvekben I/O utasítások, más nyelvekben I/O függvények/eljárások. Nagymértékben függ az operációs rendszertől, nemcsak a nyelvtől! Az alapgondolat: csatornát nyitunk/zárunk, melybe/melyből adategységeket mozgatunk. Vadász 14 Fájlkezelés Tekinthetők egy adott típusú adatszerkezetnek. Fájl-szervezés (organisation): az OS szerepe. szekvenciális, direkt, indexelt szekvenciális. Fájl-elérés: függhet a szervezéstől is. soros, véletlen. Vadász 15
A vezérlés menete Flow of Control : imperatív nyelvekben a programozó teljes kontrollja. Alapszerkezetek: soros végrehajtás, választások, elágazások, ismétlések, hurkok, ciklusok. Rutinhívás Megjegyzés Vadász 16 Utasítások (statements) Utasítás test (body) fogalom. Utasítás határolók Egyszerű utasítás, Üres utasítás (számbeli ortogonalitás!), Összetett utasítás (ortogonalitást segíti, ha úgy kezelhető, mint az egyszerű). Utasítások ortogonalitása A modern nyelvek fajta ortogonalitás szempontból ortogonálisak, a számbeli ortogonalitáshoz van, ahol kellenek összetett utasításhatárolók. Vadász 17 Utasítás címkék, goto Goto statement is considered harmful Miért? lehetőleg egyezzen a program szöveg szerkezete (térbeli szerkezet) és a végrehajtás menete (időbeliség). Így a hibakeresés, programböngészés könnyebb. A goto ezt sérti. Vadász 18
Soros szerkezet Egymás utáni utasítások: tedd ezt, azután ezt s.í.t. Igen gyakori szerkezet. Összetett utasítások, null utasítás is! A goto: ugrás. Vadász 19 if utasítás switch, case utasítás Választások Vadász 20 Ciklusok Ismétlés egy előre kalkulált számszor, ismétlés, amíg egy feltétel fennáll (vagy bekövetkezik). while (elől tesztelő, hátul tesztelő) until (hátul tesztelő, elől tesztelő) for (ciklusváltozó fogalom, listás) Vadász 21
Ciklusból való kilépés A ciklus teste fogalom. break (exit), continue (, return) megszakító utasítások szerepe. Ez elfogadható. goto veszély: ciklusból kiugrásban, ciklus testre ugrásban. Vadász 22 Esemény és hibakezelés Esemény, feltétel állapot. Esemény jelződése. Esemény lekezelés: handlerek. Megszakítás (IT), hiba (exeption), klasszikus esemény (event). Váratlanság, szinkronitás, aszinkronitás. Vadász 23 Futás idei hibák Domain/data errors (synchronous) Pl., túlcsordulás. Resource exhaustion (synchronous, asynchronous) pl. memória allokálásnál memóriahiány, stack kimerülés. Loss of facilities (asynchronous) pl. kapcsolat (connection) megszűnés. Vadász 24
Handlerek A normál végrehajtás menetét abba kell hagyni (instrukciót? rutint? processzt?), a dinamikus kontextust lementeni (legfontosabb a PSW-PC) Fusson a kezelő. Terminálódás, vagy a vezérlés visszaadható (instrukcióra?, a következőre?, rutin elejére?, a következő rutinra?) Vadász 25 A program összeállítás Deklarációkból és utasításokból lehet programot összeállítani (ha a deklaráció is utasítás?) A nagyobb programegységek hierarchiája: blokkok rutinok (eljárások, függvények), modulok (packages, tasks), program(ok). Vadász 26 Blokk Kezdő-vég zárójelekkel deklarációk és utasítások. Blokkbeágyazás (általában) lehetséges. Láthatósági szabályok vannak (nyelvektől függően). Beágyazott blokkokban vannak név definíciós előfordulások, és név hivatkozási előfordulások: és a kérdés az, hogy egy név hivatkozás előforduláskor melyik definícióhoz kötődik a név. Ha a kötődést a fordító elintézi: static binding. Ha futásidőben: dynamic binding. Vadász 27
Scope, visibility A scope: az a terület, amire a deklaráció kiterjed. Jó szabály: deklaráció a használat előtt. Ez probléma rekurzív elemeknél. Erre: forward declaration megoldás (a név létezzen, majd megmondjuk milyen az). Tipikus példa a függvény prototype is. Visibility range: az a terület a scope-on belül, amin kötődik. Mi lehet a nem-láthatóság oka? Más a scope egy újra deklarálással, Rekord mező hivatkozásban a kiválasztó operátor mást tesz láthatóvá... Vadász 28 Lifetime, kontextuális scope szabályok Lifetime: az a futási idő, amin belül az entitás létezésére számíthatunk. Kontextuális scope szabály: függvénynév túlterhelésnél az aktuális argumentum szignatúra mondja meg, mi is kötődik (ADA igen, C nem) Vadász 29 Alprogramok Blokkok (deklarációk, utasítások) olyan együttese, ami explicite meghívható. Meghívásra lefut. Visszatérve ott folytatódik, ahol meghívták. Fogalmak: rutin fej, rutin test, rutin hívás, formális és aktuális paraméterek (argumentumok), argumentumátadás. Eljárások, függvények Operátor versus rutin Vadász 30
Modulok és csomagok Alprogramok (+ deklarációk és utasítások) együttese. Elemeihez való hozzáférés szabályozása miatt csoportosítunk modulokba, csomagokba. Felépítésük: specifikációs rész, implementációs rész. Vadász 31 Összefoglalás Az imperatív programozási nyelvek lehetővé teszik, hogy a programozó algoritmusokat programozzon, amik pontosan megszabják hogyan oldjuk meg a adott problémát. A számítógépi modell állapotokat, állapotátmeneteket használ, a program futása az állapotátmenetek sorozata. Az állapottér sokdimenziós, a program változói, a perifériák állapotai képezik, melyeken maga a program - értékadásokkal - manipulációkat végez. Az állapotátmenetek kulcsfogalma a vezérlés menete, ami valójában a programszámláló regiszter felvett értékeinek sorozata. Vadász 32 Irodalom H. E Bal, D. Grune: Programming Language Essentials, Addison-Wesley, 1994. ISBN 0-201-63179-2 Vadász D.: Operációs rendszerek, Jegyzet, ME. 2006. http://ww.iit.uni-miskolc.hu/~vadasz/geial202 Vadász 33