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 T1 típust várnánk és ott T2 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).
Vadász
Példák
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.
<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: Megjegyzés – – – –
soros végrehajtás, választások, elágazások, ismétlések, hurkok, ciklusok. Rutinhívá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
Választások • if utasítás • switch, case utasítás
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 Vadász
Operátor versus rutin
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