ProgramozásiParadigmák - Óbudai Egyetemusers.nik.uni-obuda.hu/sztf2/Paradigmak.pdf · 11...
Transcript of ProgramozásiParadigmák - Óbudai Egyetemusers.nik.uni-obuda.hu/sztf2/Paradigmak.pdf · 11...
Szoftvertervezés és -fejlesztés II. előadáshttp://nik.uni-obuda.hu/sztf2
Szénási Sá[email protected]
Óbudai Egyetem,Neumann János Informatikai Kar
Programozási Paradigmák
Programozási paradigmák, Számítási modellek
Paradigmák jellemzői
Imperatív paradigmák
Funkcionális programozás
Logikai programozás
Adatfolyam programozás
Programozási Paradigmák
Szoftvertervezés és -fejlesztés [email protected]
• Programozási nyelvek (számítási modellek) osztályozása azokjellemzői alapján, amely meghatározza– Az alapvető szintaktikát (jelölésmódot)
– Az adatok és műveletek felépítésének módját
– A feldolgozás módját
• Választási szempontjai– Feladat jellege
– Hardver nyújtotta lehetőségek
– Kor aktuális trendjei
• Tárgy keretein belül vizsgált paradigmák– Gépi kód
– Procedurális/strukturált programozás
– Objektum-orientált programozás
– Funkcionális programozás
– Logikai programozás
– Adatfolyam programozás
• Nincs egyértelmű programozási paradigma-nyelv kapcsolat
3
Programozási paradigma
Szoftvertervezés és -fejlesztés [email protected]
• Absztrakciós szint fogalma– A gépi megvalósítás részleteitől vett „távolság”
– Relatív fogalom, csak összehasonlításként értelmezhető
• Trend: egyre magasabb szint elérése– Technikai fejlettség egyre többet enged meg
– Szoftverfejlesztés hatékonysága is ezt igényli (hibatűrés, karbantarthatóság)
– Fejlesztői igények is ezt erősítik (sebesség)
• Hatékonyság kérdése– Alacsonyszintű nyelvek
• Szabad kezet ad• A program minőségét a programozó képességei befolyásolják
– Magasszintű nyelvek• Korlátozott funkciókkal bír (feladat orientáltan)• A hatékonyságot a végrehajtó motor biztosítja
• Magasszintű nyelvek megvalósítása– Fordítóprogram használata
– Interpreter megvalósítás
4
Absztrakciós szint
Szoftvertervezés és -fejlesztés [email protected]
• Imperatív– Megadás módja: hogyan kell megoldani?
– Program tipikus felépítése• Utasítások és parancsok• Vezérlési szerkezetek• Főprogram (belépési pont)
– Előnyei• Egyszerű/gépközeli megvalósítás (Neumann architektúra)• Programkészítés szabadsága
• Deklaratív– Megadás módja: mit kell megoldani?
– Program tipikus felépítése• Típusok, szabályok, függvények definíciója• Ismert tények/adatok meghatározása• Elvárt eredmény/probléma specifikálása
– Előnyei• Általában magasabb absztrakciós szint• Optimalizáció/párhuzamosítás lehetősége
5
Problémaleírás jellege
Szoftvertervezés és -fejlesztés [email protected]
• Közvetlen vezérlésű végrehajtás– A végrehajtási sorrendet az utasítások sorrendje határozza meg
– Tipikusan imperatív nyelvekre jellemző
– Automatikusan nem optimalizálható (párhuzamos végrehajtás)
• 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
– Ha nincsenek mellékhatások, akkor jól párhuzamosítható
– Egyszerűen megvalósítható
• 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
– Lehetővé válik a szimbolikus végrehajtás, és ebből adódó optimalizálás
– Speciális adatszerkezetek pl. végtelen listák kezelése (generátorok)
– Hatékony, mivel csak a szükséges feladatokat végzi el
– Gyakran együtt jár a memoization technikával
– Komplex, nagy memóriaigénnyel járhat
6
Végrehajtás folyamata
Szoftvertervezés és -fejlesztés [email protected]
• Számítási modelleken alapuló architektúrák megjelenése
7
Számítási modellek „versenye”
1950 1960 1970 1980 1990 2000
Neumann-féle számítási modell
Adatfolyam számítási modell
Funkcionális számítási modell
Logikai alapú számítási modell
2010
Szoftvertervezés és -fejlesztés [email protected]
• Eseményvezérelt paradigma– Események váltódnak ki
– Ezeket eseménykezelők fogadják
– Megfelelő interfészen keresztül kommunikálnak egymással
– Minden egyéb paradigmához kapcsolódhat
• Generikus programozás– Algoritmus írása konkrét típusok nélkül
– Modern OOP nyelvek is támogatják
• Metaprogramozás– Programkészítés magas absztrakciós szintje
– Maga a programkód is változhat futás közben
8
Másodlagos paradigmák
Paradigmák jellemzői
Imperatív paradigmák
Funkcionális programozás
Logikai programozás
Adatfolyam programozás
Programozási Paradigmák
Szoftvertervezés és -fejlesztés [email protected]
• Problémaleírás imperatív– Egy algoritmust adunk meg utasítások sorozatával
– Tehát a program magát a megoldás menetét tartalmazza
• Számítások alapelemei az adatok és a rajtuk végzett műveletek– Nevesített adatelemeket változónak nevezzük
– Meghatározott memória vagy regiszterhelyekben helyezkednek el
– A műveletek ezen változók értékét módosítják
• Végrehajtás á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
– A program futása során a rendszer egyik állapotból a másikba lép át
• Végrehajtás vezérlés módja közvetlen vezérlés– Az utasításokat a megadott sorrendben hajtja végre
– Tipikusan egy belépési ponttól halad valamely kilépési pont felé
• Absztrakciós szint– Tipikusan alacsony
– Mai nyelvek nagy osztálykönyvtárai ezt elfedik
10
Imperatív paradigmák általános jellemzői
Szoftvertervezés és -fejlesztés [email protected]
• Mellékhatások megjelenése– Az imperatív nyelvek megengedik a többszöri értékadást
– Változók aktuális értéke emiatt múltérzékeny (ugyanaz a változó különböző pillanatokban más-más értéket tartalmazhat)
– Ez mellékhatásokhoz vezethet
• Párhuzamosítás lehetősége– 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, ez azonban nem automatizálható
• Kommunikáció biztosítása• Szinkronizáció biztosítása• Adatmegosztás biztosítása
• Paradigma előnyei– Legrégebbi és legelterjedtebb (egyszerű fordítók)
– Általános számítási feladatokra nagyon jól használható
– Könnyen és hatékonyan implementálható
– Neumann-féle számítógép közvetlenül támogatja
11
Imperatív paradigma korlátai
Szoftvertervezés és -fejlesztés [email protected]
• Imperatív megvalósítás
• Gépi kód (1. generációs nyelvek)– Adott processzor utasításrendszeréhez igazodik
– Emberi szemmel nézve csak számok sorozata
– Előnyei• A lehető leghatékonyabb (memória, futásidő, stb.)• A hardver minden lehetősége kiaknázható segítségével
– Hátrányai• Minden más (karbantarthatóság, fejlesztés sebessége, stb.)
• Assembly (2. generációs nyelvek)– Ugyanaz mint a gépi kód, csak már szöveges utasításokat használ
– Számos magas szintű funkció (memóriacím helyett címkék, stb.)
– Még mindig a megadott processzorhoz tartozó utasítások
– Szükség van valamilyen fordítóprogramra
– Előnyei• A gépi kód minden előnye elérhető itt is• Sokkal barátságosabb a fejlesztő számára
12
Alacsony szintű nyelvek
Szoftvertervezés és -fejlesztés [email protected]
• Ismétlődő feladatok kezelése– Eljárások és függvények (szubrutinok) megjelenése
– Minden ilyen alprogramnak jól meghatározott feladata van
– A program folyamatában így megjelenhetnek függvényhívások is
– Ezzel együtt jár számos technikai jellemző• Paraméterek megjelenése• Függvény visszatérési értékének megjelenése• Verem kezelése
• Program felépítése– Megjelenik egy kiemelt „főprogram”, ez indul el a program indításakor
• Programozási stílus ennek megfelelően változik– Program felbontása kisebb alkotóelemekre
– Felülről lefelé bontás
– Moduláris programozás lehetőségei
• Strukturált és procedurális paradigma– A két paradigma tipikusan együtt jár
– Alapelveik mai napig elfogadottak és számos más paradigmában megjelennek
13
Procedurális programozási paradigma (3. generációs nyelvek)
Szoftvertervezés és -fejlesztés [email protected]
• Cél: nagyobb, áttekinthető programok készítése
• Program felépítése– Elemi utasítások
– Ezeket összekapcsoló struktúrák• Szekvencia• Elágazás• Ciklus
• Megjelenik számos elvi újdonság– A fenti szerkezetek egymásba ágyazhatóak
– Változók életciklusa
• Bizonyítható, hogy a fentiek véges számú alkalmazásával megoldható minden kiszámítható probléma (Böhm-Jacopini 1966, Dijkstra 1968)
• Ezt számos utasítás megszegi (goto, return, break, continue)
• A feladat felbontása tipikusan fa szerkezetet eredményez
• Nyelvek: Cobol, Fortran, Pascal, C, stb.
14
Strukturált programozási paradigma
Szoftvertervezés és -fejlesztés [email protected]
• Szükségessége: szoftverkrízis
• Alapvető elemei az objektumok, amelyek egyben tartalmazzák– Az adatokat
– Az ezeken végezhető műveleteket
• Alulról felfelé való felbontást alkalmaz
• A paradigma újdonságai– Egységbezárás (adatelrejtés)
– Öröklődés/Kompozíció
– Polimorfizmus
• Magasabb absztrakciós szintet biztosít, ahol a program felépítése:– Objektum létrehozása
– Objektumok egymás közt üzeneteket küldenek
• Háttérben viszont ugyanúgy imperatív megvalósítást feltételez
• Osztály alapú/prototípus alapú nyelvek
• Előnyei: karbantarthatóság, újrafelhasználhatóság, stb.
• Nyelvek: Smalltalk, C++, C#, Java, stb.15
Objektumorientált programozási paradigma
Paradigmák jellemzői
Imperatív paradigmák
Funkcionális programozás
Logikai programozás
Adatfolyam programozás
Programozási Paradigmák
Szoftvertervezés és -fejlesztés [email protected]
• A program célja egy matematikai függvény kiértékelése
• Problémaleírás deklaratív– Típusdefiníciók (alaptípusok, párok, n-esek, listák)
– Függvénydefiníciók sorozata• Függvény neve• Függvény paraméterei• Függvény törzse (kifejezés)
– Egy kiértékelhető kezdő kifejezés
• Nincsenek parancsok– Parancsok helyett csak függvények jelenhetnek meg
– Nincsenek benne változók, így nyilván nem értelmezhetők ciklusok
– Ezeket rekurzió segítségével lehet helyettesíteni
• Saját típusok– Egyszerű egyedi értékek: számok, stb.
– Megszokott adatszerkezetek: rendezett n-esek, listák, halmazok, stb.
– Speciális szerkezetek: végtelen listák, generátorok, stb.
– A típusokat általában meg tudja állapítani a rendszer
17
Funkcionális programozási paradigma
Szoftvertervezés és -fejlesztés [email protected]
• Számítások alapelemei a függvények és ezek alkalmazásai– Függvény lehet nevesített vagy névtelen
– Névtelen függvények megadásának módja lehet a lambda-kalkulus• absztrakció: λx.(x*x+1)• applikáció (alkalmazás): λx.(x*x+1) 5
• Függvények elsőosztályú entitások– Adatokhoz hasonlóan kezelhetők
– Eltárolhatók változóban
– Kliens-szerver rendszerben a művelet is átküldhető adatként
• Függvények magasabbrendűek– Függvény átadható paraméterként/lehet visszatérési érték
– Műveleteket lehet velük végezni
• Mintaillesztés– Ugyanaz a függvény megjelenhet különböző paraméterekkel
– Hasonló mint az overloading, de annál többet tud
– Pl. listák esetében lista szétbontásra használható
18
Függvények szerepe
Szoftvertervezés és -fejlesztés [email protected]
• „Változók” használatának korlátai– Csak egyszeri értékadás engedélyezett (érték kötése)
– Tehát egy változónak a program futása során mindig ugyanannyi az értéke
– Ezért egy változó bármikor helyettesíthető az értékével
• Hivatkozási helyfüggetlenség– Ha a változók értéke nem változhat, akkor ez a kifejezésekre is igaz
– Tehát egy kifejezés/függvény értéke mindig ugyanannyi• A program bármely pontján• A futás bármelyik pillanatában
• Ez lehetővé tesz egy magas szintű automatikus ptimalizálást– Memoization
– Párhuzamosítás
• Funkcionális nyelvek típusai– Tiszta nyelvek: a változóknak nincsenek mellékhatásai
– Nem tiszta: bizonyos mellékhatások megjelenhetnek
• Időbeli állapotváltozás– Többszöri értékadás nincs, de új változókat létre lehet hozni
19
Mellékhatások hiánya
Szoftvertervezés és -fejlesztés [email protected]
• Végrehajtás vezérlés módja tipikusan lusta kiértékelés– A program tartalmaz egy kezdeti kiértékelendő kifejezést
– A végrehajtó motor ez alapján értékeli ki a további kifejezéseket
– A végeredmény a kezdeti kifejezés értéke
• Kiértékelés módja választható– Általában a lusta kiértékelés az alapértelmezett
– Teljesítményokokból kikényszeríthető a mohó kiértékelés is
• Lusta kiértékelés előnyei– A kiértékelő motor felépít(het) egy teljes kifejezésgráfot
– Ez alapján van lehetősége ezt• Szimbolikus módszerekkel egyszerűsíteni• Kiértékelés során bizonyos részeket elhagyni
• Párhuzamosítási lehetőség– Nagyon jól automatizálható
– Elhozta a funkcionális nyelvek reneszánszát
20
Funkcionális nyelvek működése
Szoftvertervezés és -fejlesztés [email protected]
• Végtelen rekurzió lehetősége– Farok-rekurzió: ha a függvényhívás utolsó lépése a rekurzív hívás
– Ebben az esetben a hívott függvény használhatja a hívó vermét
– Ezzel elérhető végtelen rekurzió
– Ez a gyakorlatban jól kihasználható• Generátorok• Eseménykezelés végtelen ciklusa
• Előnyök– Magas absztrakciós szint, kifejező kód
– Hatékony kiértékelés és optimalizáció (párhuzamosítás)
• Hátrányai– Bizonyos feladatokra nem alkalmas
– Egyszerű dolgok is nehézséget okozhatnak (I/O)
• Gyakorlati megvalósítások– Funkcionális nyelvek: LISP, Haskell, Clean, Erlang, F#
– Hagyományos nyelvekbe beépülve: C++, C#, Java lambda kifejezések
21
Funkcionális nyelvek specialitásai
Szoftvertervezés és -fejlesztés [email protected]
• Egy rendezést megvalósító funkcionális program(részlet)
22
Funkcionális programozás példa
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 , 4 ]
Paradigmák jellemzői
Imperatív paradigmák
Funkcionális programozás
Logikai programozás
Adatfolyam programozás
Programozási Paradigmák
Szoftvertervezés és -fejlesztés [email protected]
• Funkcionális paradigma része, ami elsőrendű logikán alapul
• Számítások alapelemei szabályok és tények– Klóz: véges számú literál diszjunkciója
pl. T1 T2 T3
– Horn-klóz: egy nem negált tagot tartalmazó klózpl. T1 T2 T3 másképp írva
T3 T1 T2
– Szabály (feltétellel rendelkező klóz): fej ← testkövetkezmény ← feltétel1 feltétel2 ...
– Tény (feltétel nélküli klóz)következmény ← igazkövetkezmény
• Program erősen korlátos– Nincsenek objektumok, sem megszokott adattípusok
– Elsőrendű logikát csak részben fedi le
– Ciklus helyett rekurzió
– Feltétel helyett a szabályok helyes megválasztása
24
Logikai programozás paradigma
Szoftvertervezés és -fejlesztés [email protected]
• Problémaleírás deklaratív– Szabályok felsorolása (problématér leírása)
– Tények felsorolása
– Célállítás/kérdés meghatározása
• Célállítás típusai– Egy feltevés igaz-e vagy sem?
– Létezik-e valami ami a feltételnek megfelel?
– Stb.
• Rekurzió támogatása– Kifejezések tartalmazhatnak rekurziót
– Rekurzív típusok is használhatók (lista)
• Nyelvi specialitások– Saját nyelvi elemek támogatják a túl mély rekurziók elkerülését
– Nyelvi elemekkel lehet irányítani a keresés folyamatát
25
Probléma meghatározása
Szoftvertervezés és -fejlesztés [email protected]
• Következtető motor a szabályok és tények alapján dönt– Levezetési szabályokat alkalmaz amíg nem jut egy végeredményhez
– Lehetséges kimenetek• 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
• Tételbizonyítási módszer: SLD rezolúció– Egyesítés: két kifejezés egyesíthető, ha változóik helyére Prolog kifejezéseket
helyezve azok azonossá tehetők
– Redukció: egy klóz fej és a célsorozat első céljának egyesítése. Ha sikeres, akkor a klóz törzse a cél helyére kerül
• A végrehajtás vezérlési módja lusta kiértékelés– Célállítás közvetlen ellenőrzése
– Egyesítés és redukció végrehajtása
– Visszalépéses keresés• ha sikeres a helyettesítés, akkor továbblép a következő célra• ha nem, akkor visszalép és másik egyesítéssel próbálkozik
26
Következtető motor működése
Szoftvertervezés és -fejlesztés [email protected]
• Használhatósága– Tudás kifejezése az implementáció ismerete nélkül
– Alkalmas a tudás eltárolására konkrét használati eset nélkül
– Szakértői rendszerek, mesterséges intelligencia
– Természetes nyelvi feldolgozás
– Nagy rendszerek esetén nehezen áttekinthető
• Előnyei– Sokféle kérdésre tud választ adni
– A feladat megoldásán túl levezetést is ad
• Konkrét nyelvi megvalósítások– Prolog és variánsai
– Pl. IBM Watson egy része
27
Logikai programozás használhatósága
Szoftvertervezés és -fejlesztés [email protected]
• Rokonsági kapcsolatokon alapuló szabályok
28
Logikai programozás példa
Szabályok
Szülő(X,Y) ← Apa(X,Y)
Szülő(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)?
Paradigmák jellemzői
Imperatív paradigmák
Funkcionális programozás
Logikai programozás
Adatfolyam programozás
Programozási Paradigmák
Szoftvertervezés és -fejlesztés [email protected]
• 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
30
Adatfolyam-elvű programozási paradigma
...
......
Szoftvertervezés és -fejlesztés [email protected]
• 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óaksegítségével
• Konkrét nyelv– LabVIEW
31
Adatfolyam-elvű programozási paradigma
Szoftvertervezés és -fejlesztés [email protected]
• 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ér-megkö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
32
Irodalomjegyzék