Bevezetés ffl 2 1. Programozási nyelvek tervezése ffl 7 Fodor Szabina 1.1. Történeti áttekintés ffl 7 Akorainyelvek ffl 8 A szoftverfejlesztés kialakulása ffl 9 1.2. A programozási nyelvek szerepe ffl 11 1.3. A programozási nyelvek tervezésének alapelvei ffl 13 A jó programozási nyelv tulajdonságai ffl 13 A nyelvtervezés lépései ffl 18 1.4. Programozási nyelvek csoportosítása ffl 18 Imperatív, procedurális nyelvek ffl 18 Applikatív, funkcionális nyelvek ffl 19 Szabály alapú, logikai nyelvek ffl 20 Objektumorientált nyelvek ffl 20 1.5. A programozási nyelvek szabványosítása ffl 21 1.6. Nemzetközi programozás ffl 24 1.7. A programozási környezet nyelvre gyakorolt hatása ffl 25 Önálló fordítási egységek ffl 25 Tesztelésésnyomkövetés ffl 26 2. Lexikális elemek ffl 29 Nyékyné Gaizler Judit 2.1. A jelkészlet ffl 29 Az ASCII kód ffl 31 Az EBCDIC kód ffl 31 Az ISO 8859 család ffl 32 A Unicode szabvány ffl 32
viii ffl Tartalomjegyzék 2.2. A programozási nyelvek jelkészletei ffl 33 2.3. Azonosítók ffl 35 A használható karakterek ffl 36 A megengedett szintaxis ffl 36 Akis-ésanagybetűk megkülönböztetése ffl 37 Hosszúsági megkötések ffl 37 A fenntartott szavak ffl 37 2.4. Literálok ffl 39 Számliterálok ffl 39 Karakterek és karaktersorozatok ffl 41 2.5. Megjegyzések ffl 42 3. Vezérlési szerkezetek, utasítások ffl 45 Csizmazia Albert, Csizmazia Balázs 3.1. A programozó feladata ffl 45 Mondatszerűleírás ffl 46 Folyamatábrák ffl 47 D-diagramok ffl 48 Blokkdiagramok ffl 49 Struktogramok ffl 50 3.2. Az assembly nyelvű megoldás ffl 50 APascalnyelvűprogram ffl 51 A Motorola 68000-es család programozása ffl 51 Az MC 68000-es assembly kód ffl 56 Az assembly és a Pascal nyelvű kód összevetése ffl 57 3.3. Egy elemi megközelítés ffl 58 A while-programok elemei ffl 59 Magasabb szintűműveletek ffl 59 3.4. Vezérlési megközelítések ffl 61 Imperatív programozási nyelvek ffl 61 Deklaratív és funkcionális nyelvek ffl 61 Párhuzamos végrehajtás ffl 62 Eseményvezérelt programozás ffl 62 3.5. A vizsgált programozási nyelvek ffl 63 Mondatszerű algoritmusleírás: COBOL ffl 63 Strukturált programozás: a Pascal nyelv ffl 65 Hordozható assembly: a C nyelv ffl 66 Minden objektum: a Smalltalk ffl 67 Egyéb vizsgált programnyelvek ffl 67
Tartalomjegyzék ffl ix 3.6. Értékadás, aritmetikai utasítások ffl 68 A COBOL eszköztára ffl 68 Egyszerű értékadás: a Pascal nyelv ffl 69 Értékadás a C nyelvben ffl 69 A Smalltalk megoldása ffl 70 A többszörös értékadás és a CLU ffl 70 Az értékadás szerepe a programokban ffl 71 Az üres utasítás ffl 71 3.7. Szekvencia és blokk utasítás ffl 71 Blokk utasítás a Pascalban ffl 72 Szakítás a Pascal hagyományaival: az Ada nyelv ffl 73 A C nyelvcsalád jellemzői ffl 74 A Smalltalk blokk utasítása ffl 74 3.8. Feltétel nélküli vezérlésátadás ffl 75 A COBOL eszközei ffl 76 Feltétel nélküli vezérlésátadás a Pascalban ffl 76 Modula-3: búcsú a GOTO-tól ffl 77 Különleges vezérlési utasítások a C-ben ffl 77 AJavaújdonságai ffl 78 3.9. Elágazási szerkezetek ffl 79 Elágazás a COBOL-ban ffl 80 Feltételes utasítás a Pascalban ffl 81 Többirányú elágazás a Pascalban ffl 82 Biztonságos elágazások: a Modula-3 újításai ffl 82 Biztonságos CASE a Modula-3-ban ffl 84 A C nyelv elágazási szerkezetei ffl 84 Többágú elágazás a C-ben ffl 85 Többágú elágazás a C#-ban ffl 85 Feltételes utasítás a Smalltalkban ffl 86 3.10. Ciklusszerkezetek ffl 87 A COBOL ciklusai ffl 87 Ciklusutasítások a Pascalban ffl 88 Modula-3: biztonságos ciklusok ffl 90 loop end exit ciklusok ffl 91 Az Ada nyelv eszközei ffl 91 Ismétlési szerkezetek a C és a Java nyelvben ffl 92 A C# nyelv újdonságai ffl 93 Bejárók (iterátorok) ffl 94 Ciklusutasítás a Smalltalkban ffl 97 3.11. Önhívó kód (rekurzió) ffl 98 3.12. Összefoglalás ffl 99
x ffl Tartalomjegyzék 4. Hatókör, élettartam ffl 103 Balázs Iván József, Porkoláb Zoltán 4.1. A memóriaterülek típusai ffl 104 A statikus memóriaterület ffl 104 A dinamikus memóriaterület ffl 104 Az automatikus memóriaterület ffl 105 Egy egyszerűpélda ffl 105 4.2. Hatókör ffl 106 Globális hatókör ffl 108 Fordítási egység mint hatókör ffl 108 Függvény és kódblokk mint hatókör ffl 109 Egy típus mint hatókör ffl 110 4.3. Élettartam ffl 110 4.4. Példák ffl 113 5. Típusok ffl 119 Pécsy Gábor 5.1. Mi a típus? ffl 119 Típus a fordítóprogram szemszögéből ffl 119 Típus a programozó szemszögéből ffl 120 A programozási nyelvek típusossága ffl 122 Típuskonverzió ffl 123 5.2. Típusok osztályozása ffl 127 Típusosztályok ffl 128 Attribútumok az Ada nyelvben ffl 128 5.3. Skalár típusosztály ffl 129 Ábrázolás ffl 129 Műveletek ffl 130 Az Ada skalártípusai ffl 130 5.4. Diszkrét típusosztály ffl 131 Felsorolási típusok ffl 131 Egész típusok ffl 133 Csellengők ffl 138 5.5. Valós típusosztály ffl 140 Típusértékhalmaz ffl 140 Műveletek ffl 141 Programozási nyelvek ffl 142 5.6. Mutató típusok ffl 143 Memóriagazdálkodás ffl 144 Típusértékhalmaz ffl 146 Műveletek ffl 148 Alprogramra hivatkozó mutató ffl 151 Nyelvi specialitások ffl 152
Tartalomjegyzék ffl xi 5.7. Kifejezések ffl 155 Kifejezések szerkezete ffl 155 Kifejezések kiértékelése ffl 157 5.8. Egyéb nyelvi specialitások ffl 161 5.9. Összefoglalás ffl 162 6. Típuskonstrukciók ffl 167 Pécsy Gábor 6.1. Direktszorzat típus ffl 170 Típusértékhalmaz ffl 170 Műveletek ffl 171 A direktszorzat ábrázolása ffl 174 Egyedi nyelvi elemek ffl 176 6.2. Unió típus ffl 178 Típusértékhalmaz ffl 178 Műveletek ffl 179 Unió jellegű típuskonstrukciók ffl 180 6.3. Iterált típus ffl 187 6.4. Vektor ffl 188 Típusértékhalmaz ffl 188 Műveletek ffl 189 Nyelvi specialitások ffl 190 Általánosítás több dimenzióra tömbök ffl 193 6.5. Halmaz ffl 195 Típusértékhalmaz ffl 195 Műveletek ffl 196 6.6. Egyéb iterált konstrukciók ffl 196 6.7. Összefoglalás ffl 198 7. Alprogramok ffl 203 Kozsik Tamás 7.1. Az alprogramok hatása a szoftverminőségre ffl 204 7.2. Eljárások és függvények ffl 205 Nyelvek, ahol nincs különbség ffl 206 Nyelvek, ahol van különbség ffl 208
xii ffl Tartalomjegyzék 7.3. Az alprogramok és hívások szerkezete ffl 209 Mi lehet paraméter vagy visszatérési érték? ffl 209 Az alprogramok specifikációja ffl 216 Alprogramok törzse ffl 222 Az alprogramok meghívása ffl 227 Rekurzív alprogramok ffl 232 Az alprogramok deklarációja ffl 233 Makrók és inline alprogramok ffl 235 Alprogram típusok ffl 236 7.4. Paraméterátadás ffl 237 Paraméterátadási módok ffl 237 A paraméterátadási módok összehasonlítása ffl 245 A lehetőségek néhány programozási nyelvben ffl 247 7.5. Az alprogramok környezete ffl 253 Külön fordíthatóság ffl 254 Beágyazhatóság ffl 255 Statikus és dinamikus hatókör ffl 257 A változók élettartama ffl 260 7.6. Az alprogramnevek túlterhelése ffl 261 Operátorok túlterhelése ffl 264 7.7. Az alprogramok megvalósítása ffl 264 Paraméterként átadott alprogramok megvalósítása ffl 267 7.8. Iterátorok ffl 269 7.9. Korutinok ffl 272 7.10. Összefoglalás ffl 274 8. Kivételkezelés ffl 277 Nohl Attila Rajmund 8.1. Bevezetés ffl 277 A kivételkezelés alapfogalmai ffl 277 Miért jó a kivételkezelés? ffl 279 A kivételkezelések összehasonlításának szempontjai ffl 285 8.2. A kivételkezelés kezdetei ffl 285 Egy utasítás kivételkezelése: FORTRAN ffl 285 Több utasítás kivételkezelése: COBOL ffl 286 Dinamikus kivételkezelés: PL/I ffl 286
Tartalomjegyzék ffl xiii 8.3. Fejlett kivételkezelés ffl 288 Statikus kivételkezelés: CLU ffl 288 Kivételek terjedése: Ada 95 ffl 289 Kivételosztályok megjelenése: C++ ffl 291 Helyességbizonyítás és kivételkezelés: Eiffel ffl 292 A finally blokk: Modula-3 ffl 294 Ellenőrzött kivételek: Java ffl 295 A Delphi kivételkezelése ffl 296 Egymásba ágyazott kivételek: C# ffl 297 Kivételkezelés függvényekkel: Common Lisp ffl 297 Új megoldások: Perl ffl 299 8.4. Összefoglaló ffl 301 8.5. Példaprogramok kivételkezelésre ffl 302 C++ ffl 302 Java ffl 304 Ada 95 ffl 306 Eiffel ffl 308 9. Modulok ffl 315 Lakatos Attila 9.1. A moduláris tervezés ffl 315 A moduláris tervezés kritériumai ffl 315 A modularitás alapelvei ffl 316 9.2. A modulok nyelvi támogatása ffl 320 Alacsonyszintűprogramnyelvek ffl 320 Procedurális programnyelvek ffl 321 Az Ada nyitott modulok támogatása ffl 323 Objektumorientált programnyelvek ffl 328 Funkcionális programnyelvek ffl 329 10. Absztrakt adattípusok ffl 333 Pécsy Gábor 10.1. Típuskonstrukciók és adatabsztrakció ffl 333 10.2. Elvárások a programozási nyelvekkel szemben ffl 334 10.3. Modulokra bontás ffl 335 10.4. Egységbe zárás ffl 335 10.5. Az ábrázolás elrejtése ffl 335 Átlátszatlan típus a C-ben ffl 336 Ada private típusok ffl 338 CLU absztrakt adattípusok ffl 338 Láthatósági szintek ffl 339
xiv ffl Tartalomjegyzék 10.6. A specifikáció és implementáció szétválasztása ffl 340 10.7. A modulfüggőség kezelése ffl 342 10.8. Konzisztens használat ffl 343 10.9. Általánosított programsémák ffl 344 10.10. A programozási nyelvek értékelése ffl 347 11. Típussal valóparaméterezés ffl 353 Hegedűs Hajnalka, Marcinkovics Tamás, Nyékyné Gaizler Judit, Kozsik Tamás 11.1. Polimorfizmus ffl 359 Parametrikus polimorfizmus ffl 360 Altípusos polimorfizmus ffl 364 Túlterheléses polimorfizmus ffl 368 Típuskényszerítéses polimorfizmus ffl 370 A polimorfizmus megvalósítása monomorf nyelvekben ffl 371 11.2. A sablon-szerződés modell ffl 373 11.3. Sablonparaméterek ffl 376 Típuséstípusosztály ffl 376 Alprogram ffl 378 Objektum ffl 379 Modul ffl 379 11.4. Példányosítás ffl 381 Explicit példányosítás ffl 382 Igény szerinti példányosítás ffl 382 Lusta példányosítás ffl 382 Sablonparaméterek megfeleltetése ffl 383 Specializáció ffl 384 11.5. Sablonok és öröklődés ffl 385 11.6. Összegzés ffl 387 12. Objektumorientált programozás ffl 391 Kovács D. Lehel István, Sergyán Szabolcs, Nyékyné Gaizler Judit 12.1. Az osztály és az objektum ffl 391 Az osztályok és objektumok az egyes nyelvekben ffl 393 12.2. Jelölési módok, diagramok ffl 400 Osztálydiagram ffl 400 Objektumdiagram ffl 400 A példányosítás ábrázolása ffl 400 12.3. Objektumok létrehozása és megszüntetése ffl 400 12.4. Egységbezárás ffl 405 12.5. Adatrejtés, interfészek ffl 406 Friend metódusok, osztályok ffl 409
Tartalomjegyzék ffl xv 12.6. Osztályadat, osztálymetódusok ffl 411 12.7. Öröklődés ffl 415 Adatrejtésés öröklődés ffl 423 Polimorfizmus és dinamikus kötés ffl 426 Absztrakt osztályok ffl 438 A közös ős ffl 441 Többszörösöröklődés ffl 442 Interfészek ffl 451 Beágyazott osztályok, tagosztályok ffl 455 12.8. Összefoglalás ffl 456 13. A programhelyesség-ellen rzés nyelvi elemei ffl 459 Juhász András 13.1. A helyességi specifikációs nyelv ffl 463 Az Eiffel és az elsőrendűlogika ffl 464 Példa ffl 469 Elő- és utófeltételek ffl 470 Osztályinvariáns ffl 476 Ciklusok ffl 478 A check utasítás ffl 482 Öröklődés ffl 483 13.2. A programhelyesség definiálása az Eiffelben ffl 487 Az attribútumok helyessége ffl 487 A metódusok helyessége ffl 487 Az osztályok helyessége ffl 490 A programok helyessége ffl 491 13.3. A programhelyesség-ellenőrzés problémái ffl 492 Függőségek ffl 492 Helyességi specifikációs nyelv ffl 493 13.4. A VEREM osztály ffl 495 14. Párhuzamos nyelvi elemek ffl 501 Zsók Viktória (1., 2 3. alfejezet), Tejfel Máté (1., 4 6. alfejezet) 14.1. A párhuzamos nyelvek általános jellemzése ffl 505 14.2. Ada ffl 514 Taszkok ffl 514 A taszk specifikációja és törzse ffl 515 Taszk típusok, taszk objektumok ffl 517 Taszkok elindítása, végrehajtása ffl 518 Taszkok lezárása (terminálása) ffl 519 A taszkok attribútumai ffl 519 Entry, entry-hívás, accept utasítás ffl 520 Belépésipont-családok ffl 521
xvi ffl Tartalomjegyzék A select utasítás ffl 522 Szelektív hívásfogadás ffl 522 Feltételes hívásfogadás ffl 523 A terminate alternatíva ffl 524 A delay és az abort utasítás ffl 524 Az else alternatíva ffl 524 A feltételes entry hívás ffl 526 Időhöz kötött entry hívás ffl 526 Kivételkezelés ffl 526 Példák ffl 527 14.3. CSP ffl 532 14.4. Occam ffl 534 14.5. Java ffl 537 14.6. C alapú könyvtárak ffl 543 MPI ffl 543 PVM ffl 553 15. Programkönyvtárak ffl 561 Csontos Péter, Lakatos Attila 15.1. Követelmények a programkönyvtárakkal szemben ffl 562 Ajókönyvtárfejlesztő tulajdonságai ffl 562 Alapvető minőségi követelmények ffl 563 A programkönyvtárakra vonatkozó egyedi követelmények ffl 566 A követelmények teljesítésének feltételei ffl 569 15.2. Objektumorientált programkönyvtár-tervezés ffl 569 Osztályhierarchia ffl 570 Az osztályok mérete ffl 573 A szolgáltatások mérete ffl 576 Az osztályok fajtái ffl 578 15.3. Új paradigmák ffl 582 15.4. Általános programkönyvtárak ffl 583 Adatszerkezetek ffl 583 I/O ffl 584 Memóriakezelés ffl 584 15.5. Programkönyvtárak életciklusa ffl 584 Tervezési fázis ffl 585 Megvalósítási fázis ffl 586 Karbantartási fázis ffl 586
Tartalomjegyzék ffl xvii 16. A funkcionális programozási nyelvek elemei ffl 589 Horváth Zoltán 16.9. alfejezet: Zsók Viktória, Tejfel Máté, Horváth Zoltán 16.1. Bevezetés ffl 589 A funkcionális programozási stílus ffl 590 Funkcionális program felépítése és kiértékelése ffl 591 A modern funkcionális nyelvek főbb jellemzői ffl 593 A funkcionális nyelvek rövid áttekintése ffl 596 16.2. Egyszerű funkcionális programok ffl 597 Egyszerű függvények definíciója ffl 597 Feltételek megadása ffl 597 Mintaillesztés ffl 598 16.3. Függvények típusa, magasabbrendű függvények ffl 599 Egyszerű típuskonstrukciók ffl 600 Lokális deklarációk ffl 605 Egy érdekesebb példa: királynők a sakktáblán ffl 607 16.4. Típusok és osztályok ffl 609 Polimorfizmus, típusosztályok ffl 609 Algebrai adattípus ffl 612 Típusszinonimák ffl 614 Származtatott típusok ffl 614 Típuskonstrukció osztályok ffl 615 16.5. Modulok ffl 615 Absztrakt algebrai adattípus ffl 616 16.6. Frissíthető változók, monádok, mellékhatás ffl 619 Egyszeresen hivatkozott változók ffl 619 Monádok ffl 620 Frissíthetőváltozók ffl 621 16.7. Interaktív funkcionális programok ffl 622 16.8. Kivételkezelés ffl 624 16.9. Párhuzamos kiértékelés és elosztott programok ffl 625 Párhuzamos és elosztott programozás Concurrent Cleanben ffl 626 Distributed Haskell with Ports ffl 630 A JoCaml párhuzamos és osztott nyelvi elemei ffl 632 17. Logikai programozás ffl 637 Ásványi Tibor 17.1. Logikai programok ffl 638 Tények ffl 639 Szabályok ffl 640 Rekurzív szabályok ffl 644
xviii ffl Tartalomjegyzék 17.2. Bevezetés a Prolog nyelvbe ffl 645 17.3. A logikai programok objektumai ffl 646 17.4. Listakezelés rekurzív LP módszerekkel ffl 647 A rekurzív keresés ffl 649 Az eredmény fokozatos közelítése ffl 649 Az akkumulátor módszer ffl 650 Az általánosítás módszere ffl 651 17.5. A Prolog gép ffl 652 Tiszta Prolog programok végrehajtása ffl 652 Az illesztés algoritmusa ffl 653 NSTO programok ffl 654 Első argumentum indexelés ffl 656 Utolsó hívás optimalizáció ffl 657 17.6. Vezérlésmódosítás a Prologban ffl 658 Feltételes célok ffl 658 Tagadás ffl 660 17.7. A Prolog metalogikai predikátumai ffl 662 Aritmetika ffl 662 Termek típusa és összehasonlítása ffl 664 Termműveletek ffl 665 17.8. Prolog műveleti jelek ffl 666 17.9. A Prolog logikán kívüli predikátumai ffl 668 Programbetöltés ffl 669 Bemenet és kimenet ffl 669 Önmódosító programok ffl 670 17.10. Prolog célok megoldásainak összegyűjtése ffl 672 17.11. Kivételkezelés a Prologban ffl 673 17.12. Prolog modulrendszerek ffl 675 A név alapú modulrendszer ffl 675 Az eljárás alapú modulrendszer ffl 675 A forrásmodul megváltoztatása ffl 677 17.13. Kitekintés ffl 679 Ajánlott irodalom ffl 679 Klasszikus LP-kiterjesztések ffl 680 Az ötödik generációs számítógépek és programjaik ffl 680 Újabb irányzatok ffl 681 17.14. Összefoglalás ffl 682
Tartalomjegyzék ffl xix 18. Aspektusorientált programozás ffl 685 Csontos Péter, Kozsik Tamás 18.1. Az AOP áttekintése ffl 686 Aspektusok és komponensek ffl 687 Aspektusleíró nyelvek ffl 688 Aspektusszövők ffl 688 18.2. Az AspectJ bemutatása ffl 689 Az AspectJ elemei és főbb tulajdonságai ffl 689 Egy rövid AspectJ példa ffl 690 Fejlesztőeszközök és rokon nyelvek ffl 690 18.3. Az AOP-vel rokon paradigmák és megvalósításaik ffl 691 Vonatkozások többdimenziós szétválasztása (MDSC) ffl 691 Adaptív programozás (AP) ffl 692 Kompozíciós szűrők (CF) ffl 693 Generatív programozás (GP) ffl 693 Intencionális programozás (IP) ffl 694 További ígéretes kezdeményezések ffl 695 19. Programozási nyelvek rövid leírásai ffl 697 Csontos Péter et al. 19.1. Ada 95 ffl 697 19.2. ALGOL 60 ffl 698 19.3. ALGOL 68 ffl 698 19.4. BASIC ffl 699 19.5. BETA ffl 699 19.6. C ffl 699 19.7. C++ ffl 700 19.8. C# ffl 700 19.9. Clean ffl 701 19.10. CLU ffl 701 19.11. COBOL ffl 701 19.12. Delphi ffl 702 19.13. Eiffel ffl 702 19.14. FORTRAN ffl 703 19.15. Haskell ffl 703 19.16. Java ffl 704 19.17. LISP ffl 704 19.18. Maple ffl 705 19.19. Modula-2 ffl 705 19.20. Modula-3 ffl 705 19.21. Objective-C ffl 706 19.22. Pascal ffl 706 19.23. Perl ffl 706
xx ffl Tartalomjegyzék 19.24. PHP ffl 707 19.25. PL/I ffl 707 19.26. Python ffl 707 19.27. SIMULA 67 ffl 708 19.28. Smalltalk ffl 708 19.29. SML ffl 708 19.30. SQL ffl 709 19.31. Tcl ffl 709 20. Függelék ffl 711 Irodalomjegyzék ffl 714 Tárgymutató ffl 732