technikai adatok

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

Upload: margo

Post on 17-Jan-2016

33 views

Category:

Documents


1 download

DESCRIPTION

2. el őadás Programegység, fordítási egység, könyvtári egység, beágyazás, blokkszerkezet, alprogramok, csomagok. Technikai Adatok. Elérehetőség : aszt.inf.elte.hu /~szilagyi / szilagyi@ aszt.inf.elte.hu Fogadó óra: hétfő 10-12 2.620 szoba. Bemelegítés. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Technikai Adatok

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

Page 2: Technikai Adatok

Technikai Adatok

Elérehetőség:• aszt.inf.elte.hu/~szilagyi/• [email protected]

Fogadó óra:

hétfő 10-12 2.620 szoba

Page 3: Technikai Adatok

Bemelegítés

Példa 4.: tizfaktor1.adb (FOR, ALAPVETŐ INPUT / OUTPUT)  

Írjunk programot n! kiszámítására, ahol n a felhasználótól bekért egész szám.

 with Ada.Integer_Text_IO;

procedure Tizfaktor1 is

N : Integer;

Fakt : Integer := 1;

begin

Ada.Integer_Text_IO.Get( N );

for I in 1..N loop

Fakt := Fakt * I;

end loop;

Ada.Integer_Text_IO.Put( Fakt );

end Tizfaktor1;

Page 4: Technikai Adatok

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.

Page 5: Technikai Adatok

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)

Page 6: Technikai Adatok

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; ez lehet a számítógép által közvetlenül végrehajtható forma, vagy lehet egy másik programozási nyelv

Page 7: Technikai Adatok

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

Page 8: Technikai Adatok

Fordítás:

Forrásprogram

Fordítóprogram

Tárgykód

Fordításihibák

Page 9: Technikai Adatok

Virtuális gép

Java 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”

Page 10: Technikai Adatok

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ő.

Page 11: Technikai Adatok

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

Page 12: Technikai Adatok

Szerkesztés:

Futtathatóprogram

Szerkesztőprogram

Tárgykód

Szerkesztésihibák

Tárgykód

Tárgykód

Page 13: Technikai Adatok

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 kerül be minden a futtatható programba (dll, so)

Page 14: Technikai Adatok

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

Page 15: Technikai Adatok

A statikus és a dinamikus szerkesztés előnyei 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)

Page 16: Technikai Adatok

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

#ifdef, #ifndef, #undef (feltételes fordítás)

Előfordító

Page 17: Technikai Adatok

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

Page 18: Technikai Adatok

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

Page 19: Technikai Adatok

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 Text_IO;procedure Hello isbegin Text_IO.Put_Line("Hello");end Hello;

Page 20: Technikai Adatok

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 Ada.Text_IO; function Négyzet( N: Integer )

procedure Kiír( S: Strig ) is return Natural isbegin begin Text_IO.Put_Line(S); return N ** 2;end Kiír; end Négyzet;

Page 21: Technikai Adatok

Program több fordítási egységből

function Négyzet( N: Integer ) return Integer isbegin return N ** 2;end Négyzet;

with Ada.Integer_Text_IO, Négyzet;procedure Kilenc isbegin

Ada.Integer_Text_IO.Put( Négyzet(3) );end Kilenc;

Page 22: Technikai Adatok

Program több fordítási egységből

function Négyzet( N: Integer ) return Integer isbegin return N ** 2;end Négyzet;

with Ada.Integer_Text_IO; with Négyzet;procedure Kilenc isbegin

Ada.Integer_Text_IO.Put( Négyzet(3) );end Kilenc;

Page 23: Technikai Adatok

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– csúf szerkesztési hibák– könnyebb hibát véteni

Más nyelvek: export/import lista

Page 24: Technikai Adatok

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

Page 25: Technikai Adatok

with Text_IO;

procedure Hello isbegin

Text_IO.Put_Line("Hello");end Hello;

 

specifikáció

törzs

A programegységek részei: példa

Page 26: Technikai Adatok

Csomag programegység

Logikailag kapcsolatban álló entitások (alprogramok, típusok, konstansok és változók) gyűjteményeit definiálják

Bonyolultabb, mint az alprogram

Alprogram: végrehajtjukCsomag: a komponenseit használjuk

Page 27: Technikai Adatok

Csomag specifikációja és törzse

a.adspackage A is

end A;

a.adbpackage body A is

end A;

Page 28: Technikai Adatok

Csomag specifikációja

