32
Szoftvertervezés és -fejlesztés II. előadás http://nik.uni-obuda.hu/sztf2 Szénási Sándor [email protected] Óbudai Egyetem,Neumann János Informatikai Kar Programozási Paradigmák Programozási paradigmák, Számítási modellek

ProgramozásiParadigmák - Óbudai [email protected] Szoftvertervezés és -fejlesztés II. •Absztrakciós szint fogalma –A gépi megvalósítás részleteitől

  • Upload
    others

  • View
    1

  • Download
    0

Embed Size (px)

Citation preview

  • 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óz

    pl. 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