01 Bevezetes - Fejlodes - Eszterházy Károly Főiskola

Download Report

Transcript 01 Bevezetes - Fejlodes - Eszterházy Károly Főiskola

Hernyák Zoltán
Web: http://dragon.ektf.hu/aroan, E-Mail: [email protected]
Magasszintű
Programozási Nyelvek I.
Eszterházy Károly Főiskola
Számítástudományi tsz
http://aries.ektf.hu
1
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
1.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
Példa:
Mem.cím
Gépi kódú utasítás
Assembly utasítás
4
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
Előnye:
 Maximális futási sebesség
 Elvileg minimális memóriamennyiségfelhaszná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
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
 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
Példa:
Mem.cím
Gépi kódú utasítás
Assembly utasítás
9
Ú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
Ú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!
12
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
Y_SUGAR
5420
5422
add ax,[X_SUGAR]
13
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
Fejlődés:
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
5. gen: Mesterséges Intelligencia
Nem készült el (készítése folyamatban)
Speciális processzor érti meg csak
33
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
34
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
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
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
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
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
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
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
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