Content extract
1 1 TÖRTÉNETI ÁTTEKINTÉS 1.1 ŐSNYELVEK 1. Természetes fejlődés során minőségileg új dolog születik Az 50-es évek elején megkonstruálják a Fortrant Létrehozásának oka a gépi kód alkalmazásának kényelmetlenné válása, valamint az automatizálás lehetőségének felmerülése. A Fortran tudományos, műszaki nyelv, szövegfeldolgozásra alkalmatlan, viszont alkalmas matematikai műveletek végzésére. 2. Az 50-es évek második felében megszületik a Cobol, amely adatfeldolgozásra, pénzügyi, gazdasági, nyilvántartási feladatokra alkalmas. 3. 1960-ban létrehozzák az Algol60-t Ez az első matematikai értelemben definiált nyelv Hivatkozási nyelve is van, rendezett fogalomrendszerrel rendelkezik. 1.2 TOVÁBBI NYELVEK 60-as évek első fele: Több száz nyelv születik, általában az Algol60-ra hivatkoznak. (pl BASIC, de csak a 80-as években válik világméretűvé). 60-as évek közepe: Olyan nyelvet akarnak alkotni, amely egyesíti az eddigi
nyelvek előnyeit, és operációs rendszer írására is alkalmas. Így jön létre a PL/1 A nyelv túl bonyolultra sikerült, sokmindent megpróbáltak belezsúfolni. A szakma a PL/1-t alkalmatlanak nyilvánítja operációs rendszer írására, és az eddigi nyelveket használja fel. 1967: SIMULA67: Egy teljesen eltérő filozófiát vezet be, mert objektumorientált. 1968: ALGOL68: Olyan bonyolultra tervezték, hogy egy ideig fordítóprogramja sem volt. Elméleti jelentőségű. 1971: Wirth, aki más jelentős nyelvek létrehozásában is segédkezett, megkonstruálja a PASCAL-t. Standard algoritmus-leíró nyelv, átveszi az Algol60 szerepét Eszközrendszere szűkös, rengeteg implementációja létezik, rengeteg eltéréssel. A gyakorlatban is jelentős, pl a közoktatásban az első számú nyelv. PROLOG: Európában, Franciaországban születik meg, a mesterséges intelligencia kutatás támogatására. 70-es évek közepe: Az amerikai hadügyminisztérium újabb
kívánságlistát nyújt be, melynek eredménye az ADA. Ez a nyelv saját kategóriájában a csúcs, minden benne van, ami kell Bonyolult, az elméletben kulcsnyelv, de gyakorlatban is jelentős. 70-es évek vége: C. Az ősnyelvek mellett új szerepet játszik, bizonyos verziói a 80-as évektől kezdve a szakma nyelvének számítanak. 80-as évek: Jelentős nyelvet nem konstruálnak − SMALLTALK: A 70-es évek végén születik, a 80-as években fejlődik. − EIFFEL: Csak az elméleti szerepe jelentős. − C++: Ma alapvető szerepe van. 90-es évek: JAVA. Ma a Java az egyik legelterjedtebb nyelv 2 2 A PROGRAM FELÉPÍTÉSE A magasszintű nyelven megírt programot szövegnek (forrásszöveg) nevezzük. A programozás a szöveg (forrásszöveg) előállítása Szintaktika: A szöveg összeállítására vonatkozó szabályok összessége. Szemantika: A program működésére vonatkozó szabályok összessége. Hivatkozási nyelv: Egy magasszintű nyelvnek definíciója van,
ez általában szabvány. A hivatkozási nyelv a szintaktikai és szemantikai szabályokat adja meg, definiálja a nyelvet. Csak egy darab van belőle. Implementáció: A nyelv adott rendszeren belüli konkrét megvalósítása, általában nem kompatibilis a hivatkozási nyelvvel. Fordítóprogramos technika: fordító >> (tárgyprogram) >> szerkesztőprogram >> (futtatható program) >> betöltő A szintaktikai hibák a fordításnál, a szemantikai hibák a program futása alatt (vagy egyáltalán nem) derülnek ki. Csak szintaktikailag helyes szövegnek van tárgykódja A szerkesztőprogram készíti a futtatható programot, a betöltő feladata a futtatható program betöltése a tárba és elindítása Interpreteres technika: Nincs fordítóprogram (>> nincs tárgykód), nincs szerkesztőprogram (>> nincs futtatható program). A forrásszöveget elemei szerint értelmezi, az értelmezés után rögtön az eredményt szolgáltatja. Hátránya,
hogy tárgykód hiányában állandóan kiértékel (pl. ciklusoknál), és előfordulhat, hogy az esetleges hibák helyére a tesztelés ideje alatt egyáltalán nem kerül a vezérlés (pl elágazásoknál), tehát egyes szintaktikai hibák rejtve maradhatnak 2.1 MAGASSZINTŰ NYELVEK OSZTÁLYOZÁSA 2.11 IMPERATÍV NYELVEK Utasításszerkezetűek, tehát alapeszközei az utasítások és a változók. A program szövege utasítássorozat, minden utasítás mögött gépi kód áll. Minden program utasítássorozat, amely mögött több gépi utasítás áll. Kötődnek a Neumann-architektúrához, általában fordítóprogramosak Algoritmikus nyelvek, a programban azt az algoritmust írom le, amelyet a gép végrehajt, és a probléma megoldása így születik meg A program a hatását a tár egyes területein lévő értékeken fejti ki. Eljárásorientált: A program szövege külön eszközökkel részekre tagolható. pl. Fortran, Cobol, Algol60, PL/1, Pascal, C, Ada
Objektumorientált: Modernebb nyelvek, az absztrakció megjelenése jellemzi. pl. Eiffel, Smalltalk, C++, Java, Simula67) 2.12 DEKLARATÍV NYELVEK Nincs utasításfogalom, a Neumann-architektúrától távol áll. Nem algoritmikusak, a programban csak a problémát fogalmazom meg, a megoldást nem, az algoritmus a rendszerbe van beépítve. A tárhoz a programozónak kevés köze van, nem feladata a tár egyes részeinek módosítása Funkcionális (applikatív) nyelvek: pl. Lisp Logikai nyelvek: Matematikai logikai alapokra épül. pl Prolog 2.13 MÁS ELVŰ NYELVEK Az előző nyelvek elveit tagadja, ide olyan nyelveket sorolunk, amiket máshová nem tudunk besorolni, pl. Apl 3 3 SZÖVEGÖSSZEÁLLÍTÁS Programírás: Szövegösszeállítás a programozási nyelv szemantikai és szintaktikai szabályainak figyelembevételével. A szintaktikai szabályok (formai szabályok) részben szövegesen ismertettetek, részben formálisak. Többféle formális eszközrendszer létezik a
szintaktikai szabályok leírására, ezek egyfajta eszközök a nyelv definiálására 1. BNF (az Algol60 létrehozásakor keletkezett) 2. Cobol-szerű formális leírás 3. Szintakszis-gráf 4. Hibrid (az előzőek keveréke) 1. 2. 3. 4. A) Terminális (Olyan szövegelem, amelyet egy az egyben úgy kell szerepeltetni, ahogy leírták, pl. programkezdő szavak): íráskép betű: nagybetűs nagybetű vagy egyéb: íráskép íráskép B) Nem terminális (Nem egy az egyben jelenik meg, hanem egy (kifejtendő) fogalom.): <.> kisbetű <.> (vagy kisbetű) C) Alternatíva (Választás, lehetőség.): | { . | | } D) Opció (Speciális alternatíva, a szöveg egy pontján szerepeltetek valamit vagy nem.): [ ] [ ] [ ] E) Iteráció (Szövegelem többszöri előfordulása (0-szori is)) { } . . F) Konkatenáció (Szövegelemek felfűzése, felsorolása.) G) Magyarázat (Nemterminális elemek értelmezése.) ::= : : : / ::= Szövegelemek: Karakter lexikális egység
szintaktikai egység utasítás programegység fordítási egység program 3.1 KARAKTEREK A karakterek a szöveg legelemibb alkotórészei. Minden nyelv definiálja saját karakterkészletét, hivatkozási nyelvében ritkán, általában implementációfüggő Egy nyelv minden szövegeleme az adott karakterkészletből épül fel A karakterkészlet mögött mindig kódtábla áll, ez operációs rendszer- vagy hardverfüggő, ezzel a programozási nyelv nem foglalkozik. 3.11 BETŰK Az angol ABC 26 betűje. 4 Nyelvek közötti eltérés a kis- és nagybetűk megkülönböztetésben van. − Csak a nagybetű a betű (ősnyelvek) − Nem különbözteti meg a kis- és nagybetűket (pl. Pascal) − Megkülönbözteti a kis- és nagybetűket (pl. C) 3.12 SZÁMJEGYEK Egyértelműen a decimális számok. 3.13 EGYÉB KARAKTEREK Implementációfüggő. Olyan nyelvekben, ahol a kisbetű nem betű, ott egyéb karakternek számít. Szintén egyéb karakternek számítanak az ékezetes
betűk Egyes nyelvekben viszont néhány egyéb karakternek nevezett karakter is lehet betű. Kitüntetett szerepe van a szóköznek 3.2 LEXIKÁLIS EGYSÉGEK 3.21 SZIMBOLIKUS NEVEK Azonosító: Olyan karaktersorozat, amely betűvel kezdődik és betűvel vagy számjeggyel folytatható. A programozó saját objektumainak megnevezésére használhatja, és a programban mint névre hivatkozhat rá. Hosszára a hivatkozási nyelv nem tesz megkötést, de az implementációk korlátozzák Kulcsszó (alapszó, fenntartott szó): Olyan azonosító jellegű felépítéssel rendelkező karaktersorozat, amelyhez a nyelv rendel jelentést. Csak az adott értelemmel használható (jelentését a programozó nem változtathatja meg). Standard azonosító: Karaktersorozat, azonosítónak megfelelő felépítéssel. Jelentését a nyelv definiálja, de a programozó megváltoztathatja. Azonosító nélkül nem lehet programot írni. Egyes nyelvekben nincsenek kulcsszavak, nincs olyan
karaktersorozat, amelyet ne használhatnánk azonosítónak. 3.22 CÍMKE Lexikális elem, az utasítás azonosítására szolgál, a program más pontjáról tudunk egy adott utasításra hivatkozni. A nyelvek egy részében ismeretlen fogalom, de a többség ismeri Formailag előjel nélküli egész szám vagy azonosító lehet 3.23 ELHATÁROLÓ JELEK A program, mint szöveg, sorokra tagolódik, de lényeges a sor és az utasítás kapcsolata. Kötött formátumú nyelvek (ősnyelvek): Egy sorba csak egy utasítást enged meg, esetleg több sorba egy utasítást (tördeléssel). A programozási eszközök soron belüli pozíciója rögzített a kártyaorientáltság miatt Szabad formátumú nyelvek (Algol60 óta): A sor és az utasítás kapcsolata elválik (lehetséges: egy sor egy utasítás, egy sor több utasítás, több sor több utasítás), a soron belüli pozíció nem rögzített, de el kell határolni, hogy egy utasítás meddig tart. Eszközök a megvalósítására: −
utasításszeparátor: elválasztás alapszóval (pl. begin, end) vagy pontosvesszővel (kizárásos alapon), − utasításvég: ; (pontosvessző) A tagolás célja, hogy a fordítóprogram bizonyos szövegelemeket meg tudjon különböztetni. A szimbolikus neveket, címkéket, megjegyzéseket és a konstansokat mindig el kell határolni Lexikális elem az, ami két elhatárolójel között szerepel 5 Elhatárolójelek: : (kettőspont), ; (pontosvessző), ( ) (zárójel) stb. Ha nincs, akkor általános elhatároló jel a szóköz (akárhány lehet, akár elhatároló jel mellett is) 3.24 MEGJEGYZÉS Olyan nyelvi eszköz, amely nem a fordítóprogramnak szól, hanem annak az embernek, aki a szöveget nézi (működési leírás, használati előírás stb.) Száma és hossza tetszőleges Ősnyelvek: A megjegyzés egy teljes sor, a sor első karaktere jelzi, hogy megjegyzés következik. Kötött formátumú nyelvek: A sor bizonyos pozícióin kezdődik a megjegyzés. Nem kötött
formátumú nyelvek: Bárhol lehet megjegyzés, ahol a program szövegében szóköz, mint elhatároló jel előfordulhat. A megjegyzésen belüli szóközök szimpla karakterek, és a kis- és nagybetűk is különböznek. 3.25 VÁLTOZÓ Olyan programozási eszköz, amelynek négy komponense van: 1. Név: Egyedi azonosító, a program szövegében a változó mindig a nevével jelenik meg, ez hordozza a komponenseket. 2. Attribútumok: A változó futás közbeni viselkedését, az általa felvehető értékeket határozzák meg. Az eljárásorientált nyelvekben a legfontosabb attribútum a típus, nem típusos nyelvekben ilyen komponens nincs, de más attribútum lehetséges. Változóhoz attribútum rendelés deklaráció segítségével történhet. a) explicit deklaráció Mindig a programozó végzi. A nyelvben külön utasítás van rá Az utasításban szerepeltetni kell a változó teljes nevét és az attribútumokat b) implicit deklaráció Szintén a programozó végzi. A
deklarációs utasításban betűkhöz rendelem az attribútumokat Ha a változó neve nem szerepelt explicit deklarációs utasításban, de nevének első betűjéhez rendeltem attribútumot, akkor a változó az adott attribútummal rendelkezik. c) automatikus deklaráció A programozó nem deklarál, a változó nevére sem explicit, sem implicit deklaráció nincs. Az attribútum hozzárendelését a változóhoz a fordítóprogram végzi, a változó nevének kezdőbetűje, ritkán egyéb karakterek segítségével. 3. Cím A tár azon területének a címe, ahol az adott változó értéke elhelyezkedik. Címhozzárendelés, tárkiosztási módok: a) statikus címhozzárendelés Egy változóhoz a címkomponens a futás előtt rendelődik, később állandó. Végezheti a fordítóprogram, a szerkesztőprogram vagy a betöltőprogram. b) dinamikus címhozzárendelés Változó a futási időben kap címkomponenst (amikor aktivizálódik az a programegység, amelynek lokális
változója). Ez futás közben változhat, lehet olyan futási idő intervallum, amikor nincs címkomponens A hozzárendelést a futtatórendszer végzi c) programozó által vezérelt címhozzárendelés A hozzárendelés a program szövegébe van beépítve. − abszolút cím rendelése a változó nevéhez 6 − relatív: Cím hozzárendelése a változó nevéhez egy, már a tárban elhelyezett objektum címéhez képest helyezem el a változót. − a programozó a futtatórendszer segítségét kéri a hozzárendeléshez, a többit a futtatórendszer végzi. A programozó megmondhatja, hogy az adott változónak bizonyos pillanattól kezdve legyen címkomponense Külön utasítás van a címkomponens megszüntetésére. 4. Érték Az adott tárrészen elhelyezkedő bitkombináció. A típus eldönti, hogy hány byte-on, milyen ábrázolási móddal van ábrázolva a változó, és meghatározza az értékhatárokat. A értékkomponens hozzárendelése a változó nevéhez:
− értékadó utasítással Általános formája: változó neve értékadásjel kifejezés. − input utasítással A változó a perifériáról kapja az értékét. − kezdőértékadással − explicit kezdőértékadás: A programozó az explicit deklarációs utasításban nem csak az attribútumokat, hanem az értékkomponenst is rögzíti. Megadható konstans vagy kifejezés segítségével. − automatikus kezdőértékadás: Ha egy változó címkomponenst kap, akkor értékkomponenssel is rendelkezik, mivel az adott tárrészen valamilyen bitkombináció helyezkedik el. Újabb címkomponens esetén újabb értékkomponense lesz. A hivatkozási nyelvek erre azt mondják, hogy amíg egy változóhoz nem rendelek értéket, addig nincs értékkomponense, vagy értéke határozatlan. Az implementációk nagy része viszont ismeri az automatikus kezdőértékadást: amikor egy változó címkomponenst kap, egy adott bit kombináció beállítódik (általában nullázódik).
3.26 NEVESÍTETT KONSTANS Olyan programozási eszköz, amelynek három komponense van: 1. Név Azonosító. 2. Típus Az adott nyelvben használt típusok valamelyike. 3. Érték Nem változtatható, mivel címkomponens nincs, vagy legalábbis a programozó számára nem hozzáférhető. Kérdés, hogy a nyelvekben van-e beépített (standard) nevesített konstans, a programozó definiálhat-e sajátot, hogyan adható meg az értéke (konstanssal, konstans kifejezéssel vagy kifejezéssel), milyen típussal rendelkezhet (skalár vagy strukturált). 3.27 LITERÁL, KONSTANS Programozási eszköz, amelynek két komponense van: típus és érték. Nem deklarálható, mindig önmagát definiálja, a felírt karaktersorozat alakja dönti el a típusát és az értékét. Segítségével a program szövegébe fix érték építhető be 7 4 ABSZTRAKCIÓ Az absztrakció a valós világ megismerésének fontos eszköze. Lényege a modellezés: a dolgok, tények, jelenségek, fogalmak közti
különbségeket elhanyagoljuk, a közös jellemzőket kiemeljük és ezentúl csak ezekkel jellemezzük. Az absztrakció az informatikában és a programozási nyelvek környékén is megjelenik A programozási nyelvekben elválik egymástól a specifikáció és az implementáció. Kétféle technikával valósítható meg: Adatabsztrakció: Adatokkal írjuk le a világ jellemzőit, mert az adat statikus része a világnak. Procedurális absztrakció: A műveleteket, a tevékenységeket, a viselkedést írjuk le, a világ reakcióit. Az absztrakció elősegíti az újrafelhasználhatóságot (megírtat ne kelljen újra megírni). Specifikáció: Egyes eszközöknél megmondja mire, hogyan tudom használni. Implementáció: Adott eszköz hogyan működik. 4.1 ADATTÍPUS Az adattípust egyértelműen meghatározza: − a tartomány (a megfelelő típusú objektum innen veheti fel az értékét), − a reprezentáció (bármely tartománybeli elem megjelenése a tárban, azaz az
ábrázolási hossz (byte-ban) és az ábrázolási mód), − az adott típuson végrehajtható műveletek. 4.11 TÍPUSOK CSOPORTJAI Skalár (egyszerű) típus: Tartományának elemei atomiak (típuskezelő nyelvi eszközökkel tovább nem bonthatóak), megjelenhetnek literálként a program szövegében. Strukturált (összetett) típus: Tartományának elemei egy típuskészletből valóak (általában értékcsoportot képviselnek), adatszerkezetek megvalósítására használjuk. A program objektumait típussal ellátni a deklarációs utasításban kell. Minden eljárásorientált nyelv ismeri a tömböt, és általában a rekordot is. Mindkettő strukturált típus Az összes adatszerkezet reprezentálható folytonos módon (tömbbel) az eljárásorientált nyelvekben. 4.12 NYELVEK TÍPUSRENDSZERE PL/1 típusok egyszerű programvezérlő felhasználói aritmetikai kódolt aritmetikai fixpontos bináris decimális összetett lánc címke pointer numerikus karakterlánc
bitlánc karakterlánc lebegőpontos bináris decimális tömb rekord (struktúra) 8 Numerikus karakterlánc: Speciális típus, a numerikus érték karakterlánccal van takarva. A szám ábrázolása: pakolt decimális. Ha akarom numerikus, ha akarom szöveges Címke: A cím típusú adat explicit kezelésére. Tömb: Több dimenziós tömböt is kezel. Rekord: (heterogén adatszerkezet, különböző típusú elemekből áll (mezők)). Minden rekordmező addig bontható, amíg konkrét típus nem áll elő, a legalsó szinten csak konkrét típus lehet. Különböző rekordok mezői kaphatnak azonos nevet és a különböző mezők belső mezőinek nevei is egyezhetnek. Hogy a rekordok megfelelő belső azonosítóira hivatkozni lehessen, a PL/1 bevezette a minősített név (minősítés) fogalmát. A rekordok neveinek különbözőnek kell lennie. Pascal típusok egyszerű valós sorszámozott előredefiniált összetett string[n] felsorolásos mutató rekord objektum
tömb állomány halmaz intervallum logikai egész karakteres Tömb: Szabványtömb, tetszőleges dimenziószámú tömböt kezel. Halmaz: A matematikai halmazfogalmat veszi át. Rekord: Eltér a PL/1 és az adatszerkezetek rekordfogalmától. Mezőkből áll, de nem bontható tovább Csak egyszintű rekordot enged meg, saját típusok létrehozásával viszont egymásba skatulyázhatóak A rekord mint típus lehet változó hosszúságú Új típust a beépített és a már korábban deklarált saját típusok segítségével hozhatóak létre. A saját típus egy névvel rendelkező objektum, felhasználható a további deklarációkban. Ada típusok skalár valós egész logikai karakteres felsorolásos összetett tömb mutató privát rekord Rekord: A Pascal rekordfogalmát veszi át. Skalár: A Pascal sorszámozott típusához a valós típust is hozzáteszi. Privát: Speciális típus, az adatabsztrakció magas fokát tudja vele megvalósítani. Az Ada ismeri a saját
típust, de a deklarációban minden addigitól különböző típust kell létrehozni. Létezik altípus is, ez valamely típussal egyenértékű 9 C típusok aritmetikai integrális egész int long short unsigned karakteres char származtatott valós float double tömb struktúra union mutató függvény Karakteres: Számolni lehet vele, értéke a belső kódja. Függvény: Általában más nyelvben nincs függvény típus. Tömb: Több dimenziós tömböt csak egy dimenziós tömbökből tud előállítani. Struktúra: Egyszintű rekord változó rész nélkül. Union: Olyan változó, amely a futási idő különböző pillanataiban különböző értékeket vehet fel. A felvehető értékek köre behatárolt, a megadott mezőkből mindig csak egyet tartalmaz A nyelv kifejezés- és mutatóorientált, ismeri az automatikus deklarációt. Saját típusa nem tényleges saját típus, csak egy másként is megadható típusleírást nevez meg (szinonima). 4.13 FELSOROLÁSOS
TÍPUS Saját típusként kell definiálni. Megadjuk a tartományának az elemeit, amik azonosítók lehetnek Lényeges a sorrendjük, a rendezettség miatt sorszámozhatóak Tartományának elemei megjelenhetnek literálként a program szövegében. 4.14 SORSZÁMOZOTT TÍPUS Tartományának elemei lineáris listát alkotnak, egyértelmű sorrend állítható fel közöttük és minden elemhez egy sorszám van rendelve (0,1,2,.) Kivétel a Pascal egész típusa, ahol saját magát rendelték hozzá a számhoz. Tartományának minden egyes elemére igaz, hogy van rákövetkezője (kivéve az utolsó elemet) és van megelőzője (kivéve az első elemet) A sorszámból egyértelműen megadható az elem, az elemből egyértelműen megadható a sorszám, ugyanígy az előző és a következő elem is 4.15 INTERVALLUM TÍPUS Bármely sorszámozott típusból származtatható. Nem új típus, az eredeti sorszámozott típus tartományának a leszűkítése. Az alsó határ mindig kisebb vagy
egyenlő a felső határral. 4.16 TÖMB TÍPUS A tömb típus a tömb adatszerkezet tükröződése, statikus objektum. A tömb nevével a tömb összes elemére hivatkozhatok, egy elemre hivatkozás: a tömb neve + ahány dimenzió, annyi index. Az indexes változó skalár értékű változó. Terminológia: − Skalár változó: a változó típusa egyszerű típus, egy értéket képvisel. − Strukturált változó: a változó típusa összetett típus, értékcsoportot képvisel. − Indexes változó: a tömb egy elemére (egy értékre) való hivatkozás. 10 Egy tömböt jellemez: − dimenziók száma, − indexek típusa és tartománya, − elemeinek típusa. 4.17 REKORD TÍPUS A rekord a rekord adatszerkezet tükröztetése. Szerepe, hogy különböző típusú elemeket fogjon össze egy struktúrába (heterogén). Mezőkből áll, ezeknek a mezőknek saját nevük és típusuk van. Mint típust minden nyelvben explicit módon deklarálni kell A rekord nevével a
teljes rekordra hivatkozom. Egy rekord azonos szintű mezőinek különböző nevet kell adni 4.18 MUTATÓ TÍPUS A modern nyelvek kedvelt típusa, a szétszórt reprezentáció eszköze. Speciális típus: tartománya tárbeli címeket tartalmaz, értékként tárbeli címet vehet fel Például egy mutató típusú változó címén olyan érték helyezkedik el, amely egy másik tárbeli elemre mutat. Segítségével tetszőleges objektumot tudok deklarálni, úgy hivatkozhatok a tárra, hogy nem nevezem meg a tárrészt. Ha egy tárrészt nem nevezek meg, csak akkor tudok hivatkozni rá, ha van olyan mutató, amelynek az értéke az adott tárrész címe Akárhány objektum felveheti ugyanazt a tárcímet (többszörös tárhivatkozás). Ekkor ha az egyik által mutatott címen lévő érték megváltozik, akkor a többi mutató által mutatott érték is. Nem létező tárcímre is hivatkozhatunk, erre a nyelvekben beépített nevesített konstansok szolgálnak. Bármely mutató
típusú objektumnak értékül adható 4.2 KIFEJEZÉS A kifejezés a programnyelvek szintaktikai egysége, az eddigi fogalmak jelennek meg benne. Már ismert értékek alapján új értéket határozunk meg Olyan objektum, amelynek két komponense van: érték és típus. Típussal csak a típusos nyelvekben rendelkezik Formálisan operandusokból, operátorokból és kerek zárójelekből áll. Operandusok: Az értéket képviselik, egy operandus önmagában is kifejezést alkot (a legegyszerűbb kifejezés). Operandus lehet: konstans, nevesített konstans, változó vagy függvényhívás Operátorok: Minden nyelv definiálja saját operátorait, néhol a programozó is definiálhat sajátot. Az operátorok megkülönböztethetőek az operandusok száma szerint: − egyoperandusú operátorok − kétoperandusú operátorok. Háromféle alakja lehet: infix alak (pl. 3 * 5) prefix alak (pl. * 3 5) postfix alak (pl. 3 5 *) Az infix alak nem egyértelmű, az eljárásorientált
nyelvek általában mégis ezt használják. Más nyelvek a pre- és a postfix alakot favorizálják − háromoperandusú operátorok Zárójelek: Feladatuk a precedenciatáblázat felülbírálása vagy egy részkifejezés kiemelése. Általában megengedett a redundáns zárójelek használata. Teljesen zárójelezett infix kifejezés egyértelmű. 11 4.21 KIFEJEZÉS KIÉRTÉKELÉSE Az a folyamat, amikor meghatározódik egy kifejezés értéke és típusa. A műveletek elvégzésének sorrendjét befolyásolja a balról jobbra (ill a jobbról balra) szabály és a precedenciatáblázat. A balról jobbra szabály infix kifejezéseknél használatos, de lehet jobbról balra is (általában nem infix kifejezéseknél). Az eljárásorientált nyelvekben a műveleti jelek a precedenciatáblázatba vannak elhelyezve a prioritási sorrendjük szerint. A táblázatban sorokból áll (a legerősebb prioritású sor az első sor), a sorokon belül kötési irány értelmezett. A
kiértékelés a precedenciatáblázat és a balról-jobbra szabály alapján történik. A kiértékelés a bal oldalról indul, összehasonlítja az első két operátort Ha azonos erősségűek és a kötés iránya balról jobbra tart vagy a bal oldali operátor az erősebb, kiértékeli a részkifejezést, különben továbbmegy a második és a harmadik műveleti jelre, és azokat hasonlítja össze. Implementációfüggő, hogy az első művelet végrehajtása után a kiértékelést a kifejezés elején kezdi újra vagy a kifejezés végéig folytatja a kiértékelést, és ekkor kezdi újra elölről A kiértékelés szempontjából speciálisak azok a kifejezések, amelyek logikai műveletet tartalmaznak, mert itt akár már a kiértékelés elején eldőlhet a kifejezés értéke. A nyelvek megoldásai a problémára: 1. a teljes kifejezést ki kell értékelni (teljes kiértékelés) 2. csak addig kell kiértékelni a kifejezést, amíg az érték egyértelműen el nem dől
(rövidzár kiértékelés) 3. a programozóra bízza, hogy melyiket akarja, és más operátorral jelzi 4. üzemmódként lehet beállítani egy futásra vagy programrészre, hogy melyik kiértékelést akarja a programozó, az operátorok ugyanazok 4.22 A KIFEJEZÉS TÍPUSA Típusegyenértékűség: Kétoperandusú operátor két oldalán csak azonos típusú operandusok szerepelhetnek. A művelet eredményének típusa vagy a két operandus típusával egyezik meg, vagy a művelet dönti el (pl. relációművelet esetén az eredmény logikai típusú) Típuskényszerítés: Kétoperandusú operátor két oldalán különböző típusú operandusok állnak (vegyes típusú kifejezés). Ekkor az operátorok úgy vannak definiálva, hogy a lehetséges típuskeveredések esetén megmondják mi lesz az eredmény típusa Mindig konverzió van, az eredmény típusa vagy az egyik operandus típusa vagy egy harmadik típus lesz. Speciális esete, amikor az egyik típus tartománya a másik
típus részhalmaza. Ekkor bővít vagy szűkít (kerekít vagy csonkít). Kérdés a nyelvekben, hogy konvertálható típus megengedett-e pl. értékadás, indexkifejezés és paraméterkiértékelés esetében is. Lehetőségek: 1. Szigorú típusegyenértékűség van, típuskeveredést nem enged 2. Gyakorlatilag majdnem tetszőleges típuskeveredés van 3. Egyiket vagy a másikat vallja 4.3 UTASÍTÁSOK Az utasítások a program szövegének azon egységei, amelyeket a fordítóprogramnak elsősorban fel kell ismernie, mert a fordítóprogram ezekkel az utasításokkal dolgozik. Deklarációs utasítások: A fordítóprogramnak szólnak, a működését befolyásolják, szolgáltatást kérnek, üzemmódot váltanak, információval látják el, amelyet a fordítóprogram felhasznál kód generálásánál. Nem áll mögöttük kód, a fordítóprogram nem fordítja le őket Végrehajtható utasítások: Kód áll mögöttük, a fordítóprogam lefordítja, és ezekből
generálja a tárgyprogramot. 12 − értékadó utasítások: Szerepük, hogy egy változó értékkomponensét a program futásának bármely pillanatában be tudjuk állítani, változtatni. − üres utasítások: A legtöbb magasszintű nyelvben van, néhány nyelvben elengedhetetlen, bizonyos szituációkban a nyelvek előírják. Külön gépi kódja van, jele vagy van (pl ;) vagy nincs. Hatására a program nem csinál semmit − elágaztató utasítások − ciklusszervező utasítások − ugró utasítások − hívó utasítások Ezek minden eljárásorientált nyelvben megtalálhatóak. Az elágaztató, ciklusszervező, ugró és hívó utasításokat vezérlő utasításoknak hívjuk, a program vezérlési szerkezetének felírására szolgálnak − input-output utasítások: Az adatmozgatást vezérlik a perifériák és a tár között valamelyik irányban. − egyéb utasítások: A nyelvek között a legnagyobb eltérés az egyéb utasításoknál van. 4.31
FELTÉTELES UTASÍTÁS (KÉTIRÁNYÚ ELÁGAZTATÓ UTASÍTÁS) A program egy adott pontján két tevékenység közül valamelyiket kiválasztom és azt hajtom végre, vagy megmondom, hogy a tevékenységet végrehajtsa-e vagy sem. Alakja: IF feltétel THEN tevékenység [ ELSE tevékenység ] A feltétel logikai kifejezés, vagy amelyik nyelvben nincs logikai típus, ott logikainak megfelelő értékű kifejezés. Az utasítás szemantikája: Ha a kiértékelődés után a kifejezés értéke igaz, akkor a THEN utáni tevékenység hajtódik végre. Ha az értéke hamis és nincs ELSE ág, üres utasítás, ha van ELSE ág, akkor az ELSE ágban lévő utasításokat hajtja végre. Ezután mindkét esetben a program a feltételes utasítás utáni utasításon folytatódik. A THEN és az ELSE után tetszőleges utasítás állhat, akár újabb IF is, mert egymásba skatulyázhatóak. A hivatkozási nyelv nem szabályozza az egymásba skatulyázhatóságot, de az implementációk
megszabják a számát. Ilyenkor merülhet fel a csellengő ELSE problémája 4.32 TÖBBSZÖRÖS ELÁGAZTATÓ UTASÍTÁSOK Feladata, hogy a program egy adott pontján akárhány tevékenység közül tudjak egyet választani. A választás általában egy kifejezés értékei szerint történik, lényeges a kifejezés típusa A szintaktika és a szemantika is eltér nyelvenként 4.33 CIKLUSSZERVEZŐ UTASÍTÁSOK Feladata a program adott pontján egy tevékenység egymás utáni többszörös végrehajtása. A ciklusnak formálisan van: fej mag vég feje, vége: Külön utasításokkal adjuk meg, az ismétlődésre vonatkozó információt tartalmazzák. mag: Az ismétlendő tevékenységet írja le. 4.34 FELTÉTELES CIKLUS Az ismétlődést egy logikai kifejezés vagy ennek megfelelő típusú kifejezés szabályozza. 1. előfeltételes ciklus A feltételt a fej tartalmazza. 13 Szemantikája: A feltétel kiértékelődik. Ha értéke igaz, a ciklusmag végrehajtódik és a
feltétel újra kiértékelődik. Ha hamis, a ciklus befejeződik Szélsőségei: − Ha a feltétel már az első kiértékelésnél hamis, a mag egyszer sem hajtódik végre: üres ciklus. − A kifejezés mindig igaz, a mag újra és újra végrehajtódik: végtelen ciklus. A ciklusmagban kell a feltételt hamissá tenni. 2. végfeltételes ciklus A feltétel általában a végben van, néhány nyelvben a fejben is lehet. Szemantikája: A mag lefut, utána értékelődik ki a feltétel. Ha hamis, a mag újra lefut és újra kiértékeli a feltételt Szélsőségei: − A mag egyszer mindenképpen lefut, ezért üres ciklus nem lehet. − Végtelen ciklus lehet. 4.35 ELŐÍRT LÉPÉSSZÁMÚ CIKLUS Az ismétlődésre vonatkozó információ a fejben van. Mindig tartozik hozzá egy ciklusváltozó, a ciklus magja a ciklusváltozó egy-egy adott értékére fut le Értékeit egy tartományból veheti fel, ez a fejben van megadva (kezdő- és végértékkel). Felvehet minden értéket a
tartományból vagy csak bizonyos értékeket Ekkor ezek az értékek szabályosan helyezkednek el a tartományban, és a ciklusfejben kell megadni a lépésközt. A ciklusváltozó az adott intervallumot befuthatja növekvőleg és csökkenőleg is, plusz információként az irányt is meg kell adni. A hivatkozási nyelvek nem szabályozzák, hogy elől-, vagy hátultesztelő a ciklus. 1. előltesztelő: Szemantikája: A futtató rendszer megvizsgálja a ciklusfejet, hogy a megadott irányban nem üres-e. Ha üres, ekkor üres ciklus, különben a ciklusváltozó felveszi az értéket, a mag lefut. Megvizsgálja, hogy a megadott tartományban, a megadott irányban, a megadott lépésközzel van-e még felvehető érték Ha van, a ciklusváltozó felveszi az értéket, a mag újra lefut Ha nincs, a ciklus befejeződik. Szélsőségei: Lehet üres és végtelen ciklus is. 2. hátultesztelő: Szemantikája: A ciklusváltozó felveszi a kezdőértéket, a mag lefut. A futtatórendszer
megvizsgálja, hogy az adott tartományban, a megadott irányban van-e még felvehető érték. Ha van, a ciklusváltozó felveszi az értéket, a mag újra lefut. Ha nincs, vége a ciklusnak Szélsőségei: Üres ciklus nem lehet, de végtelen igen. 4.36 FELSOROLÁSOS CIKLUS Tekinthető az előírt lépésszámú ciklus egy változatának. Az ismétlésre vonatkozó információ a fejben van A fej tartalmaz egy ciklusváltozót és egy kifejezés sorozatot A ciklusváltozó típusa tetszőleges lehet. Mikor a program vezérlése a ciklushoz ér, az értékeket a ciklusváltozó rendre felveszi és minden érték mellett egyszer lefut a mag Legalább egy érték megadása kötelező, de száma bármennyi lehet, így nem lehet sem üres, sem végtelen ciklus. Nem merül fel a ciklusváltozó megváltoztatásának problémája sem. Kevés nyelvben létezik 4.37 VÉGTELEN CIKLUS Sem a fejben, sem a magban nincs információ az ismétlődésre vonatkozóan, a magban kell lennie egy
eszköznek, hogy véget érjen. Ez általában egy külön (ciklusbefejeztető) utasítás Valamilyen esemény bekövetkeztére vár. 14 4.38 ÖSSZETETT CIKLUS A ciklusfejben a korábban felsorolt ismétlődésre vonatkozó információkból több is lehet egymás után. (Az előzőek kombinációja) Általában egy nyelvben többféle is van, de ritka, hogy egyben mind létezik. 4.39 UGRÓ UTASÍTÁS (FELTÉTEL NÉLKÜLI UGRÓ, VEZÉRLÉSÁTADÓ) Alakja: GOTO címke Ha a címke létezik, a program ott folytatódik. 4.4 PROGRAMEGYSÉGEK Az eljárásorientált nyelvekben a program szövegének egymástól többé-kevésbé független, önálló jellemzőkkel rendelkező részeit programegységeknek hívjuk. Ezek lehetnek: 1. Egymástól fizikailag függetlenek: Önállóan kezelhetőek, fordíthatóak, az egységek nem rendelkeznek különösebb belső struktúrával. 2. Mélységükben strukturálhatóak: A programegységek fizikailag nem függetlenek 3. Fizikailag külön
részek mélységükben strukturálhatóak A programegységek négy fajtája az eljárásorientált nyelvekben: alprogram, blokk, csomag és taszk. Nem minden nyelv ismeri mind a négyet Minden nyelvben létezik egy kitüntetett rész, amelyet főprogramnak hívunk. Ez egy alprogram vagy külön szintaktikával rendelkező programegység A befelé skatulyázó nyelvekben a főprogram tartalmazza az összes többi programegységet, amelyekből bármennyi lehet Szerepe az, hogy a betöltőprogram a főprogramot tölti be és neki adja át a vezérlést, később közvetett vagy közvetlen módon a többi egység vezérlését is ő végzi és általában ő fejezi be a programot. A különböző programegységek paraméterekkel, globális változókkal vagy állományok segítségével kommunikálnak. 4.41 ALPROGRAM Az összes eljárásorientált nyelv karakterisztikus egysége. Az újrafelhasználhatóság és a procedurális absztrakció eszköze. (Újrafelhasználhatóság: Ha a
program különböző részein ugyanaz az utasítássorozat fordul elő, akkor ki lehet emelni. A kiemelés helyéről hivatkozva rá aktivizálhatom Procedurális absztrakció: Lehetőség van a kiemelt szövegrész paraméterezésére, így nem csak egy tevékenység, hanem egy tevékenységcsoport végrehajtására képes.) Egy bemeneti adatcsoportból produkál kimeneti adatcsoportot, jól definiált specifikáció alapján. Nem tartalmazza a transzformációt (az implementáció ismeretlen) A hívás helyén a specifikáció a lényeges, hívhatom úgy is, hogy nem tudom, mit csinál. 15 fej törzs vég Formális kinézete: fej: A specifikációt tartalmazza. törzs: Tetszőleges utasítások, tetszőleges számban és tetszőleges sorrendben. vég: A fej és a vég általában külön alapszóval van megadva. Tartalmilag négy komponense van: 1. név Ez egy azonosító, ezért az alprogramot is deklarálni kell 2. formális paraméterek (formális paraméterlista) A
procedurális absztrakciót teszi lehetővé. Az alprogramok egy problémaosztályt oldanak meg. A probléma akkor konkretizálható, amikor az alprogramot az aktuális paraméterek megadásával meghívom A fejben található, általában kerek zárójelek között. A paraméterlistán szereplő nevek a törzsben különféle objektumok lehetnek: változók, nevesített konstansok, állománynevek, más alprogramok nevei. A korábbi nyelvekben a listán csak a paraméterek nevei szerepeltek, később a név mellet megjelent a típusmegjelölés, de lehetnek plusz információk is, amelyek a formális paraméterek futás közbeni viselkedését szabályozzák. Számuk bármennyi lehet, a nulla paraméterrel rendelkező alprogramot paraméter nélküli alprogramnak hívjuk A törzsben deklarált objektumok és a formális paraméterek az alprogram lokális objektumai. 3. törzs Az implementációt tartalmazza. Felépítése: [deklarációs utasítások] végrehajtható utasítások 4.
környezet A globális változók együttese. Két fajta alprogram létezik, a nyelvek általában külön alapszóval jelzik az eljárás vagy függvény fejében, hogy melyikről van szó: függvény: eljárás: 1. Eljárás Hatását paramétereinek, környezetének vagy mindkettőnek megváltoztatásával fejti ki. Adattranszformációt hajt végre vagy tevékenységet végez. Hívása: Utasításszerűen, végrehajtandó utasításnak tekinthető. A program szövegébe bárhol elhelyezhető eljáráshívás, ahol végrehajtandó utasítás lehet Egyes nyelvekben külön alapszóval hívható, más nyelvekben nincs rá alapszó Befejezése: 1. Az utasítások elfogynak, a vezérlést visszaadja a hívást követő utasításra 2. külön utasításra Bárhol kiadható, a program a hívást követő utasításra tér vissza. Szabályos befejeztetés GOTO-val is ki lehet lépni, de nem szabályos. A megadott címkére kerül a vezérlés, ha a címke létezik. Veszélyes,
mert a közbensőkkel bármi történhet, főleg ha egy hívási láncban vagyunk. 3. befejeztető utasításokkal / eljárásokkal A teljes programot befejeztetik. Nem teljesen szabályosak, de nem is veszélyesek 2. Függvény A matematikai fogalmat hozza át, feladata 1 db érték meghatározása. Nyelvfüggő, hogy ez az érték mennyire bonyolult struktúrájú lehet. Még egy komponense van, a függvény által 16 visszaadott érték (visszatérési érték) típusa. Ezt a függvény neve hordozza, a fejben szerepel, a specifikáció része. Hívása: Csak kifejezésben hívható meg, mert a függvény neve által hordozott értéket fel kell használni. függvénynév[(aktuális paraméterlista)]. Befejezése és értékhozzárendelés: 1. A függvény neve az eljárás törzsén belül mint változó használható (értékadó utasítás bal és jobb oldalán is), befejezéskor az értéke a legutoljára kapott érték. A függvény befejeződik, ha elértük a végét 2. A
függvény nevének az eljárás törzsén belül értéket kell kapnia, értékadó utasítás jobb oldalán a függvény neve önmagában nem szerepelhet. Befejezéskor az értéke a legutoljára kapott érték A függvény befejeződik, ha elértük a végét 3. Külön utasításra rendeli hozzá az értéket a függvény nevéhez a függvény befejeztekor A függvény feladata 1 db visszatérési érték meghatározása. Ha a függvény megváltoztatja paramétereit vagy környezetét, akkor ezt a tevékenységet mellékhatásnak hívjuk. A nyelvek általában nem javasolják, de megengedett. 4.42 REKURZIÓ alprogram alprogram vezérlésátadás kódvégrehajtás befejezés vezérlésvisszaadás Ha ez a folyamat többször ismétlődik, hívási láncról beszélünk. A lánc alaphelyzetben dinamikusan változik, eleje mindig a főprogram Függetlenül attól, hogy működik-e, minden eleme aktív. Aktív alprogram újra meghívását rekurzív hívásnak (rekurziónak)
nevezzük. Közvetlen rekurzió: A rekurzió egyszerű esete, az alprogram saját magát hívja meg. Közvetett rekurzió: Az alprogram egy másik, a hívási láncban szereplő alprogramot hív meg. Közvetlen rekurzió: Közvetett rekurzió: A nyelvek közti különbségek: Van-e rekurzió: A nyelvek egy része nem engedi meg, más nyelvekben egy alprogram bármikor hívható rekurzívan, vagy a programozóra van bízva: a specifikációban megadható, hogy az alprogram rekurzívan vagy nem rekurzívan hívható. Van-e másodlagos belépési pont: A korai nyelvekre jellemző, hogy elhelyezhető a törzsben másodlagos belépési pont. Szerkezete hasonló a fej szerkezetéhez, kompatibilis vele Az alprogram hívható a fejjel (a teljes törzs végrehajtódik), vagy a másodlagos belépési pontoknál (a törzsnek csak egy része hajtódik végre). 17 másodlagos belépési pontok Más nyelvekben nincs másodlagos belépési pont. Korutinok: Speciális alprogramok, speciális
eszközrendszert igényelnek. Két alprogram egymás közt felváltva, tetszőleges helyre adja a vezérlést. A tárgyalt nyelvek egyikében sem létezik. 4.43 PARAMÉTERKIÉRTÉKELÉS A formális paraméterlista az alprogramok specifikációjának a része, 1 db van belőle a deklaráció helyén. Aktuális paraméterlista annyi lehet, ahányszor meghívom az alprogramot A paraméterkiértékelés az a folyamat, amikor egymáshoz rendelődnek a formális és az aktuális paraméterek és meghatározódnak azok az információk, amelyek a paraméterátadásnál mozogni fognak. Mindig a formális paraméterlista az elsődleges, mert ezekhez rendelődnek az aktuális paraméterek. Ez az összerendelődés három aspektusból vizsgálható: 1. sorrend A formális paraméterek sorrendje kötött, a specifikációban megadott sorrend. Az aktuális paraméterek között is van egy bizonyos sorrend. a) Sorrendi kötés elve: Az a felsorolása hozzárendelés alapja, amelyet megadtam.
Általában minden nyelv ismeri, ez a legáltalánosabb hozzárendelés formális paraméter lista 1 2 n ↑ ↑ ↑ aktuális paraméter lista 1 2 n b) Név szerinti kötés elve: Explicit módon megmondom valamilyen szintaktikával, hogy melyik formális paraméterhez melyik aktuális paraméter tartozzon. A formális és az aktuális paraméterek sorrendje lényegtelen Jóval ritkább, mint a sorrendi kötés elve, a nyelveknek csak egy része ismeri, néhány modernebb nyelv viszont előszeretettel használja. Operációs rendszerek vezérlőnyelvében gyakori c) Vegyes alkalmazás: Olyan nyelvekben lehetséges, amelyben mindkét elv megjelenik. 2. típusegyeztetés Típusnélküli nyelvekben nincs ilyen kérdés. A formális paramétereknek típussal rendelkezik Ezt a formális paraméterlistán, régebbi nyelvekben az alprogram törzsének elején kell feltüntetni. a) Egyes nyelvekben az aktuális paraméter típusának meg kell egyeznie a formális paraméter típusával
(típusegyenértékűség van). b) Az aktuális paraméter konvertálható a formális paraméter típusára. 3. számbeli egyeztetés A formális paraméterek számától függően egy alprogram lehet: a) Fix paraméterszámú alprogram: A formális paraméterlistán adott számú formális paraméter szerepel. Ez egy konkrét, jól definiált szám, nulla vagy nullánál nagyobb b) Nem fix paraméterszámú alprogram: A formális paraméterek száma bizonyos korlátok között tetszőleges. 18 Egy nyelven belül az alprogramok vagy fix vagy nem fix paraméterszámúak. Kérdés, hogy a programozó definiálhat-e nem fix paraméterszámú alprogramot (beépített nem fix paraméterszámú alprogram van). Fix paraméterszámú alprogram meghívható: a) Ugyanannyi aktuális paraméterrel, ahány formális paraméter van (számbeli egyeztetéssel). b) Kevesebb aktuális paraméterrel. Azok a formális paramétereknek az értéke, amelyhez nem jutott aktuális paraméter a
paraméterátadásnál, valamilyen alapértelmezett. c) Több aktuális paraméterrel. Elvileg előfordulhat, de a nyelvekben nem szokás vagy nem lehetséges. Nem fix paraméterszámú alprogram meghívható annyi aktuális paraméterrel (bizonyos határok között), amennyi jólesik. 4.44 PARAMÉTERÁTADÁS A paraméter a kommunikáció eszköze, a paraméterátadás akkor történik meg, amikor kommunikáció lezajlik. Mindig van hívó és hívott fél, ők kommunikálnak A hívó tetszőleges program lehet, a hívott függvény vagy eljárás. A hívásnál definiáljuk, hogy az aktuális paraméternek milyen komponense kerül át a hívotthoz Típust átadni paraméterként nem lehet Paraméterátadási módok: 1. Érték szerinti paraméterátadás A formális paraméternek van címkomponense az alprogram területén, az aktuális paraméternek lennie kell értékkomponensének. A folyamat: Meghatározódik a rendszer által az aktuális paraméter értéke, átkerül a
hívótól a hívotthoz (átmásolódik a címkomponensre). Bizonyos kezdőértékadásnak is tekinthető Az információátadás egyirányú, a hívótól a hívott felé A hívott alprogram nem tud semmit a hívóról, a saját területén dolgozik Az aktuális paraméter ebben az esetben kifejezés lehet 2. Cím szerinti paraméterátadás A formális paraméternek nincs címkomponense a hívott alprogram területén, az aktuális paraméternek rendelkeznie kell címkomponenssel. A folyamat: Meghatározódik a rendszer által az aktuális paraméter címkomponense, ez kerül átadásra a hívótól a hívotthoz. Az aktuális paraméter értéke ezen a tárcímen helyezkedik el, az alprogram itt dolgozik. Az információátadás kétirányú. A hívott alprogram tudja hol van a hívó egység, ha nem vigyázunk, szabadon mozoghat a hívó területén. Az aktuális paraméter változó lehet 3. Eredmény szerinti paraméterátadás Mind a formális, mind az aktuális paraméternek
rendelkeznie kell címkomponenssel. A folyamat: Meghatározódik a rendszer által az aktuális paraméter címkomponense, ez kerül átadásra a hívótól a hívotthoz. Az alprogram a saját területén dolgozik, nem nyúl át futás közben a hívóba. A működés befejeztekor a címkomponensre átmásolja az értéket, egyébként az aktuális paraméter címkomponensét nem használja. Az információátadás egyirányú: a hívottól a hívó felé. Az aktuális paraméter változó lehet. 19 4. Érték eredmény szerinti paraméterátadás A formális paraméternek az alprogram területén rendelkeznie kell címkomponenssel, az aktuális paraméternek lennie kell címés értékkomponensének. A folyamat: Paraméterkiértékelésnél az aktuális paraméter érték- és címkomponense meghatározódik és mindkettő átadásra kerül az alprogramhoz. Az alprogram a saját területén dolgozik. Az alprogram működésének elején és végén történik az értékmásolás
Az információátadás kétirányú, de nem áll fenn a veszély, hogy a másik területére átnyúlok. Az aktuális paraméter változó lehet Ezt mondja a hivatkozási nyelv. Vannak implementációk, amelyek úgy hajtják végre, hogy az aktuális paraméter címkomponensét az alprogram lefutása után számítják ki, ekkor kerül át a címkomponens a hívotthoz. Az eredmény függhet tőle , mert pl a cím megváltozhat menet közben. 5. Név szerinti paraméterátadás Teljesen más elven épül fel. Az aktuális paraméter egy tetszőleges, az adott szövegkörnyezetben értelmes karaktersorozat Szimbolikus paraméterátadás történik, az aktuális paraméter mint karaktersorozat kerül át. A folyamat: A hívás pillanatában rögzítődik az alprogram szövegkörnyezete, majd a paraméterkiértékelés végén az aktuális paraméter átkerül a hívott alprogramhoz, és az alprogram szövegét véve alapul, a karaktersorozat felülírja a formális paraméter minden
egyes előfordulási helyén a formális paraméter nevét. 6. Szöveg szerinti paraméterátadás A folyamat: A paraméterkiértékelés után elindul az alprogram. Amikor a futás közben először fordul elő a megfelelő formális paraméterre történő hivatkozás, a szövegkörnyezet rögzítődik és az aktuális paraméter mindenhol felülírja a formális paraméter nevét, majd az alprogram fut tovább. A szöveg és név szerinti paraméterátadást a deklaratív nyelvek egy része szereti. Az adott programozási nyelvekben általában több paraméterátadási mód is létezik, de az összes nincs jelen egy nyelvben sem. A nyelv filozófiájától függ, melyiket szereti, azonban érték szerinti paraméterátadást a legtöbb nyelv meg tud valósítani. A paraméterek csoportosíthatóak aszerint, hogy az információ merre mozog a hívott alprogram szempontjából. A megkülönböztetés csak fogalmi, a hivatkozási nyelv nem rendezi le. a) input paraméter: A hívótól
kapnak információt. b) output paraméter: A hívott alprogram ad át információt a hívónak. c) input-output paraméter: Az információ mindkét irányban mozog. 4.45 BLOKK Formálisan van: Feje, vége: Általában egy-egy alapszóval vagy speciális jelsorozattal jelölfej ve. Törzse: Tetszőleges utasítások helyezhetőek el benne, akár deklarációs utatörzs sítások is. vég 20 Olyan programegység, amely csak más programegységen belül helyezhető el, önállóan fordítani nem lehet. Csak befelé strukturáló nyelvekben létezik A program szövegén belül bárhol elhelyezhető, tetszőlegesen egymásba skatulyázhatóak. Aktivizálható szekvenciálisan (ha odaérek, elindul), vagy a címkéző nyelvekben GOTO-val bárhonnan elérhetem. Belépni csak a fején keresztül lehet Többféleképpen fejeződhet be: 1. A törzs végére ért, a végét követő utasítással folytatódik a program 2. GOTO-val kiugrunk 3. Programbefejeztető utasítással vagy
eljárással is kiléphetünk Nincs paramétere, neve (címke jellegű) is csak bizonyos nyelvekben (címkéző nyelvek), de nem minden helyzetben van. A blokkot ismerő nyelveket blokkszerkezetű nyelveknek nevezzük. A blokknak szerepe a hatáskör definiálásánál van. 4.46 HATÁSKÖR A nevekhez kapcsolódó fogalom, a nevek jellemzője. A hatáskör a program szövegének azon része, ahol egy adott név ugyanazt az objektumot nevezi meg (az adott név jellemzője, felhasználási módja ugyanaz). Minden névhez meg kell tudni mondanom, hogy a program szövegének mely részén jelenti ugyanazt a objektumot. A hatáskörkezelés az a folyamat, amikor bármely névhez megadjuk a hatáskörét. Ennek alapja a programegység (néhány bonyolultabb nyelv kivételével). Az adott programegységen belül deklarált nevek az adott programegység lokális nevei, azok a nevek pedig, amelyeket szabályosan használok a programegységen belül, de nem ott deklaráltam, az adott
programegység globális nevei. Azt a nevet, amelyet egy programegységben használok, de ott nem deklaráltam, szabad névnek nevezzük. Kétféle hatáskörkezelés létezik: 1. Statikus hatáskörkezelés A program forrásszövegén alapul, a fordítóprogram végzi. Ha talál egy szabad nevet, kilép a tartalmazó programegységbe és megnézi, hogy a név ott deklarálva van-e. Ha ott lokális név, rendben van, ha nem, akkor újra feljebblép egy szinttel, egészen addig, amíg meg nem találja lokális névként vagy el nem jut a legkülső programegységig. Ha itt sincs deklaráció és a nyelv nem ismeri az automatikus deklaráció fogalmát, akkor hibát jelez, de ha tud automatikusan deklarálni, akkor a szabályoknak megfelelően ellátja a nevet jellemzőkkel a legkülső szinten. A lokális nevek hatásköre az a programegység, ahol deklaráltuk őket, és minden olyan tartalmazott programegység, amelyben a nevet nem deklarálom újra. A hatáskör befelé terjed,
kifelé soha (a programegység bezárja a lokális nevet). Belülről látszanak a külső nevek, ha nem deklarálom át őket 2. dinamikus hatáskörkezelés A futási időben történik, a futtatórendszer végzi. Alapja a hívási lánc Egy név hatásköre futás közben is változhat, futásonként más és más lehet. Ha a futtató rendszer talál egy szabad nevet, visszalép a hívó programegységbe és megnézi, hogy a név ott deklarálva van-e. Ha nincs, addig lépked vissza, amíg meg nem találja (lokális névként) vagy el nem jut a legkülső szintig Ha a hívási lánc első elemében sincs deklarálva és nincs automatikus deklaráció sem, hiba történt, ha ismeri az automatikus deklarációt, akkor a legelső szinten deklarálja. Dinamikus hatáskörkezelésnél egy név hatásköre az a programegység, ahol deklaráltam, illetve minden, az adott programegységből induló hívási láncban elhelyezkedő programegység, hacsak az adott programegységben a nevet nem
deklaráltam újra. Az újradeklarálástól a hívási láncban az újradeklarált név az érvényes. 21 Az imperatív nyelvek általában statikus hatáskörkezelést valósítanak meg, egyéb nyelvek a dinamikus hatáskörkezelést favorizálják. 4.47 ÉLETTARTAM A változók fontos jellemzője, a futási idő azon része, amelyben az adott változónak van címkomponense. Változó esetén a címhozzárendelés határozza meg Mind a hatáskör, mind az élettartam a programegységekhez kötődik, egymástól független de különbség az is, hogy míg a hatáskör névhez, addig az élettartam változóhoz kötődik. 22 5 ADATBEVITEL- ÉS KIVITEL Az input-output az az eszközrendszer, amit a programban akkor használunk, ha a perifériákkal akarunk kommunikálni. Hardverfüggő, operációs rendszer-függő, a leginkompatibilisebb része a nyelveknek. A nyelvek egy részében nincs I/O utasítás, más nyelvekben van. Az I/O alapja az állomány. A nyelvek gyakran
kihagyják, a kommunikációt "a" perifériával képzelik el (implicit/standard állomány) Ezt az állományt a nyelv nem kezeli explicit módon, de a rendszer igen Nem kell deklarálnom, megnyitnom, összerendelnem fizikai állománnyal, lezárnom Ilyenkor a program a szabvány bemenetről (alaphelyzetben a billentyűzet) olvas és a szabvány rendszerkimeneti perifériára (alaphelyzetben a monitor) ír A kimenet és a bemenet átdefiniálható. Logikai állomány: A program szövegében ezzel az állománnyal dolgozom. Névvel rendelkező objektum (programozási eszköz), tehát deklarálni kell A deklarációban a következő jellemzőket rendelem hozzá: − rekordformátuma, − elérése, − szerkezete. Fizikai állomány: A periférián megjelenő adatállomány. Az állomány funkciója szerint lehet: Input állomány: Csak olvasni lehet belőle. A feldolgozás előtt már léteznie kellett, és utána is változatlanul létezni fog. Output állomány:
Csak írni lehet, a feldolgozás előtt nem létezett. Input-output állomány: Írni és olvasni is lehet (változtatható), a feldolgozás előtt nem feltétlenül létezik. Az adatátvitel a tár és a periféria között a konverziótól függően lehet: 1. Konverzió nélküli: Bináris (rekordmódú) adatátvitel A adatábrázolás nem változik, ugyanaz a bitkombináció jelenik meg mindkét helyen. 2. Van konverzió: Folyamatos módú adatátvitel Más az adatok reprezentációja a tárban és a periférián. Mindenütt előfordul, ahol az ember kommunikál a géppel Az adat a periférián egy folytonos karakterlánc, a tárban pedig valamilyen reprezentáció. Hogy a tárra képezzem le a karakterláncot, feltördelni és értelmezni kell A tárban lévő egyedi adatokból konverzióval és adatösszevonással képezhetek karakterláncot. a) Formátumos adatátvitel: Az író/olvasó eszközhöz kapcsolódóan minden egyes adathoz külön speciális eszköz, a formátum
áll a rendelkezésemre. Olvasásnál megmondom, hogy a folytonos karakterláncból hány karaktert kell kiemelni onnantól, ahol éppen állok (hosszmegadás), és hogy az adatot milyen típussal értelmezze. Írásnál a fordítottját kell megmondani: mi az alapábrázolás és milyen hosszú karakterlánc legyen az eredmény. Ezeket minden egyes adatnál explicit módon kell megadnom Hiba akkor történhet, ha az adat nem megfelelő b) Szerkesztett adatátvitel: Az I/O eszköz mellé megadok egy maszkot. Akárhány adatot tudok vele kezelni, a hossza végzi a tördelést. Karakterenként adom meg, a karakter dönti el, hogy az adott helyen milyen adatot várjak. Hiba van, ha nem megfelelő az adat c) Listázott adatátvitel: Ennél az adatátviteli módnál nincsen plusz eszköz. A tördelést a folytonos karaktersorba helyezett speciális karakterek végzik. A konverziót az író/olvasó eszköz intézi. A nyelvek általában ezek keverékét alkalmazzák. 23 Műveletek
állományokkal 1. Logikai állomány deklarálása: Minden nyelv definiálja, hogy milyen állományrendszerrel dolgozik Deklarálásnál egy objektum jön létre, névvel, attribútummal 2. Logikai és a fizikai állomány összerendelése: Az egyetlen szituáció, ahol a fizikai állomány megjelenik a program szövegében Az összerendelés történhet nyelvi eszközzel, vagy ahol nincsenek rá nyelvi eszközök (régebbi nyelvek), a programon kívül. 3. Megnyitás: Csak nyitott állománnyal lehet dolgozni A megnyitás folyamán a futtatórendszer ellenőrzi, hogy az összerendelt logikai és fizikai állományok jellemzői egyeznek-e, operációs rendszer szinten rögzítődnek az információk. Az állomány funkciója eldőlhet a deklarálásnál és a megnyitásnál is, de flexibilisebben dönthető el a megnyitásnál. 4. Írás/olvasás: Az általános olvasóeszköznek meg kell adni az olvasandó állomány nevét, a változólistát, amelynek az értékkomponensét
rögzítjük az olvasás során, és sokminden mást is (formátum, maszk, egyéb információ stb., ezek a változó típusára konvertálják az adatot). Az általános íróeszköznek megadjuk az írandó állomány nevét, a kifejezéslistát, amelynek az értéke adja azt az adatot, amelyet az állományba írok, de van sok más egyéb változata is a megadásnak. 5. Állomány lezárása: Sok rendszeradminisztrációs tevékenységgel jár, a könyvtári bejegyzések is ekkor születnek meg, ha az output vagy az input-output állományokban történik változás. Ezért az output vagy az input-output állományokat le kell, az input állományokat illik lezárni. A rendszer a program végén mindenesetre lezárja őket 24 6 KIVÉTELEK A kivétel olyan esemény, szélsőséges eset, amelyre fel kell készíteni a programot az algoritmus írásakor. A kivétel előfordulhat hiba vagy speciális, ritkán bekövetkező esemény esetén Egy részét szemantikai hibák váltják
ki Operációs rendszer szinten a kivételkezelést a megszakítási rendszer végzi. Kiírja, ha hiba történt és kivágja a programot. Kivételkezeléskor az a célom, hogy az esemény kezelését átvegyem a rendszertől A kivételes események megoldására többféle módszer létezik a nyelvekben: 1. Plusz paraméterekkel jelzi a program, hogy milyen speciális esemény következett be Ebben az esetben rengeteg paramétere van szükségünk és nem kezeli le a hibát, csak jelzi. 2. Minden speciális esemény bekövetkeztére elágazást építek be a programba Legtöbb esetben a rengeteg lehetséges elágazás miatt nem valósítható meg. A kivételkezelés az a tevékenység, amit a program végez, ha kivétel történik, a kivételkezelő pedig az a programrész, amely elindul, ha a speciális esemény bekövetkezik. Az operációs rendszertől átveszem programszintre a megszakítás-kezelést Kevesebb azon nyelvek száma, ahol van kivételkezelő eszközrendszer, de a
későbbiekbe általában beépítették A kivételkezelőre vonatkozó kérdések: − vannak-e a nyelvben beépített kivételkezelők, − a programozó tud-e sajátot definiálni, − a kivételkezelőnek mik a hatásköri és élettartam szabályai (a kivételkezelés köthető-e utasításhoz, programegységhez, kifejezéshez), − mi történik a kivétel lekezelése után, − tud-e a nyelv többszörös kivételeket kezelni (egy időben több esemény következik be), − mi történik, ha a kivételkezelőben történik a kivétel, − az adott nyelvben van-e olyan eszköz, amellyel az összes kivételt implicit módon le lehet kezelni, − lehet-e általános kivételkezelőt írni, azaz paraméterezhető-e. 25 7 A PROGRAM FUTÁS KÖZBENI IMPLEMENTÁCIÓJA Az alprogramok kezelésének egyik megközelítése, a probléma implementációfüggő. Minden alprogram esetén futás közben híváskor felépül egy aktiváló rekord, ettől kezdve számítjuk aktívnak az
alprogramot. Az alprogram futásának végén az aktiváló rekord törlődik Egy alprogramnak akármennyi aktiváló rekordja lehet (pl. rekurzió) Egyszerűbb esetekben az aktiváló rekord elemei: 1. Dinamikus kapcsolók: Olyan mutató, amely a hívó alprogram aktiváló rekordjának a kezdőcímére mutat. Célja, hogy statikus hatáskörkezelésnél a hívott alprogram szükség esetén hozzá tudjon férni a hívó alprogram információihoz. Oda mutat, ameddig az alprogram inaktívvá válásakor az aktiváló rekordot törölni kell A hívási lánc lényegében az aktiváló rekordok lánca. 2. Statikus kapcsolók: Mutató, amely lerendezi a statikus hatáskörkezelés problémáját: azon alprogram aktiváló rekordjára mutat, amely alprogram tartalmazza ezt az alprogramot. Így tudni lehet, hogy az alprogram a globális neveket honnan kapja 3. Visszatérési cím: A kódszegmens azon utasításának a címe, ahol a programot az adott alprogram befejezése után folytatni
kell. 4. Függvény esetén a visszatérési érték 5. Az aktiváló rekord lokális változói 6. Paraméterek A fordítás után a gépi kódú program a megfelelő információkkal együtt bekerül a tárba. Az aktiváló rekordok a rendszerveremben (system stack) találhatóak. Minden egyes alprogramnak van kódrésze, ami a kódszegmensben jelenik meg. Ez az utasításokat, a rendszerinformációkat és a konstansokat tartalmazza A kódszegmensek általában más, de statikus tárterületen helyezkednek el. Speciális szerepe van a főprogramnak, mert nincs se tartalmazó, se hívó programegysége, se paramétere, de vannak lokális változói. Van aktiváló rekordja is, a verem legaljára kerül, a főprogram lokális változóit tartalmazza. Ha a verem üres, vége a főprogramnak. 26 TARTALOMJEGYZÉK 1 TÖRTÉNETI ÁTTEKINTÉS 1 1.1 ŐSNYELVEK 1.2 TOVÁBBI NYELVEK 1 1 2 2 A PROGRAM FELÉPÍTÉSE 2.1 MAGASSZINTŰ NYELVEK OSZTÁLYOZÁSA 2.11 IMPERATÍV NYELVEK
2.12 DEKLARATÍV NYELVEK 2.13 MÁS ELVŰ NYELVEK 2 2 2 2 3 3 SZÖVEGÖSSZEÁLLÍTÁS 3.1 KARAKTEREK 3.11 BETŰK 3.12 SZÁMJEGYEK 3.13 EGYÉB KARAKTEREK 3.2 LEXIKÁLIS EGYSÉGEK 3.21 SZIMBOLIKUS NEVEK 3.22 CÍMKE 3.23 ELHATÁROLÓ JELEK 3.24 MEGJEGYZÉS 3.25 VÁLTOZÓ 3.26 NEVESÍTETT KONSTANS 3.27 LITERÁL, KONSTANS 3 3 4 4 4 4 4 4 5 5 6 6 4 7 ABSZTRAKCIÓ 4.1 ADATTÍPUS 4.11 TÍPUSOK CSOPORTJAI 4.12 NYELVEK TÍPUSRENDSZERE 4.13 FELSOROLÁSOS TÍPUS 4.14 SORSZÁMOZOTT TÍPUS 4.15 INTERVALLUM TÍPUS 4.16 TÖMB TÍPUS 4.17 REKORD TÍPUS 4.18 MUTATÓ TÍPUS 4.2 KIFEJEZÉS 4.21 KIFEJEZÉS KIÉRTÉKELÉSE 4.22 A KIFEJEZÉS TÍPUSA 4.3 UTASÍTÁSOK 4.31 FELTÉTELES UTASÍTÁS (KÉTIRÁNYÚ ELÁGAZTATÓ UTASÍTÁS) 4.32 TÖBBSZÖRÖS ELÁGAZTATÓ UTASÍTÁSOK 7 7 7 9 9 9 9 10 10 10 11 11 11 12 12 27 4.33 CIKLUSSZERVEZŐ UTASÍTÁSOK 4.34 FELTÉTELES CIKLUS 4.35 ELŐÍRT LÉPÉSSZÁMÚ CIKLUS 4.36 FELSOROLÁSOS CIKLUS 4.37 VÉGTELEN CIKLUS 4.38 ÖSSZETETT CIKLUS 4.39 UGRÓ
UTASÍTÁS (FELTÉTEL NÉLKÜLI UGRÓ, VEZÉRLÉSÁTADÓ) 4.4 PROGRAMEGYSÉGEK 4.41 ALPROGRAM 4.42 REKURZIÓ 4.43 PARAMÉTERKIÉRTÉKELÉS 4.44 PARAMÉTERÁTADÁS 4.45 BLOKK 4.46 HATÁSKÖR 4.47 ÉLETTARTAM 12 12 13 13 13 14 14 14 14 16 17 18 19 20 21 5 ADATBEVITEL- ÉS KIVITEL 22 6 KIVÉTELEK 24 7 A PROGRAM FUTÁS KÖZBENI IMPLEMENTÁCIÓJA 25 TARTALOMJEGYZÉK 26