2. előadás Programegység, fordítási egység, könyvtári egység, beágyazás, blokkszerkezet, alprogramok, csomagok

Hasonló dokumentumok
Programozási nyelvek (ADA)

C++ programok fordítása

Programozási nyelvek (ADA)

Alprogramok, paraméterátadás

Programozási nyelvek I. (Az Ada) Kozsik Tamás

Bevezetés a Programozásba II 4. előadás. Adattípusok hordozhatósága

Programozás alapjai. 7. előadás

Gregorics Tibor Tanácsok modularizált programok készítéséhez 1

6. előadás Hatókör, láthatóság, élettartam. Változók leképzése a memóriára. Blokkszerkezetes nyelvek. Kivételkezelés.

Memóriagazdálkodás. Kódgenerálás. Kódoptimalizálás

Programozási nyelvek a közoktatásban alapfogalmak II. előadás

Bevezetés a programozásba I 10. gyakorlat. C++: alprogramok deklarációja és paraméterátadása

A szemantikus elemzés helye. A szemantikus elemzés feladatai. A szemantikus elemzés feladatai. Deklarációk és láthatósági szabályok

Programozás. (GKxB_INTM021) Dr. Hatwágner F. Miklós március 3. Széchenyi István Egyetem, Gy r

C programozási nyelv

15. Programok fordítása és végrehajtása

Adatbázis Rendszerek II. 5. PLSQL Csomagok 16/1B IT MAN

Programozás II. 2. Dr. Iványi Péter

és az instanceof operátor

Java VIII. Az interfacei. és az instanceof operátor. Az interfészről általában. Interfészek JAVA-ban. Krizsán Zoltán

Bevezetés a programozásba. 8. Előadás: Függvények 2.

1.1. A forrásprogramok felépítése Nevek és kulcsszavak Alapvető típusok. C programozás 3

Tételsor a Programozási nyelvek (Ada) tárgyhoz 1-10

Függvények. Programozás I. Hatwágner F. Miklós november 16. Széchenyi István Egyetem, Gy r

Programozás C- és Matlab nyelven C programozás kurzus BMEKOKAM603 Függvények. Dr. Bécsi Tamás 6. Előadás

A programozás alapjai

Informatika terméktervezőknek

C programozás. 6 óra Függvények, függvényszerű makrók, globális és

Programozás alapjai. (GKxB_INTM023) Dr. Hatwágner F. Miklós október 11. Széchenyi István Egyetem, Gy r

Fordító részei. Fordító részei. Kód visszafejtés. Izsó Tamás szeptember 29. Izsó Tamás Fordító részei / 1

1. Bevezetés szeptember 9. BME Fizika Intézet. Szám. szim. labor ea. Tőke Csaba. Tudnivalók. feladat. Tematika. Moodle Házi feladatok

Statikus adattagok. Statikus adattag inicializálása. Speciális adattagok és tagfüggvények. Általános Informatikai Tanszék

Fordítóprogramok. Aszalós László szeptember 7.

5. előadás Parametrikus polimorfizmus. Generikus programozás. Az Ada sablonok.

Mechatronika és mikroszámítógépek 2017/2018 I. félév. Bevezetés a C nyelvbe

Programozás I. 5. Előadás: Függvények

Eljárások, függvények

Függvények. Programozás alapjai C nyelv 7. gyakorlat. LNKO függvény. Függvények(2) LNKO függvény (2) LNKO függvény (3)

Programozás alapjai C nyelv 7. gyakorlat. Függvények. Függvények(2)

3. Osztályok II. Programozás II

A C programozási nyelv II. Utasítások. A függvény.

Bevezetés a programozásba Előadás: Objektumszintű és osztályszintű elemek, hibakezelés

Programozási nyelvek Java

A programozás alapjai 1 Rekurzió

Programzás I gyakorlat

ALGORITMIKUS SZERKEZETEK ELÁGAZÁSOK, CIKLUSOK, FÜGGVÉNYEK

Járműfedélzeti rendszerek II. 2. előadás Dr. Bécsi Tamás

Bevezetés a programozásba I.

