Programozási Paradigmák Programozási paradigmák, Számítási modellek előadás http://nik.uni-obuda.hu/prog2 Szénási Sándor szenasi.sandor@nik.uni-obuda.hu Óbudai Egyetem,Neumann János Informatikai Kar
Programozási Paradigmák Számítási modellek Strukturált programozási paradigma Funkcionális programozási paradigma Logikai programozási paradigma Adatfolyam programozási paradigma Objektumorientált programozási paradigma
Programfejlesztés folyamata szenasi.sandor@nik.uni-obuda.hu 3 A tárgy keretein belül a programfejlesztés folyamatából csak a tervezés lépéseivel foglalkozunk Ennek célja a kitűzött feladatot megoldó algoritmus (program) megtervezése Ez további szintekre bontható előzetes tervezés architektúra finom tervezés algoritmusok Ezen a szinten implementációs kérdésekkel nem foglalkozunk, így konkrét nyelvi megvalósítás sem kerül szóba (bár értelemszerűen olyan megoldást részesítünk előnyben, ami illeszkedik a fejlesztés későbbi fázisaihoz) Analízis Tervezés Implementáció Tesztelés
4 Számítási modell fogalma Számítási modellek Választási szempontjai Feladat jellege Hardver nyújtotta lehetőségek Részletesen foglalkozunk velük Neumann modell Objektumalapú modell Applikatív modell Predikátumlogikán alapuló modell Adatfolyam modell Nem foglalkozunk velük Turing modell Neurális modell Sejthálózatos modell Szabályalapú modell Stb.
5 Számítási modellek jellemzői Számítógép architektúrák és programozási nyelvek egymásnak általában megfeleltethetők, pl.: Neumann-féle számítógépek imperatív nyelvek Redukciós gépek funkcionális nyelvek A számítási modell egy ezek fölött álló fogalom, ami összeköti őket: Programozási nyelveket (nyelvcsaládokat) Számítógép architektúrákat Számítási modellek jellemzői Számítások alapelemei Adatok és rajtuk végrehajtható műveletek Objektumok és nekik küldhető üzenetek Argumentumok és azokon értelmezhető függvények Halmazok elemei és rajtuk deklarált predikátumok Problémaleírás jellege Imperatív problémaleírás hogyan? A feladatot megoldó algoritmust határozzuk meg Deklaratív problémaleírás mit? A megoldáshoz szükséges tényeket és összefüggéseket határozzuk meg
6 Számítási modellek jellemzői (2) Számítási modellek jellemzői (folyt.) Végrehajtási szemantika Állapotátmenet szemantika Adatfolyam szemantika Redukciós szemantika SLD-rezolúció Végrehajtás folyamata Közvetlen vezérlésű végrehajtás A végrehajtási sorrendet az utasítások sorrendje határozza meg Adatvezérelt végrehajtás (mohó kiértékelés) Egy-egy művelet azonnal végrehajtódik, ha a művelethez szükséges adatok rendelkezésre állnak Igényvezérelt végrehajtás (lusta kiértékelés) A műveletek csak akkor hajtódnak végre, ha azok a végeredmény eléréséhez szükségessé válnak Modellek különböző absztrakciós szintjei
7 Számítási modellek versenye Számítási modelleken alapuló architektúrák megjelenése Logikai alapú számítási modell Funkcionális számítási modell Adatfolyam számítási modell Neumann-féle számítási modell 1950 1960 1970 1980 1990 2000
Számítási modellek Neumann-féle modell Applikatív modell Predikátumlogika-alapú modell Adatfolyam modell Objektumalapú modell Programozási Paradigmák
9 Neumann-féle számítási modell Strukturált programozási paradigma kapcsolódik hozzá Legrégebbi és napjainkban is leginkább használt modell Általános számítási feladatokra nagyon jól használható Könnyen és hatékonyan implementálható Architekturális megvalósítások Neumann-féle számítógépek Számítások alapelemei az adatok, ahol számítás alatt az adatokon végzett műveleteket értjük Nevesített adatelemeket változónak nevezzük Meghatározott memória vagy regiszterhelyekben helyezkednek el Többszöri értékadás megengedett Változók aktuális értéke múltérzékeny Ez mellékhatásokhoz vezethet Problémaleírás imperatív, mivel a számítási feladatot utasítások sorozatával adjuk meg
10 Neumann-féle számítási modell (2) A programot alkotó utasítások végrehajtása állapotátmenet szemantikát követ A végrehajtás során az aktuális állapotot az összes deklarált változó (és további technikai adatok) aktuális értéke határozza meg Végrehajtás vezérlés módja közvetlen vezérlés Alapvetően soros végrehajtást feltételez Kiegészíthető a párhuzamosan futtatható részek megjelölésének lehetőségével (folyamat, szál fogalom) Kommunikáció biztosítása Szinkronizáció biztosítása Adatmegosztás biztosítása Konkrét nyelvi megvalósítások Fortran, Algol, C, Pascal
Relációalapú modell szenasi.sandor@nik.uni-obuda.hu 11 Cél: Neumann-féle számítási modell viselkedésének bemutatása Állapottér Elemei tartalmazzák a lehetséges állapotokat Ezek komponensei a modellezni kívánt jellemzők Feladat Az állapottér minden pontjához hozzárendel egy vagy több pontot Példáinkban általában azt feltételezzük, hogy csak egy pontot rendelünk hozzá Nem feltétlenül determinisztikus, bár a gyakorlatban általában ezt feltételezzük (1, 4, 1) (1, 4, 2) (1, 4, 3) (1, 5, 1) (1, 5, 2) (1, 5, 3) (2, 4, 1) (2, 4, 2) (2, 4, 3) (2, 5, 1) (2, 5, 2) (,, )
Relációalapú modell (2) szenasi.sandor@nik.uni-obuda.hu 12 Program Időben dinamikus folyamat Futását állapotok sorozataként tudjuk egyszerűen leírni Az állapottér minden pontjához hozzárendel egy ilyen sorozatot Működése nem feltétlenül determinisztikus Programfüggvény A gyakorlatban a program futásának menete lényegtelen, csak a kiinduló és a vég állapot lényeges számunkra Egy program programfüggvénye hozzárendeli a kiinduló állapothoz a vég állapotot (ha van ilyen) (1, 4, 1) (1, 4, 2) (1, 4, 3) (1, 5, 1) (1, 5, 2) (1, 5, 3) (2, 4, 1) (2, 4, 2) (2, 4, 3) (2, 5, 1) (2, 5, 2) (,, )
Relációalapú modell (3) szenasi.sandor@nik.uni-obuda.hu 13 Feladat programfüggvény Látjuk, hogy a programfüggvény ugyanolyan típusú reláció, mint a feladat volt (az állapottér egy pontjához hozzárendelik az állapottér egy vagy több pontját) Ennek segítségével egyszerű kapcsolatot teremthetünk egy adott feladat és egy adott program között Megoldás Egy programot egy feladat megoldásának tekintjük, ha bármelyik lehetséges bemenethez a programfüggvény a feladat által meghatározott állapotokat rendeli (vagy annál szűkebb halmazt) (1, 4, 1) (1, 4, 2) (1, 4, 3) (1, 5, 1) (1, 5, 2) (1, 5, 3) (2, 4, 1) (2, 4, 2) (2, 4, 3) (2, 5, 1) (2, 5, 2) (,, )
14 Strukturált programozás paradigma Strukturált programnak tekintjük azokat a programokat, amelyek csak a megengedett elemi programokat tartalmazzák a megengedett programkonstrukciók alkalmazásával Relációs modellben értelmezhető elemi programok üres program hibás program/törlődés értékadás (állapot változtatás) Megengedett konstrukciók szekvencia elágazás ciklus Bizonyítható, hogy a fenti szabályok megtartásával minden algoritmussal megoldható feladatra adható megoldás
15 Szekvencia Egy programot közvetlenül egy másik után végzünk el S (, ) 1 S (, ) 2 (, ) Jelölése struktogramban S 1 S 2 Általunk használt pszeudokód S 1 S 2
16 Elágazás Adott N darab feltétel program páros, az igaz feltételekhez tartozó programok végrehajtása (, ) Gyakorlatban ennek csak egy egyszerűsítésével foglalkozunk, ahol N=2, és a feltételek diszjunktak Jelölése struktogramban S 1 S 1 (, ) Általunk használt pszeudokód L (, ) Ha L akkor S 1 Különben S 2 elágazás vége (, ) S 2 (, ) (, ) (, ) S 2 S 2 (, ) S 1 (, ) (, ) (, ) (, )
17 Ciklus Megadott feltétel teljesülése esetén egy program (ciklusmag) végrehajtása (L?) S (L?) S (L?) S (L?) S (, ) (, ) (, ) Jelölése struktogramban L S A programozási nyelvek általában többféle ciklust ismernek, ennek megfelelően a pszeudokódban is többfélét használunk: (, ) ciklus amíg L S ciklus vége ciklus S ciklus amíg L ciklus i i 0 -től i 1 -ig S(i) ciklus vége Mindhárom egyszerűen helyettesíthető az elsővel
Összetett feladatok megoldása szenasi.sandor@nik.uni-obuda.hu 18 Funkció-orientált programtervezés Levezetés Analóg programozás Moduláris programozás Analóg levezetés Visszavezetés Levezetés A levezetés egy olyan módszer, amelyik a feladat megoldó programját lépésről lépésre alakítja át megengedett megoldássá, és ehhez a nevezetes programszerkezeteket használja fel A feladat triviális megoldásából indulunk ki, és folyamatosan felbontjuk a strukturált programozásnál megismert szerkezetek segítségével. Véget ér, ha egy megengedett programhoz érünk A levezetés menete biztosítja, hogy ez a program helyes lesz
Összetett feladatok megoldása szenasi.sandor@nik.uni-obuda.hu 19 Funkció-orientált programtervezés Levezetés Analóg programozás Moduláris programozás Analóg levezetés Visszavezetés Analóg programozás A gyakorlatban általánosan használt technika Alapja, hogy ha olyan feladatot kell megoldanunk, amelyhez hasonlóhoz rendelkezünk már megoldással, akkor az előző megoldás módosításával próbáljuk előállítani a programot Ez nyilván számos megoldott feladat ismeretét igényli és nagy tapasztalatot, szakértelmet (gyakorlást)
Összetett feladatok megoldása szenasi.sandor@nik.uni-obuda.hu 20 Funkció-orientált programtervezés Levezetés Analóg programozás Moduláris programozás Analóg levezetés Visszavezetés Analóg levezetés Az analóg programozási technikák jelentősen eltérhetnek egymástól aszerint, hogy milyen mértékben hagyatkoznak a már ismert megoldás levezetésére Az analóg levezetés alapelve, hogy a megoldandó feladat levezetését átvizsgáljuk, és az ott hozott döntéseket az új levezetés során felülvizsgáljuk, esetenként átvesszük
Összetett feladatok megoldása szenasi.sandor@nik.uni-obuda.hu 21 Funkció-orientált programtervezés Levezetés Analóg programozás Moduláris programozás Analóg levezetés Visszavezetés Visszavezetés Az analóg levezetéshez képest jelentős különbséget jelent, hogy ebben az esetben nem a mintaprogram előállítási folyamatait ismételjük meg, hanem magát a mintaprogramot adaptáljuk az új feladatnak megfelelően Ez a technika kellő elővigyázatossággal a gyakorlatban jól használható Ehhez természetesen szükség van már levezett mintaprogramok gyűjteményére lásd programozási tételek
Összetett feladatok megoldása szenasi.sandor@nik.uni-obuda.hu 22 Funkció-orientált programtervezés Levezetés Analóg programozás Moduláris programozás Analóg levezetés Visszavezetés Moduláris programozás A teljes feladatot részekre bontjuk, majd ezeket a visszavezetés módszerével megoldjuk A kész modulokból lehet összeépíteni egy működő új rendszert Minden felbontással egy alacsonyabb absztrakciós szintre léphetünk A modulok egymástól minél kevésbé függjenek A program felépítése így egyszerűbb és egyszerűbben karbantarthatóvá válik
Számítási modellek Neumann-féle modell Applikatív modell Predikátumlogika-alapú modell Adatfolyam modell Objektumalapú modell Programozási Paradigmák
24 Applikatív számítási modell Funkcionális programozási paradigma kapcsolható hozzá Az első funkcionális nyelvek alapja a λ-kalkulus. Ez alapvetően lambda kifejezésekkel dolgozik, amelyek lehetnek: absztrakció: λx.(x*x+1) applikáció (alkalmazás): λx.(x*x+1) 5 Ezek azonosan kezelhetők más objektumokkal (lehet paraméter, stb.) Számítások alapelemei argumentumok és függvények Nevek nem változókat azonosítanak, hanem kifejezések neveit Egy függvény lehet egy másik függvény paramétere és értéke is Problémaleírás deklaratív Típusdefiníciók (alaptípusok, párok, n-esek, listák) függvénydefiníciók függvény neve függvény paraméterei kifejezés érték, formális paraméter, absztrakció, applikáció Egy kiértékelhető kezdő kifejezés
25 Applikatív számítási modell (2) A végrehajtási szemantika a redukció Redukciós szabályok alkalmazása (behelyettesítés, átnevezés) Kiértékelés sorrendje nem mindig kötött Végrehajtás vezérlése lehet Mohó kiértékelés: a függvény hívásakor az argumentumok azonnal kiértékelődnek (ezt használják a szigorú funkcionális nyelvek) Lusta kiértékelés: a függvény argumentuma csak akkor értékelődik ki, ha arra ténylegesen szükség van (normál formát előállítja) Egyszerű funkcionális nyelvek Nincsenek mellékhatások A program végrehajtása nem feltétlenül szekvenciális Használhatósága Nyelvek szintaxisa közeli a matematikai modellekhez Egyszerű helyességbizonyíthatóság Mellékhatások hiánya miatt jól párhuzamosítható kiértékelés Gyakorlati nehézségek (I/O kezelés, monádok stb.) Konkrét nyelvi megvalósítások: Scheme, F#,
26 Funkcionális programozás példa Egy rendezést megvalósító funkcionális program(részlet) függvények rendez [ ] = [ ] rendez [első : többi] = egyesít ( rendez ( válogat (x x <= első) többi ) ) első ( rendez ( válogat (x x > első) többi ) ) válogat feltétel [ ] = [ ] válogat feltétel [ x : y ] ha (feltétel) = [ x : válogat feltétel y] különben = válogat feltétel y Kezdőkifejezés Start = rendez [ 5, 8, 9, 1, 7, 6 ]
Programozási Paradigmák Számítási modellek Neumann-féle modell Applikatív modell Predikátumlogika-alapú modell Adatfolyam modell Objektumalapú modell
28 Predikátumlogikán alapuló modell Logikai programozási paradigma kapcsolódik hozzá Számítások alapelemei tények és szabályok A logikai programozás alapja a Horn logika Horn-klóz: egy állítás igaz, ha zéró vagy több más feltétel igaz Következmény Feltétel 1 Feltétel 2... Problémaleírás deklaratív Tények felsorolása (feltétel nélküli klóz) Szabályok felsorolása (feltétellel rendelkező klóz) Célállítás meghatározása Következtető motor a szabályok és tények alapján dönt Pozitív válasz: a célállítás kikövetkeztethető a megadott tényekből Negatív válasz: a kezdeti cél nem következtethető ki Nincs válasz: végtelen ciklus vagy túl nagy a probléma tér Lehetséges kérdés típusok Egy feltevés igaz-e vagy sem Létezik-e valami ami a feltételnek megfelel Stb.
Predikátumlogikán alapuló modell (2) A végrehajtás szemantikája az SLD-rezolúció Igazolhat egy kérdést a szabályok és tények közötti kereséssel Általában indirekt bizonyítást végez Levezetési szabályokat alkalmaz addig, amíg ellentmondást talál, vagy további átírás nem lehetséges A pontos szemantikát a következtető gép határozza meg A végrehajtás vezérlési módja lusta kiértékelés Mintaillesztés: megpróbál a kérdésnek megfelelő mintákat keresni a tények és szabályok között ha az aktuális állapot csak konstansokat tartalmaz, akkor eldöntés egyébként megpróbál behelyettesíteni (változóknak értéket ad) Visszalépés: ha az adott úton elakad, akkor visszalépés (backtrack) A gyakorlatban jóval összetettebb (tagadás, vágás, rekurzió, stb.) Használhatósága Szakértői rendszerek, mesterséges intelligencia Nagy rendszerek esetén nehezen áttekinthető Konkrét nyelvi megvalósítások Prolog, egyéb Prolog leszármazottak szenasi.sandor@nik.uni-obuda.hu 29
30 Logikai programozás példa Rokonsági kapcsolatokon alapuló szabályok (a szülő nem Horn klóz!) Szabályok Szülő(X,Y) Apa(X,Y) Anya(X,Y) Testvér(X,Y) Szülő(Z, X) Szülő(Z, Y) Tények Anya(Klári, Jancsi) Apa(Péter, Jancsi) Apa(Péter, Ilona) Anya(Klári, Zoltán) Kérdések? Testvér(Jancsi, Ilona) Testvér Jancsi és Ilona?? Testvér(?, Ilona) Kik Ilona testvérei (ha vannak)?? Testvér(?,?) Kik testvérek (ha vannak)?
Számítási modellek Neumann-féle modell Applikatív modell Predikátumlogika-alapú modell Adatfolyam modell Objektumalapú modell Programozási Paradigmák
32 Adatfolyam-elvű számítási modell Adatfolyam-elvű programozási paradigmához kapcsolódik Az adaton van a hangsúly, a műveletek másodlagosak Számítások alapelemei az adatok és a hozzájuk rendelt adatműveletek Problémaleírás imperatív (más paradigmák) A végrehajtási szemantika az adatfolyam szemantika Adatok kiértékelése rendelkezésre álláskor Adatvezérelt (mohó kiértékelés) A bemenő adatok áthaladnak az adatáramlási diagramon, ennek eredményeképpen jönnek létre a kimenő adatok.........
33 Adatfolyamelvű számítási modell (2) Program felépítése Bemenet, kimenet Kettő közötti kapcsolatok (adatfolyam) kialakítása Tipikus felhasználási kör Adatgyűjtő eszközök Műszervezérlés Ipari automatizálás Jellemzői Jól párhuzamosítható Bizonyos feladatok látványosan leírhatóak segítségével Konkrét nyelv LabVIEW
Számítási modellek Neumann-féle modell Applikatív modell Predikátumlogika-alapú modell Adatfolyam modell Objektumalapú modell Programozási Paradigmák
35 Objektumalapú számítási modell Objektumorientált programozási paradigma kapcsolódik hozzá Számítások alapelemei az objektumok, amelyek egy előre definiált üzenetkészletet tudnak feldolgozni. Szintén adatorientált nyelv Az adatok és a rajtuk végezhető műveleteket rendeli össze objektumokká Az objektumok között üzenetek áramlanak Problémaleírás ebben az esetben is imperatív, mivel a megoldás algoritmusát kell megadnunk Utasítások végrehajtása állapotátmenet szemantikát követ Megadott üzenetsorozatot kell végrehajtani a rendelkezésre álló objektumokkal Nem feltételez soros végrehajtást
36 Objektumorientált paradigma főbb jellemzői Cél: minden adat és hozzátartozó funkció egy helyen OOP nyelvek jellemzői Modularizált Áttekinthető, karbantartható Gyorsabb és biztonságosabb szoftverfejlesztés Újrafelhasználhatóságot támogatja Alapfogalmak Objektum Mezők Metódusok Speciális metódusok Osztály Egy adott objektumtípust határoz meg Üzenet Objektumok közötti kommunikáció Példány osztály szintű tagok
37 Objektumorientált paradigma alapelvei Absztrakció Elemek meghatározása Elemek kapcsolatainak meghatározása Egységbezárás Adatok és műveletek szoros egysége Objektum felelős a feladatai elvégzéséért Adatrejtés Privát adattagok Nyilvános adatok Öröklés Meglévő típus alapján készíthetünk új típust Polimorfizmus Ugyanarra az üzenetre megvalósítástól függően másképp reagálhatnak különböző objektumok Kódújrafelhasználás
38 Programtervezési minták Gyakran előforduló problémákra adnak jól kidolgozott, a gyakorlatban már bevált válaszokat Tervezési idő csökkentése Hatékonyság és minőség növelése Fejlesztők által általánosan ismertek A minták vonatkozhatnak Objektumok közötti kapcsolatokra Osztályok közötti kapcsolatokra Egy lehetséges csoportosítás Létrehozási minták Objektumpéldányok létrehozására vonatkoznak Szerkezeti minták Objektumok közötti kapcsolatok Viselkedési minták Objektumok működésére vonatkozó minták
39 Irodalomjegyzék Javasolt/felhasznált irodalom Sergyán Szabolcs, Vámossy Zoltán és Miklós Árpád diasorozatai, Óbudai Egyetem, AAO tárgy Sima, Fountain, Kacsuk: Korszerű számítógép-architektúrák tervezésitérmegközelítésben, SZAK Kiadó, 1998 Fóthi Á.: Bevezetés a programozáshoz, ELTE Eötvös Kiadó, 2005 Pap, Szlávi, Zsakó: μlógia19 Módszeres programozás: Programozási tételek, ELTE TTK, 2002 Gregorics Tibor: A programozás alapjai Tervezés Papp Zoltán: Lambda-kalkulus Lehet Csató: Logikai és funkcionális programozás Magyar Attila: LabVIEW Túri József Attila: A logikai programozás és alkalmazásai a Prolog programozási nyelvben