Hernyák Zoltán Magasszintű Programozási Nyelvek I. A programozási nyelvek fejlődése Hernyák Zoltán Web: http://dragon.ektf.hu/aroan, E-Mail: aroan@aries.ektf.hu Magasszintű Programozási Nyelvek I. Eszterházy Károly Főiskola Számítástudományi tsz http://aries.ektf.hu 1
A programozási nyelvek fejlődése A jó programozási nyelv: Könnyen elsajátítható alapelvek Áttekinthető leírás Könnyen módosítható kód Nehéz hibát elkövetni benne Könnyen dokumentálható 2
A programozási nyelvek fejlődése gen.: Gépi kódú programozási nyelv Egyetlen „jó” jellemzővel sem bír A kód számok sorozata Egy „szám” egy utasítás Relatíve sok utasítás Nincs változónév Nincs eljárásnév Nincs ciklus Memóriacímekre hivatkozás számkóddal 3
A programozási nyelvek fejlődése Példa: Mem.cím Gépi kódú utasítás Assembly utasítás 4
A programozási nyelvek fejlődése Egyéb problémák: A számkódokat a memóriába kell juttatni Ha másik memóriaterületre tesszük, az gondot okozhat A gépi kód processzorfüggő 5
„Amit nem lehet megírni gépi kódban, A programozási nyelvek fejlődése Előnye: Maximális futási sebesség Elvileg minimális memóriamennyiség-felhasználás A mikroprocesszor és az egyéb hardware elemek képességeinek maximális kihasználhatósága „Amit nem lehet megírni gépi kódban, azt nem lehet megírni!” 6
A programozási nyelvek fejlődése 2. gen.: Assembly programozási nyelv Néhány „jó” jellemzővel bír Az utasításokat betűkombinációk jelölik (mnemonikok) Pl: „MOV” == „move” == „mozgatás” Egy ilyen mnemonik egy gépi kódú utasításnak felel meg Sokkal könnyebb megjegyezni a nyelvet 7
A programozási nyelvek fejlődése Sokkal nehezebb hibázni Az elgépelés észrevehető („MUV” utasítás nincs:) A program ezen formája olvashatóbb Könnyebben módosítható Könnyebben megérhető 8
A programozási nyelvek fejlődése Példa: Mem.cím Gépi kódú utasítás Assembly utasítás 9
A programozási nyelvek fejlődése Új fogalmak: Forráskód (source code): a program szöveges formájú leírása Tárgykód (object code): a program gépi kódra fordított formája Fordítóprogram (compiler): amely a transzformációt elvégzi 10
A programozási nyelvek fejlődése Új fogalmak: Fordítás (compiling): a folyamat, melynek során a fordító program a forráskódból előállítja a tárgykódot De-compiler: a tárgykódból visszaállítja a forráskódot (veszteséges) 11
Elkezdődött a fordítóprogram intelligenciájának fejlődése! A programozási nyelvek fejlődése Elkezdődött a fordítóprogram intelligenciájának fejlődése! 12
A programozási nyelvek fejlődése Változó fogalmának primitív változata: Memóriacímnek azonosító adományozása A forráskódban ezen azonosítók használhatók Növeli az olvashatóságot Csak egy helyen kellett módosítani a forráskódot ha a memóriaterület címe változott X_SUGAR 5420 Y_SUGAR 5422 add ax,[X_SUGAR] 13
A programozási nyelvek fejlődése Ami hiányzik: Nincs típusfogalom Az azonosító inkább „konstans” szerepét töltötte be A memóriacímek meghatározása a programozó feladata A memóriaterületek átlapolhatóak voltak, illetve „lyukak” lehettek közöttük 14
A programozási nyelvek fejlődése Az azonosítóhoz primitív „típusnév” csatlakozik Ez egyetlen szerepet töltött be: meghatározta a memóriaigényt Így lehetőség nyílt az azonosítókhoz tartozó memóriacímek automatikus kiosztásához, egy kezdőcímhez (base address) viszonyítva folytatólagosan WORD X_SUGAR WORD Y_SUGAR add ax,[X_SUGAR] 15
A programozási nyelvek fejlődése Még mindig hiányzik: A változó helyes kezelésének ellenőrzése Pl: egy négybájtos területet lehetett kétbájtosként, egybájtosként is kezelni Nincs különbség a „bool”, „char”, „signed short”, „signed long” között, mindegyik 1 byte memóriaigény Élettartam Hatáskör 16
A programozási nyelvek fejlődése Programozási stílus fejlődése: Csak ugró utasítás létezett Az ugrás kiszámítása relatív címekkel történik (pl. „ugorj vissza 16 byte-nyit, és folytasd onnan a programot”) Van eljáráshívás . Megvalósítása ugorj … memóriacímre … térj vissza 17
A programozási nyelvek fejlődése Programozási stílus fejlődése: Az ugró utasítások pontos helyét azonosítókkal jelölték meg: Ciklus_ujra: push ax mov ax,cx jnz @Ciklus_ujra 18
A programozási nyelvek fejlődése Programozási stílus fejlődése: A jól megválasztott azonosítónevek szintén növelik a forráskód olvashatóságát Nehéz elrontani az ugrás helyének azonosítását (elgépelés valószínűleg hibás) Az eljárások belépési pontját is azonosítónév jelöli (ez már majdnem ELJÁRÁSNÉV) call @kiiras 19
A programozási nyelvek fejlődése Több modulból álló projekt (1): Lehetőség nyílik a forráskódok egyesítésére (#include) A program „hosszú” kódját szét lehet tördelni apróbb, e miatt jobban kezelhető forráskód-részekre A forráskód-darabokat a fordítóprogram egyesítette 20
A programozási nyelvek fejlődése Több modulból álló projekt (2): A fordítás gyorsítása érdekében a forráskódrészek külön kerülnek lefordításra Az apró tárgykódokat egyesíteni kell, és a kereszthivatkozások helyességét ellenőrizni Szerkesztő (linker) program Szerkesztés (linking) fázis A futtatható program előállítása egyre több, jól elkülöníthető fázisra bontható fel 21
A programozási nyelvek fejlődése Még mindig hiányzik: Nincs tisztán eljárás, az eljárás „törzsébe” is közvetlenül be lehet ugorni Egyetlen „eljárás” belsejében is tetszőleges módon lehet ugrálni előre-hátra Az assembly nyelv is processzorfüggő 22
A programozási nyelvek fejlődése Még mindig hiányzik: Nincs rögzített módszer az eljárások paraméterátadására (több módszer is létezik) Értékek (pl hibakód) visszaadására 23
A programozási nyelvek fejlődése Elkezdődött egy folyamat: általános célú rutinok megírásának igénye. Ez rohamosan csökkentette a fejlesztési sebességet! Nem kell megírni Nem kell tesztelni „Amit nem lehet megírni assemblyben, azt meg lehet írni gépi kódban. Amit nem lehet megírni gépi kódban, azt nem lehet megírni!” 24
A programozási nyelvek fejlődése 3. gen: Eljárásorientált nyelvek Elvi, szemléletbeli váltás történt ! Rögzített paraméterátadási technikák Érték szerinti Cím szerinti Rögzített érték-visszaadási technika (függvények) A formális és aktuális paraméterlista egyezőségének ellenőrzése! 25
A programozási nyelvek fejlődése Típusok: Megjelentek a nyelvi alaptípusok (bool, char, int, float, …) Megjelentek az egyszerűbben megvalósítható összetett típusok (tömb, rekord) Saját típusok definiálhatóak Típusátnevezés (név változtatása) Meglévő típusok szűkítése (pl. résztartomány-típusok) 26
A programozási nyelvek fejlődése Típusok: A változók típushoz rendelése (deklaráció) Kifejezések írhatósága, típushelyességének ellenőrzése Értékadás típushelyességének ellenőrzése Paraméterek kezelése közbeni típushelyesség ellenőrzése 27
A programozási nyelvek fejlődése Programvezérlési szerkezetek: Történelmi okokból megmaradt a „goto” A három alapvető programvezérlési szerkezet Szekvencia Szelekció Iteráció Utasításblokkok kialakíthatósága 28
A programozási nyelvek fejlődése További előnyök: Nem processzorfüggő A fordítás menete lehetséges: Először a 3. generációs forráskód átfordítása assembly forráskódra Assembly nyelvre már létezik fordítóprogram Ma már közvetlenül a gépi kód generálása a jellemzőbb 29
A programozási nyelvek fejlődése Korlátok: Saját típus fejlesztése igazából nem lehetséges. Nincs lehetőség olyan „típus” kifejlesztésére, mely a nyelvbe olyan szinten beépül, mint a gyári típusok Nincs lehetőség új operátorok fejlesztésére, a meglévőek jelentésének finomítására, a precedenciaszint megváltoztatására, stb… A nyelv kevéssé fejleszthető 30
A programozási nyelvek fejlődése 3. gen: Objektum-orientált nyelvek Elvi, szemléletbeli váltás történt ! Annyi a hasonlóság a procedurális nyelvek között, hogy nem tekintik külön generációnak A fordítóprogram intelligenciája, hibakiszúró képessége tovább fokozható Saját típusok fejlesztése majdhogynem „korlátok nélkül” 31
A programozási nyelvek fejlődése 4. gen: Speciális nyelvek Speciális feladatkörre orientálódott (pl adatbáziskezelés, grafika, matematika, …) Nagyon gyorsan elsajátítható, beszélt nyelvre (angol) emlékeztető szintaxis Nem kifejezetten szakemberek számára tervezett 32
A programozási nyelvek fejlődése 5. gen: Mesterséges Intelligencia Nem készült el (készítése folyamatban) Speciális processzor érti meg csak 33
A programozási nyelvek fejlődése Programozási nyelvek csoportosítása 1. Imperatív (procedurális) nyelvek 2. Applikatív (funkcionális) nyelvek 3. Szabály alapú (logikai) nyelvek 4. Objektumorientált nyelvek A Neumann elvű gépek memóriarekeszekben, és bennük tárolt értékekben gondolkodnak. De megjegyeznénk, hogy más ettől eltérő elvű programozási nyelvek is vannak, amelyek távolabbi absztrakciós szinten közelítik meg a probléma leírását, és megoldását. 34
A programozási nyelvek fejlődése Imperatív nyelvek Értékadó utasításokat használ ( a := b+c; ) Ezeket végrehajtva közelít a megoldáshoz Az elágazások és ciklusok segítik, hogy melyik értékadó utasítást, hányszor kell végrehajtani Erősen épít a változó fogalmára 35
A programozási nyelvek fejlődése Funkcionális nyelvek Nincsenek benne változók, és e miatt értékadó utasítás Függvények vannak benne, amelyeket ki kell értékelni MINDEN függvény benne, még az is, ami nem látszik annak A program egy nagy, bonyolult, összetett fv kiértékelését jelenti 36
A programozási nyelvek fejlődése Logikai nyelvek Formális logika és halmazelmélet szabályaira épül Tényeket tárol (tudásbázis) Kérdéseket lehet megfogalmazni benne A kérdésekre a választ a beépített tények alapján a nyelv által használt módszer szerint megkeresi a választ 37
A programozási nyelvek fejlődése Objektum-orientált nyelvek Egymással kölcsönhatásban álló objektumok összessége Minden objektumnak van interface, amely definiálja, hogy mit lehet az adott objektummal végezni, végeztetni Az objektumok egymással egymás interface-in keresztül kommunikálnak 38
A programozási nyelvek fejlődése Objektum-orientált nyelvek Egy, az interface-beli tevékenység meghívását üzenet-nek hívjuk (‘azt üzenjük neked, hogy mentsd ki az adataidat’) Egy tevékenységet általában többféle paraméterezéssel is el lehet érni (overloading) Az objektumok hordozzák saját állapotukat (változókban (mezőkben)) 39
A programozási nyelvek fejlődése Objektum-orientált nyelvek Ha egy műveletet az adott objektum visszautasít, szabványos módon jelzi a hibát a hívónak (kivételkezelés) stb… 40
A programozási nyelvek fejlődése Objektum-orientált nyelvek Az OOP nyelvek is imperatívak Az alap szintaxis (értékadás, elágazás, ciklus, …) leírására nem találnak ki új nyelvet, hanem egy már meglévő nyelv szintaxisát használják fel: C -> C++ 41
A programozási nyelvek fejlődése Objektum-orientált nyelvek Hagyományos nyelv: nem ismeri az OOP fogalmakat sem OOP támogató nyelv: a nyelv ismeri az OOP fogalmakat, de lehet benne hagyományos programokat is fejleszteni (vegyesen) OOP nyelv: csak OOP szemléleten keresztül lehet benne fejleszteni 42