Alkalmazott modul: Programozás 6. előadás. Strukturált programozás: újrafelhasználható adattípusok

Programozás C és C++ -ban

Gregorics Tibor Modularizált programok C++ nyelvi elemei 1

Oktatási segédlet 2014

Programozás módszertan p.1/110

Kifejezések. Kozsik Tamás. December 11, 2016

Bevezetés a programozásba Előadás: A const

Programozási nyelvek Java

Programozási nyelvek JAVA EA+GY 1. gyakolat

A függvény kód szekvenciáját kapcsos zárójelek közt definiáljuk, a { } -ek közti részt a Bash héj kód blokknak (code block) nevezi.

Algoritmizálás és adatmodellezés tanítása 1. előadás

Vizuális, eseményvezérelt programozás XI.

1. Alapok. Programozás II

Java programozási nyelv

S z á m í t ó g é p e s a l a p i s m e r e t e k

Bevezetés a programozásba II. 8. Előadás: Osztályok, objektumok, osztályszintű metódusok

Dinamikus csatolású függvénykönyvtár készítése és használata Plugin-szerű betöltés Egyszeű C++ osztályok készítése

Mérnöki programozás 7. Szerkesztette: dr. Vass Péter Tamás

Funkcionális és logikai programozás. { Márton Gyöngyvér, 2012} { Sapientia, Erdélyi Magyar Tudományegyetem }

Alkalmazott modul: Programozás 4. előadás. Procedurális programozás: iteratív és rekurzív alprogramok. Alprogramok. Alprogramok.

4. előadás Az Ada típusai és típuskonstrukciós eszközei, II. Rekordok és átlátszatlan típusok. A csomagok. Adatabsztrakció, egységbe zárás.

Programozás BMEKOKAA146. Dr. Bécsi Tamás 5. előadás

Eljárások és függvények

Bevezetés a programozásba I.

ISA szimulátor objektum-orientált modell (C++)

Szoftvertechnológia alapjai Java előadások

Programozás I. 1. gyakorlat. Szegedi Tudományegyetem Természettudományi és Informatikai Kar

Szkriptnyelvek. 1. UNIX shell

Mintavételes szabályozás mikrovezérlő segítségével

1. Egyszerű (primitív) típusok. 2. Referencia típusok

Segédanyagok. Formális nyelvek a gyakorlatban. Szintaktikai helyesség. Fordítóprogramok. Formális nyelvek, 1. gyakorlat

C programozás. 1 óra Bevezetés

12. gyakorlat Enum; Tárolási osztályok Preprocesszor utasítások; Moduláris programozás

Programfejlesztési Modellek

Pénzügyi algoritmusok

Fordított és szkript nyelvek összehasonlító elemzése. Sergyán Szabolcs

Occam 1. Készítette: Szabó Éva

Programozási alapismeretek beadandó feladat: ProgAlap beadandó feladatok téma 99. feladat 1

Algoritmizálás és adatmodellezés tanítása beadandó feladat: Algtan1 tanári beadandó /99 1

Verifikáció és validáció Általános bevezető

Helyes-e az alábbi kódrészlet? int i = 1; i = i * 3 + 1; int j; j = i + 1; Nem. Igen. Hányféleképpen lehet Javaban megjegyzést írni?

7. előadás Paraméterátadás. Paraméterek az Adában. Túlterhelés. Felüldefiniálás. Kifejezések.

Bevezetés a programozásba I.

Java és web programozás

2019, Funkcionális programozás. 2. el adás. MÁRTON Gyöngyvér

Programozás alapjai gyakorlat. 4. gyakorlat Konstansok, tömbök, stringek

Maximum kiválasztás tömbben

Programozás C nyelven FELÜLNÉZETBŐL elhullatott MORZSÁK. Sapientia EMTE

C++ referencia. Izsó Tamás február 17. A C++ nyelvben nagyon sok félreértés van a referenciával kapcsolatban. A Legyakoribb hibák:

Programozás alapjai gyakorlat. 2. gyakorlat C alapok

Adatbázis és szoftverfejlesztés elmélet

Átírás:

