programozási nyelvek i. (az ada) - eötvös loránd...
TRANSCRIPT
![Page 1: Programozási nyelvek I. (Az Ada) - Eötvös Loránd Universitykto.web.elte.hu/hu/oktatas/ada/eloadas/06.pdf · 2014-09-14 · 6. előadás Hatókör, láthatóság, élettartam](https://reader033.vdocuments.mx/reader033/viewer/2022041605/5e33a713181576740354601e/html5/thumbnails/1.jpg)
6. előadásHatókör, láthatóság, élettartam. Változók leképzése a memóriára. Blokkszerkezetes nyelvek. Kivételkezelés.
![Page 2: Programozási nyelvek I. (Az Ada) - Eötvös Loránd Universitykto.web.elte.hu/hu/oktatas/ada/eloadas/06.pdf · 2014-09-14 · 6. előadás Hatókör, láthatóság, élettartam](https://reader033.vdocuments.mx/reader033/viewer/2022041605/5e33a713181576740354601e/html5/thumbnails/2.jpg)
2
Néhány alapfogalom
Definíció Deklaráció Hatókör, láthatóság Programegység Blokkszerkezet
![Page 3: Programozási nyelvek I. (Az Ada) - Eötvös Loránd Universitykto.web.elte.hu/hu/oktatas/ada/eloadas/06.pdf · 2014-09-14 · 6. előadás Hatókör, láthatóság, élettartam](https://reader033.vdocuments.mx/reader033/viewer/2022041605/5e33a713181576740354601e/html5/thumbnails/3.jpg)
3
Definíció
Egy programentitás megadása, egy új entitás bevezetése
Változó, típus, programegység (alprogram, csomag, osztály stb.)
Például egy programegység definíciója: specifikáció és törzs– specifikáció: hogyan használhatom– törzs: hogyan működik
![Page 4: Programozási nyelvek I. (Az Ada) - Eötvös Loránd Universitykto.web.elte.hu/hu/oktatas/ada/eloadas/06.pdf · 2014-09-14 · 6. előadás Hatókör, láthatóság, élettartam](https://reader033.vdocuments.mx/reader033/viewer/2022041605/5e33a713181576740354601e/html5/thumbnails/4.jpg)
4
Deklaráció
„Bejelentés” Egy entitáshoz egy nevet rendel Ezzel a névvel lehet használni az entitást A névvel jelölt entitás tulajdonságainak
megadása (hogyan lehet használni) Nem feltétlenül definiálja az entitást
– Előre vetett deklaráció
![Page 5: Programozási nyelvek I. (Az Ada) - Eötvös Loránd Universitykto.web.elte.hu/hu/oktatas/ada/eloadas/06.pdf · 2014-09-14 · 6. előadás Hatókör, láthatóság, élettartam](https://reader033.vdocuments.mx/reader033/viewer/2022041605/5e33a713181576740354601e/html5/thumbnails/5.jpg)
5
Változódeklaráció
int x; X: Integer; A változóhoz az x/X nevet rendeli Gyakran definiálja is a változót
(memóriaterületet rendel hozzá) Nem mindig definiál:extern int x;– az x-et int típusú változóként lehet használni
![Page 6: Programozási nyelvek I. (Az Ada) - Eötvös Loránd Universitykto.web.elte.hu/hu/oktatas/ada/eloadas/06.pdf · 2014-09-14 · 6. előadás Hatókör, láthatóság, élettartam](https://reader033.vdocuments.mx/reader033/viewer/2022041605/5e33a713181576740354601e/html5/thumbnails/6.jpg)
6
Típusdefiníció és típusdeklaráció
A típusdefiníció új típust vezet be
type Int is new Integer;
Tömb: array (1..0) of Float; A típusdeklaráció egy nevet vezet be egy típushoz
typedef int integer; // szinoníma
Név szerinti vs. szerkezeti típusekvivalencia
![Page 7: Programozási nyelvek I. (Az Ada) - Eötvös Loránd Universitykto.web.elte.hu/hu/oktatas/ada/eloadas/06.pdf · 2014-09-14 · 6. előadás Hatókör, láthatóság, élettartam](https://reader033.vdocuments.mx/reader033/viewer/2022041605/5e33a713181576740354601e/html5/thumbnails/7.jpg)
7
Alprogram definíciója
void swap( int& x, int& y ){
int z = x; x = y; y = z;}
procedure Swap ( X, Y: in out Integer ) isZ: Integer := X;
beginX := Y; Y := Z;
end Swap;
specifikáció
törzs
deklarációk is
![Page 8: Programozási nyelvek I. (Az Ada) - Eötvös Loránd Universitykto.web.elte.hu/hu/oktatas/ada/eloadas/06.pdf · 2014-09-14 · 6. előadás Hatókör, láthatóság, élettartam](https://reader033.vdocuments.mx/reader033/viewer/2022041605/5e33a713181576740354601e/html5/thumbnails/8.jpg)
8
Alprogram deklarációja
Nem kell a teljes definíció Csak az, hogy hogyan kell használni
– specifikáció
void swap( int& x, int& y ); procedure Swap ( X, Y: in out Integer );
![Page 9: Programozási nyelvek I. (Az Ada) - Eötvös Loránd Universitykto.web.elte.hu/hu/oktatas/ada/eloadas/06.pdf · 2014-09-14 · 6. előadás Hatókör, láthatóság, élettartam](https://reader033.vdocuments.mx/reader033/viewer/2022041605/5e33a713181576740354601e/html5/thumbnails/9.jpg)
9
Deklaráció definíció nélkül (1)
Interfészek definiálásánál (osztály, csomag, modul)
package Ada.Text_IO is…procedure Put(Item : in String);…
end Ada.Text_IO;Csak deklaráljuk.
A definíció a csomagtörzsben.
![Page 10: Programozási nyelvek I. (Az Ada) - Eötvös Loránd Universitykto.web.elte.hu/hu/oktatas/ada/eloadas/06.pdf · 2014-09-14 · 6. előadás Hatókör, láthatóság, élettartam](https://reader033.vdocuments.mx/reader033/viewer/2022041605/5e33a713181576740354601e/html5/thumbnails/10.jpg)
10
Hasonló a C/C++ nyelvekben
#ifndef PROBA_H #include "proba.h"
#define PROBA_H int x;
extern int x; int f ( int p ) { return x+p; }
int f ( int p );
#endif /* PROBA_H */
#include "proba.h"
int g( int t ) {
x = 1; return f(t);
}
![Page 11: Programozási nyelvek I. (Az Ada) - Eötvös Loránd Universitykto.web.elte.hu/hu/oktatas/ada/eloadas/06.pdf · 2014-09-14 · 6. előadás Hatókör, láthatóság, élettartam](https://reader033.vdocuments.mx/reader033/viewer/2022041605/5e33a713181576740354601e/html5/thumbnails/11.jpg)
11
Deklaráció definíció nélkül (2)
Kölcsönös rekurzió feloldása
procedure B ( … );
procedure A ( … ) is … begin … B(…); … end A;
procedure B ( … ) is … begin … A(…); … end B;
![Page 12: Programozási nyelvek I. (Az Ada) - Eötvös Loránd Universitykto.web.elte.hu/hu/oktatas/ada/eloadas/06.pdf · 2014-09-14 · 6. előadás Hatókör, láthatóság, élettartam](https://reader033.vdocuments.mx/reader033/viewer/2022041605/5e33a713181576740354601e/html5/thumbnails/12.jpg)
12
Deklaráció definíció nélkül (3)
Ada: a renames utasítás. Szinoníma.– szöveg rövidítésére– nevek közötti konfliktusok feloldására– a végrehajtási idő csökkentésére
function Gcd ( A, B: Positive ) return Positive renames Lnko;
AI: Float renames A(I);…AI := AI + 1;
![Page 13: Programozási nyelvek I. (Az Ada) - Eötvös Loránd Universitykto.web.elte.hu/hu/oktatas/ada/eloadas/06.pdf · 2014-09-14 · 6. előadás Hatókör, láthatóság, élettartam](https://reader033.vdocuments.mx/reader033/viewer/2022041605/5e33a713181576740354601e/html5/thumbnails/13.jpg)
13
Definíció deklaráció nélkül
Ha nem adunk nevet a létrehozott entitásnak– funkcionális nyelvek: lambda-függvények– Java: névtelen osztályok
Ada: új típust definiálunk név nélkültype T is array (1..0) of Integer;V: T;X: array (1..10) of Integer;Y: array (1..10) of Integer;
![Page 14: Programozási nyelvek I. (Az Ada) - Eötvös Loránd Universitykto.web.elte.hu/hu/oktatas/ada/eloadas/06.pdf · 2014-09-14 · 6. előadás Hatókör, láthatóság, élettartam](https://reader033.vdocuments.mx/reader033/viewer/2022041605/5e33a713181576740354601e/html5/thumbnails/14.jpg)
14
Deklaráció hatóköre
Hatókör, hatáskör: scope A deklaráció összekapcsol egy entitást egy
névvel Hatókör:
– a programszöveg egy szakasza– amíg az összekapcsolás érvényben van
Ezen belül érhetjük el az entitást a névvel– Nem biztos, hogy elérjük, lásd láthatóság
![Page 15: Programozási nyelvek I. (Az Ada) - Eötvös Loránd Universitykto.web.elte.hu/hu/oktatas/ada/eloadas/06.pdf · 2014-09-14 · 6. előadás Hatókör, láthatóság, élettartam](https://reader033.vdocuments.mx/reader033/viewer/2022041605/5e33a713181576740354601e/html5/thumbnails/15.jpg)
15
Deklaráció láthatósága
Visibility A hatókör része Ahol a név az entitást azonosítja Nem feltétlenül az egész hatókör Elfedés (hiding) lehetséges
![Page 16: Programozási nyelvek I. (Az Ada) - Eötvös Loránd Universitykto.web.elte.hu/hu/oktatas/ada/eloadas/06.pdf · 2014-09-14 · 6. előadás Hatókör, láthatóság, élettartam](https://reader033.vdocuments.mx/reader033/viewer/2022041605/5e33a713181576740354601e/html5/thumbnails/16.jpg)
16
Elfedés
{
int x = 1;
{
int x = 2;
cout << x << endl;
}
}
declare
X: Integer := 1;
begin
declare
X: Integer := 2;
begin
Put(X);
end;
end; Két változó ugyanazzal a
névvel
![Page 17: Programozási nyelvek I. (Az Ada) - Eötvös Loránd Universitykto.web.elte.hu/hu/oktatas/ada/eloadas/06.pdf · 2014-09-14 · 6. előadás Hatókör, láthatóság, élettartam](https://reader033.vdocuments.mx/reader033/viewer/2022041605/5e33a713181576740354601e/html5/thumbnails/17.jpg)
17
Kiterjesztett láthatóság
procedure A is
X: Integer := 1;
begin
declare
X: Integer := 2;
begin
Put(X); Put(A.X);
end;
end;
K: declare
X: Integer := 1;
begin
B: declare
X: Integer := 2;
begin
Put(X); Put(K.X);
end B;
end K;
Minősített név
![Page 18: Programozási nyelvek I. (Az Ada) - Eötvös Loránd Universitykto.web.elte.hu/hu/oktatas/ada/eloadas/06.pdf · 2014-09-14 · 6. előadás Hatókör, láthatóság, élettartam](https://reader033.vdocuments.mx/reader033/viewer/2022041605/5e33a713181576740354601e/html5/thumbnails/18.jpg)
18
Hierarchikus felépítés
Egymásba ágyazunk programrészeket– programegységeket, utasításokat
Blokk– blokk utasítás– alprogram
A hatóköri, láthatósági szabályok alapja
![Page 19: Programozási nyelvek I. (Az Ada) - Eötvös Loránd Universitykto.web.elte.hu/hu/oktatas/ada/eloadas/06.pdf · 2014-09-14 · 6. előadás Hatókör, láthatóság, élettartam](https://reader033.vdocuments.mx/reader033/viewer/2022041605/5e33a713181576740354601e/html5/thumbnails/19.jpg)
19
Beágyazás
Programegységet egy blokk deklarációs részébe Blokk utasítást egy blokk utasítássorozat-részébe
procedure A isprocedure B is … begin … end;
begindeclare
procedure C is … begin … end;begin
declare … begin … end;end;
end;
![Page 20: Programozási nyelvek I. (Az Ada) - Eötvös Loránd Universitykto.web.elte.hu/hu/oktatas/ada/eloadas/06.pdf · 2014-09-14 · 6. előadás Hatókör, láthatóság, élettartam](https://reader033.vdocuments.mx/reader033/viewer/2022041605/5e33a713181576740354601e/html5/thumbnails/20.jpg)
20
Blokkszerkezetes nyelvek
Alprogramot beágyazhatunk alprogramba– Ilyen: Algol 60, Pascal, Ada, Haskell– Nem ilyen: C, C++, Java(!)…
A nyelv megvalósítása szempontjából fontos kérdés– Később még visszatérünk rá…
![Page 21: Programozási nyelvek I. (Az Ada) - Eötvös Loránd Universitykto.web.elte.hu/hu/oktatas/ada/eloadas/06.pdf · 2014-09-14 · 6. előadás Hatókör, láthatóság, élettartam](https://reader033.vdocuments.mx/reader033/viewer/2022041605/5e33a713181576740354601e/html5/thumbnails/21.jpg)
21
Blokkok és hatókör
Egy blokk deklarációinak hatóköre a deklarációtól a blokk végéig tart
Beleértve a beágyazott blokkokat isprocedure A is
procedure B is … begin … end;begin
declareprocedure C is … begin … end;
begindeclare … begin … end;
end;end;
![Page 22: Programozási nyelvek I. (Az Ada) - Eötvös Loránd Universitykto.web.elte.hu/hu/oktatas/ada/eloadas/06.pdf · 2014-09-14 · 6. előadás Hatókör, láthatóság, élettartam](https://reader033.vdocuments.mx/reader033/viewer/2022041605/5e33a713181576740354601e/html5/thumbnails/22.jpg)
22
Blokkok és láthatóság (1)
procedure A isprocedure B is … begin … end;…
begin…declare
…procedure B is … begin … end;…
begin…
end;…
end;
![Page 23: Programozási nyelvek I. (Az Ada) - Eötvös Loránd Universitykto.web.elte.hu/hu/oktatas/ada/eloadas/06.pdf · 2014-09-14 · 6. előadás Hatókör, láthatóság, élettartam](https://reader033.vdocuments.mx/reader033/viewer/2022041605/5e33a713181576740354601e/html5/thumbnails/23.jpg)
23
Blokkok és láthatóság (2)
procedure A isprocedure B is … begin … B; …end;…
beginB;declare
…procedure B is … begin … B; … end;…
beginB;
end;B;
end;
![Page 24: Programozási nyelvek I. (Az Ada) - Eötvös Loránd Universitykto.web.elte.hu/hu/oktatas/ada/eloadas/06.pdf · 2014-09-14 · 6. előadás Hatókör, láthatóság, élettartam](https://reader033.vdocuments.mx/reader033/viewer/2022041605/5e33a713181576740354601e/html5/thumbnails/24.jpg)
24
Lokális és nonlokális deklaráció
Egy blokkban elhelyezett deklaráció lokális (local) a blokkra nézve
– A blokkon kívülről nem hivatkozható Egy külső blokkban elhelyezett deklaráció
nonlokális (non-local) a befoglalt blokkok számára
– Alternatív elnevezés: globális a befoglalt blokkra nézve
declare X: Float; begin declare … begin … end; end;
![Page 25: Programozási nyelvek I. (Az Ada) - Eötvös Loránd Universitykto.web.elte.hu/hu/oktatas/ada/eloadas/06.pdf · 2014-09-14 · 6. előadás Hatókör, láthatóság, élettartam](https://reader033.vdocuments.mx/reader033/viewer/2022041605/5e33a713181576740354601e/html5/thumbnails/25.jpg)
25
Globális deklaráció
Eddig: lokális / nonlokális (globális) egy deklaráció egy blokkra nézve
– relatív Globális deklaráció: az egész programra
vonatkozik– A hatóköre az egész program– abszolút
int glo; void f ( int par ) { int loc = par; glo = loc; }
![Page 26: Programozási nyelvek I. (Az Ada) - Eötvös Loránd Universitykto.web.elte.hu/hu/oktatas/ada/eloadas/06.pdf · 2014-09-14 · 6. előadás Hatókör, láthatóság, élettartam](https://reader033.vdocuments.mx/reader033/viewer/2022041605/5e33a713181576740354601e/html5/thumbnails/26.jpg)
26
Lokális/nonlokális/globális változó
Az X egy– lokális változó, – nonlokális változó, – globális változó
Az X deklarációja olyan
Ugyanez más entitásokra is(alprogram, típus…)
![Page 27: Programozási nyelvek I. (Az Ada) - Eötvös Loránd Universitykto.web.elte.hu/hu/oktatas/ada/eloadas/06.pdf · 2014-09-14 · 6. előadás Hatókör, láthatóság, élettartam](https://reader033.vdocuments.mx/reader033/viewer/2022041605/5e33a713181576740354601e/html5/thumbnails/27.jpg)
27
Statikus és dinamikus hatókör
A programozási nyelvek többségében: statikus Dinamikus: egy alprogramban a hivatkozásokat a hívás
környezetében értelmezzükprocedure A is
procedure B is … begin … end B;procedure C is … begin B; end C;procedure D is
procedure B is … begin … end B;begin
C;end D;
begin D; end A;
![Page 28: Programozási nyelvek I. (Az Ada) - Eötvös Loránd Universitykto.web.elte.hu/hu/oktatas/ada/eloadas/06.pdf · 2014-09-14 · 6. előadás Hatókör, láthatóság, élettartam](https://reader033.vdocuments.mx/reader033/viewer/2022041605/5e33a713181576740354601e/html5/thumbnails/28.jpg)
28
Változók élettartama
A program végrehajtási idejének egy szakasza
Amíg a változó számára lefoglalt tárhely a változójé
Kapcsolódó fogalmak– Hatókör– Memóriára való leképzés
![Page 29: Programozási nyelvek I. (Az Ada) - Eötvös Loránd Universitykto.web.elte.hu/hu/oktatas/ada/eloadas/06.pdf · 2014-09-14 · 6. előadás Hatókör, láthatóság, élettartam](https://reader033.vdocuments.mx/reader033/viewer/2022041605/5e33a713181576740354601e/html5/thumbnails/29.jpg)
29
Hatókör és élettartam
Sok esetben az élettartam az az idő, amíg a változó hatókörében vagyunk
– Globális változó: az egész program végrehajtása alatt létezik
– Lokális változó: csak a definiáló blokk végrehajtása alatt létezik
Nem mindig így van– „Dinamikusan” lefoglalt változók– C/C++ static változók, Java zárványok (inner)
![Page 30: Programozási nyelvek I. (Az Ada) - Eötvös Loránd Universitykto.web.elte.hu/hu/oktatas/ada/eloadas/06.pdf · 2014-09-14 · 6. előadás Hatókör, láthatóság, élettartam](https://reader033.vdocuments.mx/reader033/viewer/2022041605/5e33a713181576740354601e/html5/thumbnails/30.jpg)
30
Dinamikusan lefoglalt változók
Allokátorral lefoglalt tárterület Mutatók, referenciák (egy későbbi előadás) Lásd még: memóriára való leképzés
![Page 31: Programozási nyelvek I. (Az Ada) - Eötvös Loránd Universitykto.web.elte.hu/hu/oktatas/ada/eloadas/06.pdf · 2014-09-14 · 6. előadás Hatókör, láthatóság, élettartam](https://reader033.vdocuments.mx/reader033/viewer/2022041605/5e33a713181576740354601e/html5/thumbnails/31.jpg)
31
Ha a hatókör kisebb az élettartamnál
int sum ( int p ){
static int s = 0;s += p;return s;
} void f ( void ){ cout << sum(10) << endl; cout << sum(3) << endl;}
![Page 32: Programozási nyelvek I. (Az Ada) - Eötvös Loránd Universitykto.web.elte.hu/hu/oktatas/ada/eloadas/06.pdf · 2014-09-14 · 6. előadás Hatókör, láthatóság, élettartam](https://reader033.vdocuments.mx/reader033/viewer/2022041605/5e33a713181576740354601e/html5/thumbnails/32.jpg)
32
Deklaráció kiértékelése
Statikus (fordítás közben)– Rugalmatlan– C, C++
int t[10];
Dinamikus (futás közben)– pl. Ada– A blokk utasítás szerepe
![Page 33: Programozási nyelvek I. (Az Ada) - Eötvös Loránd Universitykto.web.elte.hu/hu/oktatas/ada/eloadas/06.pdf · 2014-09-14 · 6. előadás Hatókör, láthatóság, élettartam](https://reader033.vdocuments.mx/reader033/viewer/2022041605/5e33a713181576740354601e/html5/thumbnails/33.jpg)
33
A blokk utasítás egyik haszna
procedure A isN: Integer;
beginPut("Hány adat lesz?"); Get(N);declare
T: array (1..N) of Integer;begin
-- beolvasás és feldolgozásend;
end;
![Page 34: Programozási nyelvek I. (Az Ada) - Eötvös Loránd Universitykto.web.elte.hu/hu/oktatas/ada/eloadas/06.pdf · 2014-09-14 · 6. előadás Hatókör, láthatóság, élettartam](https://reader033.vdocuments.mx/reader033/viewer/2022041605/5e33a713181576740354601e/html5/thumbnails/34.jpg)
34
Egy másik haszon
Ha egy nagy tárigényű változót csak rövid ideig akarok használni
Egy blokk utasítás lokális változója
Ada: kivételkezelés
![Page 35: Programozási nyelvek I. (Az Ada) - Eötvös Loránd Universitykto.web.elte.hu/hu/oktatas/ada/eloadas/06.pdf · 2014-09-14 · 6. előadás Hatókör, láthatóság, élettartam](https://reader033.vdocuments.mx/reader033/viewer/2022041605/5e33a713181576740354601e/html5/thumbnails/35.jpg)
35
Változók leképzése a memóriára
Statikus– A fordító a tárgykódban lefoglal neki helyet
Automatikus– Futás közben a végrehajtási vermen jön létre és
szűnik meg Dinamikus
– Allokátorral foglaljuk le, és pl. deallokátorral szabadítjuk fel (vagy a szemétgyűjtés…)
![Page 36: Programozási nyelvek I. (Az Ada) - Eötvös Loránd Universitykto.web.elte.hu/hu/oktatas/ada/eloadas/06.pdf · 2014-09-14 · 6. előadás Hatókör, láthatóság, élettartam](https://reader033.vdocuments.mx/reader033/viewer/2022041605/5e33a713181576740354601e/html5/thumbnails/36.jpg)
36
Statikus változók
Az élettartamuk a teljes program végrehajtása
Fordítási időben tárterület rendelhető hozzájuk
Tipikusan a globális változók– A hatókörhöz igazodó élettartam
De ilyenek a C/C++ static változók is Egy futtatható program: kód + adat
![Page 37: Programozási nyelvek I. (Az Ada) - Eötvös Loránd Universitykto.web.elte.hu/hu/oktatas/ada/eloadas/06.pdf · 2014-09-14 · 6. előadás Hatókör, láthatóság, élettartam](https://reader033.vdocuments.mx/reader033/viewer/2022041605/5e33a713181576740354601e/html5/thumbnails/37.jpg)
37
Egy program a memóriában
Futtatás közben a program által használt tár felépítése:– kód– (statikus) adatok– végrehajtási verem– dinamikus tárterület (heap)
![Page 38: Programozási nyelvek I. (Az Ada) - Eötvös Loránd Universitykto.web.elte.hu/hu/oktatas/ada/eloadas/06.pdf · 2014-09-14 · 6. előadás Hatókör, láthatóság, élettartam](https://reader033.vdocuments.mx/reader033/viewer/2022041605/5e33a713181576740354601e/html5/thumbnails/38.jpg)
38
Dinamikus változók
Dinamikus tárterület– Ahonnan a programozó allokátorral tud
memóriát foglalni– Explicit felszabadítás vagy szemétgyűjtés
Mutatók és referenciák Utasítás hatására jön létre (és esetleg
szabadul fel) a változó– Statikus és automatikus: deklaráció hatására
![Page 39: Programozási nyelvek I. (Az Ada) - Eötvös Loránd Universitykto.web.elte.hu/hu/oktatas/ada/eloadas/06.pdf · 2014-09-14 · 6. előadás Hatókör, láthatóság, élettartam](https://reader033.vdocuments.mx/reader033/viewer/2022041605/5e33a713181576740354601e/html5/thumbnails/39.jpg)
39
Végrehajtási verem
execution stack Az alprogramhívások tárolására Az éppen végrehajtás alatt álló alprogramokról
aktivációs rekordok A verem teteje: melyik alprogramban van az
aktuálisan végrehajtott utasítás A verem alja: a főprogram Egy alprogram nem érhet véget, amíg az általa
hívott alprogramok véget nem értek Dinamikus (hívási) lánc
![Page 40: Programozási nyelvek I. (Az Ada) - Eötvös Loránd Universitykto.web.elte.hu/hu/oktatas/ada/eloadas/06.pdf · 2014-09-14 · 6. előadás Hatókör, láthatóság, élettartam](https://reader033.vdocuments.mx/reader033/viewer/2022041605/5e33a713181576740354601e/html5/thumbnails/40.jpg)
40
Aktivációs rekord
Activation record, stack frame Egy alprogram meghívásakor bekerül egy
aktivációs rekord a verembe Az alprogram befejeződésekor kikerül az
aktivációs rekord a veremből Rekurzív alprogram: több aktivációs rekord Az aktivációs rekord tartalma:
paraméterek, lokális változók, egyebek– Blokkszerkezetes statikus hatókörű nyelvek esetén:
tartalmazó alprogram
![Page 41: Programozási nyelvek I. (Az Ada) - Eötvös Loránd Universitykto.web.elte.hu/hu/oktatas/ada/eloadas/06.pdf · 2014-09-14 · 6. előadás Hatókör, láthatóság, élettartam](https://reader033.vdocuments.mx/reader033/viewer/2022041605/5e33a713181576740354601e/html5/thumbnails/41.jpg)
41
Automatikus változók
A végrehajtási veremben A blokkok (alprogramok, blokk utasítások)
lokális változói– ha nem static…
Automatikusan jönnek létre és szűnnek meg a blokk végrehajtásakor– A hatókörhöz igazodó élettartam
Rekurzió: több példány is lehet belőlük
![Page 42: Programozási nyelvek I. (Az Ada) - Eötvös Loránd Universitykto.web.elte.hu/hu/oktatas/ada/eloadas/06.pdf · 2014-09-14 · 6. előadás Hatókör, láthatóság, élettartam](https://reader033.vdocuments.mx/reader033/viewer/2022041605/5e33a713181576740354601e/html5/thumbnails/42.jpg)
42
Kivételek
A végrehajtási verem kiürítése– stack trace
Vezérlésátadás kivételes esetek kezelésénél Kivétel: eltérés a megszokottól, az átlagostól
– Programhiba (dinamikus szemantikai hiba)pl. tömb túlindexelése
– Speciális eset jelzése
Kiváltódás, terjedés, lekezelés, definiálás, kiváltás
![Page 43: Programozási nyelvek I. (Az Ada) - Eötvös Loránd Universitykto.web.elte.hu/hu/oktatas/ada/eloadas/06.pdf · 2014-09-14 · 6. előadás Hatókör, láthatóság, élettartam](https://reader033.vdocuments.mx/reader033/viewer/2022041605/5e33a713181576740354601e/html5/thumbnails/43.jpg)
43
Nyelvi eszköz kivételkezelésre
A modern nyelvekben gyakori– Már a COBOL-ban és a PL/I-ben is (‘60)– Ada, C++, Java, Delphi, Visual Basic…– Sok „apró” különbség
Előtte (pl. Pascal, C)– Globális változók, speciális visszatérési értékek
jelezték a kivételt– A kivétel észlelése: elágazás– Kusza kód
![Page 44: Programozási nyelvek I. (Az Ada) - Eötvös Loránd Universitykto.web.elte.hu/hu/oktatas/ada/eloadas/06.pdf · 2014-09-14 · 6. előadás Hatókör, láthatóság, élettartam](https://reader033.vdocuments.mx/reader033/viewer/2022041605/5e33a713181576740354601e/html5/thumbnails/44.jpg)
44
Szétválasztás
Az átlagos és a kivételes szétválasztandó A kivételes események kezelését külön
adjuk meg Elkerülhető a kusza kód Megbízható, mégis olvasható, karbantartható
Aspektuselvű programozás
![Page 45: Programozási nyelvek I. (Az Ada) - Eötvös Loránd Universitykto.web.elte.hu/hu/oktatas/ada/eloadas/06.pdf · 2014-09-14 · 6. előadás Hatókör, láthatóság, élettartam](https://reader033.vdocuments.mx/reader033/viewer/2022041605/5e33a713181576740354601e/html5/thumbnails/45.jpg)
45
Előre definiált kivételek az Adában
Constraint_Error (és Numeric_Error) Program_Error Storage_Error
Tasking_Error
A szabványos könyvtárak által definiált kivételek (pl. Ada.IO_Exceptions.End_Error)
![Page 46: Programozási nyelvek I. (Az Ada) - Eötvös Loránd Universitykto.web.elte.hu/hu/oktatas/ada/eloadas/06.pdf · 2014-09-14 · 6. előadás Hatókör, láthatóság, élettartam](https://reader033.vdocuments.mx/reader033/viewer/2022041605/5e33a713181576740354601e/html5/thumbnails/46.jpg)
46
Constraint_Error
Megszorítás megsértése
procedure CE is
I: Natural := 100;
begin
loop
I := I-1;
end loop;
end CE;
![Page 47: Programozási nyelvek I. (Az Ada) - Eötvös Loránd Universitykto.web.elte.hu/hu/oktatas/ada/eloadas/06.pdf · 2014-09-14 · 6. előadás Hatókör, láthatóság, élettartam](https://reader033.vdocuments.mx/reader033/viewer/2022041605/5e33a713181576740354601e/html5/thumbnails/47.jpg)
47
Program_Error
Hibás programszerkezet
procedure PE is
generic procedure G;
procedure P is new G;
procedure G is begin null; end;
begin
P;
end PE;
![Page 48: Programozási nyelvek I. (Az Ada) - Eötvös Loránd Universitykto.web.elte.hu/hu/oktatas/ada/eloadas/06.pdf · 2014-09-14 · 6. előadás Hatókör, láthatóság, élettartam](https://reader033.vdocuments.mx/reader033/viewer/2022041605/5e33a713181576740354601e/html5/thumbnails/48.jpg)
48
Storage_Error
Nincs elég memória
procedure SE is type T( N: Positive := 256) is record
H: Positive; Str: String(1..N);
end record; V: T;
begin …end SE;
![Page 49: Programozási nyelvek I. (Az Ada) - Eötvös Loránd Universitykto.web.elte.hu/hu/oktatas/ada/eloadas/06.pdf · 2014-09-14 · 6. előadás Hatókör, láthatóság, élettartam](https://reader033.vdocuments.mx/reader033/viewer/2022041605/5e33a713181576740354601e/html5/thumbnails/49.jpg)
49
Kivételek definiálása
A C++ esetében bármi lehet kivétel A Java esetében egy speciális osztály és
leszármazottai
Az Ada esetében spec. nyelvi konstrukció
Hibás_Fájlnév: exception;
Üres_A_Verem, Tele_A_Verem: exception;
![Page 50: Programozási nyelvek I. (Az Ada) - Eötvös Loránd Universitykto.web.elte.hu/hu/oktatas/ada/eloadas/06.pdf · 2014-09-14 · 6. előadás Hatókör, láthatóság, élettartam](https://reader033.vdocuments.mx/reader033/viewer/2022041605/5e33a713181576740354601e/html5/thumbnails/50.jpg)
50
Kivétel kiváltódása és terjedése
Egy utasítás végrehajtása közben váltódhat ki („fellép”)
A hívottból a hívóba terjed– A hívottban is fellép a hívás helyén
A végrehajtási verem mentén Dobáljuk ki az aktivációs rekordokat Ha a verem kiürül, leáll a program
![Page 51: Programozási nyelvek I. (Az Ada) - Eötvös Loránd Universitykto.web.elte.hu/hu/oktatas/ada/eloadas/06.pdf · 2014-09-14 · 6. előadás Hatókör, láthatóság, élettartam](https://reader033.vdocuments.mx/reader033/viewer/2022041605/5e33a713181576740354601e/html5/thumbnails/51.jpg)
51
Kivételek terjedése és a blokkok
Alprogramok– „Dinamikus tartalmazás”– Ha egy meghívott alprogramban fellép
és nem kezeljük le, akkorfellép a hívó blokkban is a hívás helyszínén
Blokk utasítás– „Statikus tartalmazás”– Ha egy blokk utasításban fellép
és nem kezeljük le, akkorfellép a tartalmazó blokkban is a tartalmazás helyszínén
![Page 52: Programozási nyelvek I. (Az Ada) - Eötvös Loránd Universitykto.web.elte.hu/hu/oktatas/ada/eloadas/06.pdf · 2014-09-14 · 6. előadás Hatókör, láthatóság, élettartam](https://reader033.vdocuments.mx/reader033/viewer/2022041605/5e33a713181576740354601e/html5/thumbnails/52.jpg)
52
Kivételek kezelése
C++ esetén: try-catch összetett utasítás Ada: blokk kivételkezelő része
– alprogram és blokk utasítás is lehet– a végén opcionális kivételkezelő rész– benne kivételkezelő ágak
![Page 53: Programozási nyelvek I. (Az Ada) - Eötvös Loránd Universitykto.web.elte.hu/hu/oktatas/ada/eloadas/06.pdf · 2014-09-14 · 6. előadás Hatókör, láthatóság, élettartam](https://reader033.vdocuments.mx/reader033/viewer/2022041605/5e33a713181576740354601e/html5/thumbnails/53.jpg)
53
Kivételkezelő rész alprogramban
procedure A ( S: in out Stack; N: in out Natural ) isX: Positive;
beginPush(S, N);Pop(S, X);
exceptionwhen Constraint_Error => Push(S,N);
N := 1;when Tele_A_Verem => null;
end A;
![Page 54: Programozási nyelvek I. (Az Ada) - Eötvös Loránd Universitykto.web.elte.hu/hu/oktatas/ada/eloadas/06.pdf · 2014-09-14 · 6. előadás Hatókör, láthatóság, élettartam](https://reader033.vdocuments.mx/reader033/viewer/2022041605/5e33a713181576740354601e/html5/thumbnails/54.jpg)
54
Kivételkezelő rész blokk utasításban
declareN: Positive := Lnko(64*43, 975);
beginPut( N );Get( N );…
exceptionwhen Constraint_Error => …
end;
![Page 55: Programozási nyelvek I. (Az Ada) - Eötvös Loránd Universitykto.web.elte.hu/hu/oktatas/ada/eloadas/06.pdf · 2014-09-14 · 6. előadás Hatókör, láthatóság, élettartam](https://reader033.vdocuments.mx/reader033/viewer/2022041605/5e33a713181576740354601e/html5/thumbnails/55.jpg)
55
Kivételkezelő ágak
Egy ággal több, különböző kivételt is lekezelhetünk
exception when Name_Error =>
Put_Line("Hibás fájlnevet adott meg!"); when End_Error | Hibás_Formátum =>
Close(Bemenet_fájl);Close(Kimenet_fájl); Put_Line("A fájl szerkezete nem jó.");
end;
![Page 56: Programozási nyelvek I. (Az Ada) - Eötvös Loránd Universitykto.web.elte.hu/hu/oktatas/ada/eloadas/06.pdf · 2014-09-14 · 6. előadás Hatókör, láthatóság, élettartam](https://reader033.vdocuments.mx/reader033/viewer/2022041605/5e33a713181576740354601e/html5/thumbnails/56.jpg)
56
when others =>
Az összes fellépő kivételt lekezeli Azokat is, amelyek deklarációja nem látható Veszélyes, de néha kell
when others => null; Az utolsó ág kell, hogy legyen
exceptionwhen Constraint_Error => null; when others => Put_Line("Nem Constraint_Error.");
end;
![Page 57: Programozási nyelvek I. (Az Ada) - Eötvös Loránd Universitykto.web.elte.hu/hu/oktatas/ada/eloadas/06.pdf · 2014-09-14 · 6. előadás Hatókör, láthatóság, élettartam](https://reader033.vdocuments.mx/reader033/viewer/2022041605/5e33a713181576740354601e/html5/thumbnails/57.jpg)
57
Nem deklarált kivételek és az others
declareprocedure A is
X: exception;begin … end;
beginA;
exceptionwhen others => …
end;
![Page 58: Programozási nyelvek I. (Az Ada) - Eötvös Loránd Universitykto.web.elte.hu/hu/oktatas/ada/eloadas/06.pdf · 2014-09-14 · 6. előadás Hatókör, láthatóság, élettartam](https://reader033.vdocuments.mx/reader033/viewer/2022041605/5e33a713181576740354601e/html5/thumbnails/58.jpg)
58
Kivételkezelő rész keresése
A kivétel terjedése mentén Alprogram: hívó blokkban,
Blokk utasítás: tartalmazó blokkban A lekezelt kivétel nem terjed tovább
– Hacsak újra ki nem váltjuk… Ha nem találunk megfelelő kivételkezelőt
– A végrehajtási vermet kiürítjük– A program hibaüzenettel végetér
![Page 59: Programozási nyelvek I. (Az Ada) - Eötvös Loránd Universitykto.web.elte.hu/hu/oktatas/ada/eloadas/06.pdf · 2014-09-14 · 6. előadás Hatókör, láthatóság, élettartam](https://reader033.vdocuments.mx/reader033/viewer/2022041605/5e33a713181576740354601e/html5/thumbnails/59.jpg)
59
Ha egy blokkban kivétel keletkezik
Az utasítások végrehajtása közben:– A blokkban lekezelhetjük egy kivételkezelő
részben (a blokkban „lép fel”)
A deklarációk kiértékelése, vagy a kivételkezelő rész végrehajtása közben:– Csak a hívóban/tartalmazóban kezelhető le
(ott „lép fel”)
![Page 60: Programozási nyelvek I. (Az Ada) - Eötvös Loránd Universitykto.web.elte.hu/hu/oktatas/ada/eloadas/06.pdf · 2014-09-14 · 6. előadás Hatókör, láthatóság, élettartam](https://reader033.vdocuments.mx/reader033/viewer/2022041605/5e33a713181576740354601e/html5/thumbnails/60.jpg)
60
Kivétel deklarációk kiértékelésekor
declare V: T:= F(10); …begin …exception …end;
a tartalmazó blokkban!
![Page 61: Programozási nyelvek I. (Az Ada) - Eötvös Loránd Universitykto.web.elte.hu/hu/oktatas/ada/eloadas/06.pdf · 2014-09-14 · 6. előadás Hatókör, láthatóság, élettartam](https://reader033.vdocuments.mx/reader033/viewer/2022041605/5e33a713181576740354601e/html5/thumbnails/61.jpg)
61
Kivételek kiváltása
C++, Java: throw utasítás Ada: raise utasítás
Előre definiált és programozó által definiált kivétel is kiváltható
Kivételes szituáció kialakulásának jelzése
![Page 62: Programozási nyelvek I. (Az Ada) - Eötvös Loránd Universitykto.web.elte.hu/hu/oktatas/ada/eloadas/06.pdf · 2014-09-14 · 6. előadás Hatókör, láthatóság, élettartam](https://reader033.vdocuments.mx/reader033/viewer/2022041605/5e33a713181576740354601e/html5/thumbnails/62.jpg)
62
Ha nem tudok elvégezni egy műveletet (1)
generictype Element is private;
package Stacks is…Stack_Empty, Stack_Full: exception;…function Top ( S: Stack ) return Element;
-- Top can raise Stack_Empty…
end Stacks;
előfeltétel
![Page 63: Programozási nyelvek I. (Az Ada) - Eötvös Loránd Universitykto.web.elte.hu/hu/oktatas/ada/eloadas/06.pdf · 2014-09-14 · 6. előadás Hatókör, láthatóság, élettartam](https://reader033.vdocuments.mx/reader033/viewer/2022041605/5e33a713181576740354601e/html5/thumbnails/63.jpg)
63
Ha nem tudok elvégezni egy műveletet (2)
generictype Element is private;
package Stacks is…Stack_Empty, Stack_Full: exception;…function Top ( S: Stack ) return Element;
-- Top can raise Stack_Empty…
end Stacks;
előfeltétel
csak megjegyzés
![Page 64: Programozási nyelvek I. (Az Ada) - Eötvös Loránd Universitykto.web.elte.hu/hu/oktatas/ada/eloadas/06.pdf · 2014-09-14 · 6. előadás Hatókör, láthatóság, élettartam](https://reader033.vdocuments.mx/reader033/viewer/2022041605/5e33a713181576740354601e/html5/thumbnails/64.jpg)
64
Ha nem tudok elvégezni egy műveletet (3)package body Stacks is
…function Top ( S: Stack ) return Element isbegin
if Is_Empty(S) then raise Stack_Empty; else … end if;
end Top;…
end Stacks;
az előfeltétel ellenőrzése
![Page 65: Programozási nyelvek I. (Az Ada) - Eötvös Loránd Universitykto.web.elte.hu/hu/oktatas/ada/eloadas/06.pdf · 2014-09-14 · 6. előadás Hatókör, láthatóság, élettartam](https://reader033.vdocuments.mx/reader033/viewer/2022041605/5e33a713181576740354601e/html5/thumbnails/65.jpg)
65
Mire használom a kivételeket?
Kivételes eset jelzésére– Előfeltétel nem teljesült– Valami elromlott menet közben
(pl. hálózati kapcsolat megszakadt)
Kivételes eset lekezelésére– Tovább futhasson az alkalmazás– Kilépés előtt valamit csináljak még
(log-olás, erőforrások elengedése)
![Page 66: Programozási nyelvek I. (Az Ada) - Eötvös Loránd Universitykto.web.elte.hu/hu/oktatas/ada/eloadas/06.pdf · 2014-09-14 · 6. előadás Hatókör, láthatóság, élettartam](https://reader033.vdocuments.mx/reader033/viewer/2022041605/5e33a713181576740354601e/html5/thumbnails/66.jpg)
66
Kivétel újrakiváltása
Biztonságos menekülésdeclare
…begin
... -- adatok kiírása az F fájlbaexception
when others => Close(F); raise;end;
![Page 67: Programozási nyelvek I. (Az Ada) - Eötvös Loránd Universitykto.web.elte.hu/hu/oktatas/ada/eloadas/06.pdf · 2014-09-14 · 6. előadás Hatókör, láthatóság, élettartam](https://reader033.vdocuments.mx/reader033/viewer/2022041605/5e33a713181576740354601e/html5/thumbnails/67.jpg)
67
Kivétel lecserélése
package body Stacks is…function Top ( S: Stack ) return Element isbegin
return S.Data( S.Stack_Pointer );exception
when Constraint_Error => raise Stack_Empty;end Top;…
end Stacks;ha üres
Szétválasztás
![Page 68: Programozási nyelvek I. (Az Ada) - Eötvös Loránd Universitykto.web.elte.hu/hu/oktatas/ada/eloadas/06.pdf · 2014-09-14 · 6. előadás Hatókör, láthatóság, élettartam](https://reader033.vdocuments.mx/reader033/viewer/2022041605/5e33a713181576740354601e/html5/thumbnails/68.jpg)
68
Kivétel, mint vezérlési szerkezet
type Napok is (Hétfő, Kedd, Szerda, … Vasárnap);
function Holnap ( Ma: Napok ) return Napok is
begin
return Napok’Succ(Ma);
exception
when Constraint_Error => return Napok’First;
end;
![Page 69: Programozási nyelvek I. (Az Ada) - Eötvös Loránd Universitykto.web.elte.hu/hu/oktatas/ada/eloadas/06.pdf · 2014-09-14 · 6. előadás Hatókör, láthatóság, élettartam](https://reader033.vdocuments.mx/reader033/viewer/2022041605/5e33a713181576740354601e/html5/thumbnails/69.jpg)
69
Többletinformáció a kivételes esetről
C++ és Java esetében a kivétel plussz információkat tárolhat, hordozhat
Ada 95: kivételpéldányok– korlátozott lehetőség– csak szöveges adat (hibaüzenet)– az Ada.Exceptions csomag
![Page 70: Programozási nyelvek I. (Az Ada) - Eötvös Loránd Universitykto.web.elte.hu/hu/oktatas/ada/eloadas/06.pdf · 2014-09-14 · 6. előadás Hatókör, láthatóság, élettartam](https://reader033.vdocuments.mx/reader033/viewer/2022041605/5e33a713181576740354601e/html5/thumbnails/70.jpg)
70
Az Ada.Exceptions csomag
with Ada.Exceptions; use Ada.Exceptions;...exception
when E: Stack_Full =>Close(F);Put_Line( Standard_Error, Exception_Message(E) );Raise_Exception(
Exception_Identity(E), Exception_Message(E) & "(logged)"
);...
![Page 71: Programozási nyelvek I. (Az Ada) - Eötvös Loránd Universitykto.web.elte.hu/hu/oktatas/ada/eloadas/06.pdf · 2014-09-14 · 6. előadás Hatókör, láthatóság, élettartam](https://reader033.vdocuments.mx/reader033/viewer/2022041605/5e33a713181576740354601e/html5/thumbnails/71.jpg)
71
Kivétel sablon paramétereként (1)
with Ada.Exceptions; use Ada.Exceptions;
generic
type Elem is limited private;
type Index is (<>);
type Tömb is array (Index range <>) of Elem;
with function "<" ( A, B: Elem ) return Boolean is <>;
Üres_Tömb: Exception_Id := Constraint_Error ' Identity;
function Max ( T: Tömb ) return Elem;
![Page 72: Programozási nyelvek I. (Az Ada) - Eötvös Loránd Universitykto.web.elte.hu/hu/oktatas/ada/eloadas/06.pdf · 2014-09-14 · 6. előadás Hatókör, láthatóság, élettartam](https://reader033.vdocuments.mx/reader033/viewer/2022041605/5e33a713181576740354601e/html5/thumbnails/72.jpg)
72
Kivétel sablon paramétereként (2)
function Max ( T: Tömb ) return Elem isbegin
if T ' Length = 0 thenRaise_Exception( Üres_Tömb, "Üres a tömb" );
else declareMh: Index := T ' First;
begin...
end; end if;
end Max;
opcionális, itt most nem szerencsés
![Page 73: Programozási nyelvek I. (Az Ada) - Eötvös Loránd Universitykto.web.elte.hu/hu/oktatas/ada/eloadas/06.pdf · 2014-09-14 · 6. előadás Hatókör, láthatóság, élettartam](https://reader033.vdocuments.mx/reader033/viewer/2022041605/5e33a713181576740354601e/html5/thumbnails/73.jpg)
73
Kivétel sablon paramétereként (3)
with Max;procedure Max_Demo is
type T is array (Integer range <>) of Float;Baki: exception;function Float_Max is new Max(Float,Integer,T);function Float_Min is new Max( Float, Integer, T, ">",
Baki ' Identity );X: T(1..0); -- üres tömb
begin...
![Page 74: Programozási nyelvek I. (Az Ada) - Eötvös Loránd Universitykto.web.elte.hu/hu/oktatas/ada/eloadas/06.pdf · 2014-09-14 · 6. előadás Hatókör, láthatóság, élettartam](https://reader033.vdocuments.mx/reader033/viewer/2022041605/5e33a713181576740354601e/html5/thumbnails/74.jpg)
74
Kivételek elnyomása
with Ada.Text_IO; use Ada.Text_IO;procedure Szoroz is pragma Suppress(Range_Check); I: Integer range 1..10000 := 1;begin loop Put_Line(Integer'Image(I)); I := I * 10; end loop;end;