Nem tartalmaz implementációkat (törzseket) Például: alprogramdeklaráció

package Ada.Text_IO is

procedure Put_Line( Item: in String ) ;

end Ada.Text_IO;

Page 29: Technikai Adatok

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;

Page 30: Technikai Adatok

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

Page 31: Technikai Adatok

Csomag: specifikáció és törzs külön fordítható

A csomagokat használó programegységek fejlesztéséhez elég a csomag specifikációja– párhuzamos fejlesztés, team-munka– interfészek

Page 32: Technikai Adatok

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

Page 33: Technikai Adatok

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

Page 34: Technikai Adatok

Csomag (helyett) más nyelvekben

C++: osztály, névtér Java: osztály/interfész, csomag Modula-2, Clean: modul

Page 35: Technikai Adatok

A use utasítás

Csomag használata: a komponenseit használjuk

Minősített névvelText_IO.Put_Line("Hello");

A minősítés elhagyható, ha:use Text_IO;

Csak csomagra alkalmazható– Pascal with utasítása: rekordok komponenseit

Page 36: Technikai Adatok

use utasítás nélkül

with Text_IO;

procedure Hello is

begin

Text_IO.Put_Line("Hello");

end Hello;

Page 37: Technikai Adatok

use utasítással

with Text_IO;

use Text_IO;

procedure Hello is

begin

Put_Line("Hello");

end Hello;

Page 38: Technikai Adatok

Más nyelvekben use-szerű

C++: using namespace

Java: import

Page 39: Technikai Adatok

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)

Page 40: Technikai Adatok

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;

Page 41: Technikai Adatok

Blokk utasítások egymásba ágyazása

declare

begin

declare … begin … end;

end;

Page 42: Technikai Adatok

Beágyazás a C++ nyelvben

Blokk utasítások: { … { … } … } Programegységeknél: osztályba függvény

class A { int f( void ){ return 1; } }; Osztályba osztály Függvénybe függvény nem ágyazható

– Nem nevezzük blokkszerkezetesnek

C, Java stb.

Page 43: Technikai Adatok

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

Page 44: Technikai Adatok

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

Page 45: Technikai Adatok

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!)

Page 46: Technikai Adatok

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 függvény

Page 47: Technikai Adatok

procedure Cserél ( A, B: in out Integer ) is

Temp: Integer := A;

begin A := B; B := Temp;end Cserél;

Ada eljárás

Page 48: Technikai Adatok

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 ...

Névválasztás

Page 49: Technikai Adatok

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.

Page 50: Technikai Adatok

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;

L_Alatt_K := Faktoriális(L) / ( Faktoriális(K) * Faktoriális(L-K)

)

Aktuális és formális paraméter

Page 51: Technikai Adatok

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 is állhat: hatására az eljárás véget ér.

Visszatérés: return

Page 52: Technikai Adatok

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 )

Page 53: Technikai Adatok

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

Paraméterek típusa

Page 54: Technikai Adatok

A paraméterek módja

Az a paraméter, amit in módúnak definiálunk, az alprogramba juttat információt a hívóból.

Az out módú paraméterek ezzel szemben azért vannak, hogy az alprogramban kiszámolt értéket a hívónak át tudjuk adni.

Végül vannak az in out módú paraméterek: híváskor információt adnak az alprogramnak a hívótól, majd az alprogram befejeződésekor információt adnak a hívónak az alprogramtól.

hívott hívó

hívó

hívó

hívott

hívott

Page 55: Technikai Adatok

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 )

Page 56: Technikai Adatok

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.

Page 57: Technikai Adatok

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éketend E;

Például:

Page 58: Technikai Adatok

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;

Helyes

Page 59: Technikai Adatok

procedure Közös ( A, B: in out Positive;

Lnko, Lkkt: out Positive ) isbegin 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

Page 60: Technikai Adatok

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).

Page 61: Technikai Adatok

Hívások

Közös(A,A+42,X,Y); -- helyes

Közös(Faktoriális(5),42,X,Y); -- helyes

Közös(30,12,20,10); -- helytelen

Cserél(X,Y); -- helyes

Cserél(2,6); -- helytelen

Page 62: Technikai Adatok

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...

Page 63: Technikai Adatok

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...

Page 64: Technikai Adatok

Rekurzió

Közvetlenül vagy közvetve önmagát hívó alprogram

A ciklussal „egyenértékű”

function Faktoriális ( N: Natural ) return Positive isbegin if N > 1 then return N * Faktoriális(N-1); else return 1; end if;end Faktoriális;