2. előadás Programegység, fordítási egység, könyvtári egység, beágyazás, blokkszerkezet, alprogramok, csomagok

Szintaxis és szemantika A nyelv szintaxisa: azoknak a szabályoknak az összessége, amelyek az adott nyelven írható összes lehetséges, formailag helyes programot (jelsorozatot) definiálják. A nyelv szemantikája: az adott nyelv programjainak jelentését leíró szabályok összessége.

Példa DD / DD / DDDD 01 / 02 / 2004 2004. január 2. vagy 2004. február 1.? Ada / C++ I = 5 3.1 + 4 A szintaxis befolyásolja a programok olvashatóságát megbízhatóságát

A szabályok ellenőrzése A fordítóprogram végzi Fordítási hibák lexikai, szintaktikus, statikus szemantikai például típushelyesség Futási hibák dinamikus szemantikai A professzionális programfejlesztéshez: minél előbb derüljön ki (inkább fordításkor) szigorú nyelv (pl. erősen típusos)

Interpreter és fordítóprogram Az interpreter egy utasítás lefordítása után azonnal végrehajtja azt A fordítóprogram átalakítja a programot egy vele ekvivalens formára a számítógép által közvetlenül végrehajtható forma egy másik programozási nyelv

Előnyök, hátrányok Az interpreter esetében közvetlenebb a kapcsolat a programozó és a program között gyorsabb, egyszerűbb visszajelzés általában kísérletezésre (pl. fejlesztésre) használható gyakran pontosabb üzenetek a futási hibákról A lefordított programok hatékonyabban futnak egyszer kell fordítani, sokszor lehet futtatni az ellenőrzéseket csak egyszer kell megcsinálni lehet optimalizálni

Fordítás: Forráskód Fordítóprogram Fordítási hibák Tárgykód

Virtuális gép Java,.NET A forráskódot lefordítjuk egy univerzális tárgykódra (Java: bájtkód) Ez a tárgykód egy virtuális számítógép által végrehajtható forma A virtuális számítógép lényegében egy interpreter, de nem forráskódot értelmez, hanem ezt a tárgykódot

Fordításkor A lefordítandó program a forrásprogram. A fordítás eredményeként kapott program a tárgyprogram. Az az idő, amikor az utasítások fordítása folyik, a fordítási idő. Az az idő, amikor az utasítások végrehajtása folyik, a végrehajtási idő.

Fordítási egység Fordítási egység vagy modul: a nyelvnek az az egysége, ami a fordítóprogram egyszeri lefuttatásával, a program többi részétől elkülönülten lefordítható. Több modulból álló programok esetében a fordítás és a végrehajtás között: a program összeszerkesztése. FORTRAN

Szerkesztés: Tárgykód Tárgykód Szerkesztőprogram Tárgykód Futtatható kód Szerkesztési hibák

A szerkesztési idő Általában a fordítással egyidőben közvetlenül a fordítás után futtatható program static time Futási/végrehajtási időben (dynamic time) nem feltétlenül készül futtatható program (Java) nem feltétlenül kerül be minden a futtatható programba (dll, so)

Futási idő A program betöltődik a memóriába Relatív címek feloldása Tényleges programvégrehajtás Dinamikus szerkesztés Java: bájtkód ellenőrzése Java: JIT fordítás

A statikus és a dinamikus szerkesztés előnyei/hátrányai Statikus csak egyszer kell megcsinálni, nem minden futtatáskor Dinamikus megoszthatók nagy könyvtárak a programok között, kisebb méretű futtatott programok csak az szerkesztődik be, amire szükség van ez esetleg mégis csökkenti a végrehajtási időt verziókhoz könnyebben alkalmazkodó program gyakori futási hiba (könyvtár hiánya vagy rossz verziója miatt)

Előfordító Forrásszöveg átalakítása Forrásszövegből forrásszöveget csinál Például a C/C++ előfordító: #include #define #if, #else, #endif - generatív programozás #ifdef, #ifndef, #undef (feltételes fordítás)

