Programozási nyelvek – Programozási paradigmák Porkoláb Zoltán Eötvös Loránd Tudományegyetem, Informatikai Kar Programozási Nyelvek és Fordítóprogramok Tanszék
INFO Savaria Vázlat Absztrakció és paradigma Absztrakció és paradigma Programozási nyelvek és paradigmák Programozási nyelvek és paradigmák Automatikus programozás Automatikus programozás Strukturált programozás Strukturált programozás Objektumelvű programozás Objektumelvű programozás Új paradigmák a láthatáron Új paradigmák a láthatáron
INFO Savaria A paradigma Az absztrakció fogalma Az absztrakció fogalma + általános + általános - specifikus - specifikus A paradigma A paradigma útmutató az absztrakciók létrehozására útmutató az absztrakciók létrehozására szabályok és konvenciók halmaza szabályok és konvenciók halmaza eszközöket biztosít a fejlesztés támogatására eszközöket biztosít a fejlesztés támogatására evolúció evolúció
INFO Savaria Assembly Gépi kód automatikus generálása Gépi kód automatikus generálása Mesterséges redundancia Mesterséges redundancia Gépi kód automatikus generálása Gépi kód automatikus generálása Fordítóprogram (1952 Mark I, Autocoder) Fordítóprogram (1952 Mark I, Autocoder) 1:1 leképezés 1:1 leképezés Gyengének bizonyultak a kód és a programozó hordozhatósága szempontjából Gyengének bizonyultak a kód és a programozó hordozhatósága szempontjából
INFO Savaria Automatikus programozás Számítások automatikus elvégzése (A=B+C) Számítások automatikus elvégzése (A=B+C) Gépfüggetlen magasszintű nyelv Gépfüggetlen magasszintű nyelv Gépfüggő kód automatikus generálása Gépfüggő kód automatikus generálása Hatékony fordítás (FORTRAN, 9:10) Hatékony fordítás (FORTRAN, 9:10) Gyengének bizonyultak a kód karbantarthatósága szempontjából Gyengének bizonyultak a kód karbantarthatósága szempontjából
INFO Savaria Basic Olcsóbb számítógépek, időosztásos OS Olcsóbb számítógépek, időosztásos OS Nem csak matematikusok/informatikusok Nem csak matematikusok/informatikusok Kemény János: Basic (Dartmouth) Kemény János: Basic (Dartmouth) Hardverfüggetlen, egyszerű(bb) Hardverfüggetlen, egyszerű(bb) Interpreter és fordító Interpreter és fordító Gyengének bizonyultak karbantarthatóság és programbiztonság szempontjából Gyengének bizonyultak karbantarthatóság és programbiztonság szempontjából
INFO Savaria Strukturált (procedurális) programozás Szekvenciából, elágazásból és ciklusból felépülő (goto mentes) eljárások Szekvenciából, elágazásból és ciklusból felépülő (goto mentes) eljárások Eljárások paraméterátadással és globális változókkal kommunikáltak Eljárások paraméterátadással és globális változókkal kommunikáltak Adekvát algoritmusok meghatározása Adekvát algoritmusok meghatározása Magasszintű függvénykönyvtárak Magasszintű függvénykönyvtárak Gyengének bizonyultak az adatstruktúrák kompozíciójában Gyengének bizonyultak az adatstruktúrák kompozíciójában
INFO Savaria Pascal ALGOL 60 továbbfejlesztései: ALGOL68 ALGOL 60 továbbfejlesztései: ALGOL68 Niklaus Wirth (ETH Zürich): Pascal Niklaus Wirth (ETH Zürich): Pascal Ortogonalitás Ortogonalitás Algoritmusok+Adatstruktúrák=Programok Algoritmusok+Adatstruktúrák=Programok Portabilitási kit: p-code -> assembly Portabilitási kit: p-code -> assembly UCSD Pascal: p-code interpreter UCSD Pascal: p-code interpreter Modul, típus: Modula-2, Oberon Modul, típus: Modula-2, Oberon
INFO Savaria C ALGOL 60 továbbfejlesztése (B) ALGOL 60 továbbfejlesztése (B) Dennis Ritchie (AT&T): C (UNIX) Dennis Ritchie (AT&T): C (UNIX) Hatékony hozzáférés az (absztrakt) HW-hez Hatékony hozzáférés az (absztrakt) HW-hez Portabilitás: forrásszintű Portabilitás: forrásszintű UNIX kernel újraírása (1973) UNIX kernel újraírása (1973) Modul, típus: Modula-2, Oberon Modul, típus: Modula-2, Oberon
INFO Savaria Az objektumelvű paradigma Adekvát adatstruktúrák és a rajtuk végzett műveletek, Adekvát adatstruktúrák és a rajtuk végzett műveletek, Enkapszuláció Enkapszuláció Osztályok: az azonos adatstruktúrával és műveletekkel rendelkező objektumok programnyelvi leírása Osztályok: az azonos adatstruktúrával és műveletekkel rendelkező objektumok programnyelvi leírása Öröklődés, osztályok hierarchiája Öröklődés, osztályok hierarchiája
INFO Savaria as évek eleje I. 80-as évek: nagy teamek, >10 6 kódsor 80-as évek: nagy teamek, >10 6 kódsor Nincsen a kódnak „gazdája” Nincsen a kódnak „gazdája” Nehézkes kommunikáció az eljárások közt Nehézkes kommunikáció az eljárások közt Adatszerkezetek és eljárások elszakadnak Adatszerkezetek és eljárások elszakadnak Felülről lefelé építkezik, nehezen újrafelhasználható Felülről lefelé építkezik, nehezen újrafelhasználható Lassú… Lassú…
INFO Savaria as évek eleje II. „Garázscégek”: „Garázscégek”: Kis kapacitás Kis kapacitás Azonnali produkciós kényszer Azonnali produkciós kényszer Kódújrafelhasználás, komponensek Kódújrafelhasználás, komponensek Alulról felfelé építkezés Alulról felfelé építkezés Gyorsan!!! Gyorsan!!!
INFO Savaria Az objektumelvű paradigma I. Osztályok (modulok) Osztályok (modulok) Enkapszuláció: interfész + implementáció Enkapszuláció: interfész + implementáció Adatelrejtés Adatelrejtés Öröklés Öröklés Generalizáció Generalizáció Specializáció Specializáció Polimorfizmus Polimorfizmus Simula 67 !!! Simula 67 !!!
INFO Savaria Az objektumelvű paradigma II. Simula 67 Simula 67 Smalltalk Smalltalk Metaobjektumok Metaobjektumok Dinamikus Dinamikus Erősen típusos programozási nyelvek: Erősen típusos programozási nyelvek: C++ = ALGOL68 + Simula C++ = ALGOL68 + Simula Eiffel Eiffel Java Java C# C#
INFO Savaria Objektumelvű paradigma kritikája Pozitív és negatív változások Pozitív és negatív változások Dinamikus kötés és a fordítási idejű típusellenőrzés egyidejű megvalósítása Dinamikus kötés és a fordítási idejű típusellenőrzés egyidejű megvalósítása kovariáns visszatérő érték, kontravariáns paraméter kovariáns visszatérő érték, kontravariáns paraméter A kifejezés-probléma A kifejezés-probléma Hatékonysági problémák Hatékonysági problémák
INFO Savaria Új paradigmák Funkcionális programozás Funkcionális programozás Aspektusorientált programozás Aspektusorientált programozás Generikus programozás Generikus programozás Szándékelvű programozás Szándékelvű programozás Az új paradigmák beépítik a korábbi paradigmák tapasztalatait Az új paradigmák beépítik a korábbi paradigmák tapasztalatait Multiparadigma elvű rendszerek Multiparadigma elvű rendszerek
INFO Savaria Funkcionális programozás I. LISP (1957) LISP (1957) Függvények kiértékelése, Függvények kiértékelése, Kompozicionalitás elve Kompozicionalitás elve Lambda kalkulus, gráfátíró rendszerek Lambda kalkulus, gráfátíró rendszerek Magasabbrendű függvények Magasabbrendű függvények Magasabb rendű típusok, típusosztályok Magasabb rendű típusok, típusosztályok
INFO Savaria Funkcionális programozás II. Lusta kiértékelés Lusta kiértékelés Hivatkozási helyfüggetlenség (referential transparency) Hivatkozási helyfüggetlenség (referential transparency) Optimalizáció, párhuzamosítás Optimalizáció, párhuzamosítás Helyességbizonyítás Helyességbizonyítás Scheme (LISP), ML, SML, Miranda, OCamL, Haskell, Clean Scheme (LISP), ML, SML, Miranda, OCamL, Haskell, Clean
INFO Savaria Aspektus-orientált programozás Motiváció: Rossz modularitás OOP-ban Motiváció: Rossz modularitás OOP-ban Szétszórt kódrészletek Szétszórt kódrészletek Kód utólagos módosítása Kód utólagos módosítása Aspektusok – csatolási pontok - szövőgép Aspektusok – csatolási pontok - szövőgép Példa: AspectJ + Java Példa: AspectJ + Java
INFO Savaria Generikus programozás Adatszerkezetek – általános algoritmusok Adatszerkezetek – általános algoritmusok Fordítási idejű típusellenőrzés Fordítási idejű típusellenőrzés Parametrikus polimorfizmus Parametrikus polimorfizmus Algoritmusok - osztályok - funktorok Algoritmusok - osztályok - funktorok Példa: C++ Standard Template Library Példa: C++ Standard Template Library
INFO Savaria C++ template metaprogramozás Fordítási időben Turing-teljes Fordítási időben Turing-teljes Fordítási idejű döntések és algoritmusok Fordítási idejű döntések és algoritmusok unruh.cpp 30: conversion from enum to D requested 1994, template-ek szabványosítása 1994, template-ek szabványosítása
INFO Savaria C++ template metaprogramozás int factorial( int n) { return (n==0) ? 1 : n*factorial(n-1); return (n==0) ? 1 : n*factorial(n-1);} int main() { cout << factorial(5) << endl; cout << factorial(5) << endl; return 0; return 0;} template struct Factorial { enum { value = N * Factorial ::value }; enum { value = N * Factorial ::value };}; template <> struct Factorial { enum { value = 1 }; enum { value = 1 };}; int main() { const int fact5 = Factorial ::value; const int fact5 = Factorial ::value; std::cout << fact5 << endl; std::cout << fact5 << endl; return 0; return 0;}
INFO Savaria OO-AOP együttélés Alapstruktúra – OOP Alapstruktúra – OOP Csökkenti a kódismétlést az osztályokban Csökkenti a kódismétlést az osztályokban Javítja a modularitást Javítja a modularitást Segíti a pozitív és negatív változások követését Segíti a pozitív és negatív változások követését + after/before + after/before – around – around
INFO Savaria OO-GP együttélés Absztrakt adatszerkezetek – osztályok Absztrakt adatszerkezetek – osztályok Funktor-ok Funktor-ok Algoritmusok ábrázolása osztályként Algoritmusok ábrázolása osztályként Mixin-ek: Mixin-ek: Az öröklési hierarchia megfordítása Az öröklési hierarchia megfordítása Csökkenti az osztályok számát és interfészét Csökkenti az osztályok számát és interfészét Segíti a negatív változások követését Segíti a negatív változások követését
INFO Savaria OO-FP együttélés Absztrakt adatszerkezetek – osztályok Absztrakt adatszerkezetek – osztályok Enkapszuláció Enkapszuláció Altípusosság: Altípusosság: Nominális Nominális Strukturális Strukturális
INFO Savaria GP-FP együttélés Standard Template Library Standard Template Library Funkcionális programozás Funkcionális programozás Template metaprogramozás Template metaprogramozás Funkcionális programozás Funkcionális programozás Funkcionális programok Funkcionális programok Generikus adatszerkezetek és függvények Generikus adatszerkezetek és függvények Parametrikus polimorfizmus Parametrikus polimorfizmus
INFO Savaria Szándékalapú programozás Charles Simonyi Charles Simonyi Bravo Bravo Word Word
INFO Savaria Szándékalapú programozás Feladat-specifikus tudás Domain kódForráskódFuttatás 200 oldal oldal Generátor oldal Programozó
INFO Savaria Szándékalapú programozás Feladat-specifikus tudás DSL Futtatás 200 oldal Programozó
INFO Savaria Szándékalapú programozás Feladat-specifikus tudás ProgramozóForráskódFuttatás 200 oldal oldal oldal Szoftverfejlesztői tudás? ?
INFO Savaria Az ingyenvacsora vége Paradigmák evolúciója Paradigmák evolúciója Akadémiai kutatások Akadémiai kutatások Ipari követelmények Ipari követelmények „gyakorlatias” versus „akadémikus” tárgyak „gyakorlatias” versus „akadémikus” tárgyak Új paradigmák megértésére, befogadása Új paradigmák megértésére, befogadása Felkészítés a jelen és a jövő technológiáira Felkészítés a jelen és a jövő technológiáira
INFO Savaria Összefoglalás Paradigmák evolúciója Paradigmák evolúciója Akadémiai kutatások Akadémiai kutatások Ipari követelmények Ipari követelmények „gyakorlatias” versus „akadémikus” tárgyak „gyakorlatias” versus „akadémikus” tárgyak Új paradigmák megértésére, befogadása Új paradigmák megértésére, befogadása Felkészítés a jelen és a jövő technológiáira Felkészítés a jelen és a jövő technológiáira
Köszönöm a figyelmet! Programozási nyelvek – Programozási paradigmák Porkoláb Zoltán Eötvös Loránd Tudományegyetem, Informatikai Kar Programozási Nyelvek és Fordítóprogramok Tanszék