Programegység és fordítási egység A programegység egy részfeladatot megoldó, tehát funkcionálisan összefüggő programrész. A fordítási egység egy önállóan kezelhető, tehát viszonylag zárt egység. nem csak logikailag, hanem technikailag is darabolható a program könyvtárak: újrafelhasználhatóság

Fordítási egység a C/C++ nyelvekben Amit az előfordító előállít egy forrásfájlból más forrásfájlok beillesztése makrók feldolgozása Tipikusan: egy.c, illetve.cpp fájlba bekerülnek a hivatkozott (#include) fejállományok Globális változók, függvények, osztálydefiníciók, sablondefiníciók sorozata

Fordítási egység az Adában (1) Például a főprogram Egy (paraméter nélküli) eljárás + a használt könyvtárak megnevezése (with utasítás) with Ada.Text_IO; procedure Hello is begin Ada.Text_IO.Put_Line("Hello"); end Hello;

Fordítási egység az Adában (2) Általában is lehet egy alprogram programegység definíciója a kapcsolatok megadásával with Text_IO; function Négyzet( N: Integer ) procedure Kiír( S: String ) is return Natural is begin begin Text_IO.Put_Line(S); return N ** 2; end Kiír; end Négyzet;

Program több fordítási egységből function Négyzet( N: Integer ) return Integer is begin return N ** 2; end Négyzet; with Ada.Integer_Text_IO, Négyzet; procedure Kilenc is begin Ada.Integer_Text_IO.Put( Négyzet(3) ); end Kilenc;

Program több fordítási egységből function Négyzet( N: Integer ) return Integer is begin return N ** 2; end Négyzet; with Ada.Integer_Text_IO; with Négyzet; procedure Kilenc is begin Ada.Integer_Text_IO.Put( Négyzet(3) ); end Kilenc;

Fordítási egységek kapcsolatai Ada: with utasítás a fordító ellenőrzi, mit, hogyan használunk például a használt alprogram paraméterezése C++:? közösen használt fejállományok (.h) csúf szerkesztési hibák könnyebb hibát véteni Más nyelvek: export/import lista

A programegységek részei a specifikáció tartalmazza azt az információt, ami más egységek felé látható kell legyen hogyan kell használni a törzs tartalmazza az implementációs részleteket: ez rejtett más programegységek felé hogyan működik

A programegységek részei: példa with Text_IO; specifikáció procedure Hello is begin Text_IO.Put_Line("Hello"); end Hello; törzs

Csomag programegység Logikailag kapcsolatban álló entitások (alprogramok, típusok, konstansok és változók) gyűjteményeit definiálják Bonyolultabb szerkezetű, mint az alprogram Alprogram: végrehajtjuk Csomag: a komponenseit használjuk

Csomag specifikációja és törzse package A is end A; package body A is end A;

Csomag specifikációja Nem tartalmaz implementációkat (törzseket) Tartalmazhat például: alprogramdeklarációt package Ada.Text_IO is procedure Put_Line( Item: in String ) ; end Ada.Text_IO;

Csomag törzse Implementációkat (törzseket) is tartalmazhat package body Ada.Text_IO is procedure Put_Line( Item: in String ) is end Put_Line; end Ada.Text_IO;

Csomagok különálló fordítása A specifikációja és a törzse is külön-külön fordítható Egy külön fordított csomag két fordítási egységet tesz majd ki (!) Ilyenek lesznek a sablonok is Az alprogramoknál egy fordítási egység van

Csomag: specifikáció és törzs külön fordítható A csomagok használó programegységek fejlesztéséhez elég a csomag specifikációja párhuzamos fejlesztés, team-munka interfészek A kliens is fordítható, ha a specifikáció már le van fordítva Szerződés

A GNAT specialitásai Minden fordítási egységet külön fájlba kell írni a fájl neve megegyezik a programegység nevével Csomag specifikációja:.ads Csomag törzse (body):.adb Alprogram:.adb

Könyvtári egység Külön fordított programegység Az Adában: 1 vagy 2 fordítási egység pl. alprogram versus csomag Újrafelhasználhatóság Szabványos könyvtárak, saját könyvtárak

Csomag (helyett) más nyelvekben C++: osztály, névtér Java: osztály/interfész, csomag Modula-2, Clean: module

A use utasítás Csomag használata: a komponenseit használjuk Minősített névvel Text_IO.Put_Line("Hello"); A minősítés elhagyható, ha: use Text_IO; Csak csomagra alkalmazható Pascal with utasítása: rekordok komponenseit

use utasítás nélkül with Text_IO; procedure Hello is begin Text_IO.Put_Line("Hello"); end Hello;

use utasítással with Text_IO; use Text_IO; procedure Hello is begin Put_Line("Hello"); end Hello;

Más nyelvekben use-szerű C++: using namespace Java: import

Programegység beágyazása Ha nem akarom külön fordítani a használt programegységet Vagy könyvtári egységet csinálok a programegységből, vagy beágyazom Ada: bármilyen programegységet bármilyen programegységbe ALGOL 60 (blokkszerkezetes nyelv)

Programegység beágyazása: példa with Ada.Integer_Text_IO; procedure Kilenc is function Négyzet( N: Integer ) return Integer is begin return N ** 2; end Négyzet; begin Ada.Integer_Text_IO.Put( Négyzet(3) ); end Kilenc;

Blokk utasítások egymásba ágyazása declare begin declare begin end; end;

Beágyazás a C++ nyelvben Blokk utasítások: { { } } Programegységeknél: osztályba függvény class A { int f( int i ){ return i; } }; Osztályba osztály Függvénybe függvény nem ágyazható Nem nevezzük blokkszerkezetesnek C, Java stb.

Mire jó a beágyazás? Ha egy programegység hatókörét szűkre akarjuk szabni lokális, nem globális Speciális, nem akarjuk újrafelhasználhatóvá tenni logikai indok olvashatóság egységbe zárás bonyolultság kezelése Hatékonysággal kapcsolatos indokok

Alprogram Programegység Végrehajtás kezdeményezése: meghívással vannak más hívható egységek is... Eljárás és függvény C jellegű nyelvek: csak függvény esetleg void visszatérési értékkel

Eljárások és függvények Az eljárások általában a változók által kifeszített téren (állapottéren) vagy a program környezetén elvégzendő transzformációkat adnak meg. A függvények valamilyen értéket állítanak elő, de transzformációt nem végeznek. Sem a program változóinak értékére, sem a program környezetére nincsenek semmilyen hatással: a függvényeknek nincs mellékhatásuk. (Elméletben!)

Ada függvény function Faktoriális ( N: Natural ) return Positive is Fakt: Positive := 1; begin for I in 1..N loop Fakt := Fakt * I; end loop; return Fakt; end Faktoriális;

Ada eljárás procedure Cserél ( A, B: in out Integer ) is Temp: Integer := A; begin A := B; B := Temp; end Cserél;

Névválasztás Eljárás végrehajtása: utasítás. Eljárás neve: ige. Egyenest_Rajzol(Kezdôpont,Végpont); Függvény végrehajtása: kifejezés értékének meghatározása. Függvény neve: főnév vagy melléknév. if Elemek_Száma(Halmaz) > 0 then...

Paraméterek, visszatérési érték Információ átadása / átvétele alprogramhívásnál: paramétereken keresztül visszatérési értéken keresztül nem-lokális változón keresztül Paramétereknél: az információ áramlása Merre: a paraméterek módja (Ada) Hogyan: a paraméterátadás technikája (paraméterátadás módja) Alprogram hívásakor a formális paramétereknek aktuális paramétereket feleltetünk meg.

Aktuális és formális paraméter function Faktoriális ( N: Natural ) return Positive is Fakt: Positive := 1; begin for I in 1..N loop Fakt := Fakt * I; end loop; return Fakt; end Faktoriális; N_Alatt_K := Faktoriális(N) / ( Faktoriális(K) * Faktoriális(L-K) )

Visszatérés: return A függvények visszatérési értékét és annak típusát a return kulcsszó után kell megadni. A típusra nincs megkötés A függvénynek tartalmaznia kell (egy vagy több) return utasítást is. (Program_Error, ha nem azzal ér véget!) Paraméter nélküli return utasítás eljárásokban állhat: hatására az eljárás véget ér.

Formális paraméterlista procedure Szia_Világ function Maximum ( X: Integer; Y: Integer ) return Integer function Maximum ( X, Y: Integer ) return Integer procedure Cserél ( A, B: in out Integer )

Paraméterek típusa Az aktuális és a formális paraméter típusának meg kell egyeznie fordítás közben ellenőrzött Paraméterátadáskor ellenőrzésre kerül az is, hogy az átadott értékek megfelelnek-e az altípus-megszorításoknak. futási időben ellenőrzött

A paraméterek módja Az in módú: az alprogramba juttat információt a hívóból Az out módú: az alprogramban kiszámolt értéket a hívónak át tudjuk adni Az in out módú: hívó hívó hívott híváskor információt adnak az alprogramnak a hívótól az alprogram befejeződésekor információt adnak a hívónak az alprogramtól. hívó hívott hívott

Példák procedure Put ( Item: in Integer ) procedure Közös ( A, B: in Positive; Lnko, Lkkt: out Positive) procedure Cserél ( A, B: in out Integer )

Mit lehet tenni velük Egy in típusú formális paraméternek nem adhatunk értéket, csak olvashatjuk. Egy out módú paramétert lehet írni, és ha már kapott valamilyen értéket az alprogramon belül, lehet olvasni is. Egy in out módú paraméter értékét olvashatjuk és írhatjuk is. C++: const, Modula-3: READONLY

Például: procedure E ( Vi: in Integer; Vo: out Integer; Vio: in out Integer ) is begin Vio := Vi + Vo; -- helytelen, Vo-t nem olvashatjuk Vi := Vio; -- helytelen, Vi-t nem írhatjuk Vo := Vi; -- helyes Vo := 2*Vo+Vio; -- helyes, Vo már kapott értéket end E;

Helyes procedure Közös ( A, B: in Positive; Lnko, Lkkt: out Positive ) is X: Positive := A; Y: Positive := B; begin while X /= Y loop if X > Y then X := X - Y; else Y := Y - X; end if; end loop; Lnko := X; Lkkt := A * B / Lnko; end Közös;

Helytelen procedure Közös ( A, B: in Positive; Lnko, Lkkt: out Positive ) is begin Lkkt := A * B; while A /= B loop if A > B then A := A - B; else B := B - A; end if; end loop; Lnko := A; Lkkt := Lkkt / Lnko; end Közös;

Helytelen tervezés procedure Közös ( A, B: in out Positive; Lnko, Lkkt: out Positive ) is begin Lkkt := A * B; while A /= B loop if A > B then A := A - B; else B := B - A; end if; end loop; Lnko := A; Lkkt := Lkkt / Lnko; end Közös;

Mi lehet aktuális paraméter: Egy in paraméternek átadhatunk egy tetszőleges kifejezést (például egy változót is): a kifejezés értéke lesz az aktuális paraméter. Egy out vagy in out paraméterként viszont csak egy balértéket (pl. változót) adhatunk át: ebbe a balértékbe kerül majd az alprogram által kiszámított érték (illetve in out mód esetén ez a balérték tartalmazza a bemenő paraméterértéket is).

Hívások Közös(A,A+42,X,Y); Közös(Faktoriális(5),42,X,Y); Közös(30,12,20,10); -- helyes -- helyes -- helytelen Cserél(X,Y); Cserél(2,6); -- helyes -- helytelen

Paraméter alapértelmezett módja: in procedure Egyenest_Rajzol ( Kezdôpont, Végpont: Pont ) Mindkét paraméter in módú Eljárásoknál inkább írjuk ki...

Függvényparaméterek módja Függvények formális paramétere csak in módú lehet! Csak számoljon ki egy értéket, és adja vissza Nem is szoktuk kiírni az in szócskát...

Rekurzió Közvetlenül vagy közvetve önmagát hívó alprogram A ciklussal egyenértékű Elágazás van benne! function Faktoriális ( N: Natural ) return Positive is begin if N > 1 then return N * Faktoriális(N-1); else return 1; end if; end Faktoriális;