3. Gültigkeit von Definitionen GPS-3-1 Themen dieses Kpitels: Definition und Bindung von Bezeichnern Verdeckungsregeln für die Gültigkeit von Definitionen Gültigkeitsregeln in Progrmmiersprchen 2005 bei Prof. Dr. Uwe Kstens
Definition und Bindung GPS-3-2 Eine Definition ist ein Progrmmkonstrukt, ds die Beschreibung eines Progrmmgegenstndes n einen Bezeichner bindet. Progrmmkonstrukt: zusmmengehöriger Teil (Teilbum) eines Progrmms z. B. eine Deklrtion int i;, eine Anweisung i = 42; Ausdruck i+1 Progrmmgegenstnd: wird im Progrmm beschrieben und benutzt z. B. die Methode min, der Typ String, eine Vrible i, ein Prmeter rgs Meist legt die Definition Eigenschften des Progrmmgegenstndes fest, z. B. den Typ: public sttic void min (String[] rgs) 2010 bei Prof. Dr. Uwe Kstens
Sttische und dynmische Bindung Ein Bezeichner, der in einer Definition gebunden wird, tritt dort definierend uf; n nderen Stellen tritt er ngewndt uf. Definierendes und ngewndtes Auftreten von Bezeichnern knn mn meist syntktisch unterscheiden, z. B. GPS-3-2 sttic int ggt (int, int b) { return ggt( % b, b); Regeln der Sprche entscheiden, in welcher Definition ein ngewndtes Auftreten eines Bezeichners gebunden ist. 2010 bei Prof. Dr. Uwe Kstens Sttische Bindung: Gültigkeitsregeln entscheiden die Bindung m Progrmmtext, z. B. { flot = 1.0; { int = 2; printf ("%d",); sttische Bindung im Rest dieses Kpitels und in den meisten Sprchen, ußer Dynmische Bindung: Wird bei der Ausführung des Progrmms entschieden: Für einen ngewndten Bezeichner gilt die zuletzt für usgeführte Definition. dynmische Bindung in Lisp und einigen Skriptsprchen
Gültigkeitsbereich GPS-3-3 Der Gültigkeitsbereich (scope) einer Definition D für einen Bezeichner b ist der Progrmmbschnitt, in dem ngewndte Auftreten von b n den in D definierten Progrmmgegenstnd gebunden sind. { def ; def b; { def ; def c; use ; use ; äußeres inneres äußeres Gültigkeitsbereiche 2005 bei Prof. Dr. Uwe Kstens In qulifizierten Nmen, können Bezeichner uch ußerhlb des Gültigkeitsbereiches ihrer Definition ngewndt werden: Thred.sleep(1000); mx = super.max_things; sleep ist in der Klsse Thred definiert, MAX_THINGS in einer Oberklsse.
Verdeckung von Definitionen In Sprchen mit geschchtelten Progrmmstrukturen knn eine Definition eine ndere für den gleichen Bezeichner verdecken (hiding). Es gibt 2 unterschiedliche Grundregeln dfür: Algol-Verdeckungsregel (in Algol-60, Algol-68, Pscl, Modul-2, Ad, Jv s. u.): Eine Definition gilt im kleinsten sie umfssenden Abschnitt überll, usgenommen drin enthltene Abschnitte mit einer Definition für denselben Bezeichner. oder opertionl formuliert: Suche vom ngewndten Auftreten eines Bezeichners b usgehend nch ußen den kleinsten umfssenden Abschnitt mit einer Definition für b. GPS-3-4 C-Verdeckungsregel (in C, C++, Jv): Die Definition eines Bezeichners b gilt von der Definitionsstelle bis zum Ende des kleinsten sie umfssenden Abschnitts, usgenommen die Gültigkeitsbereiche von Definitionen für b in drin enthltenen Abschnitten. 2010 bei Prof. Dr. Uwe Kstens Die C-Regel erzwingt definierendes vor ngewndtem Auftreten. Die Algol-Regel ist einfcher, tolernter und vermeidet Sonderregeln für notwendige Vorwärtsreferenzen.
Beispiele für Gültigkeitsbereiche GPS-3-5 Algol-Regel 1 2 3 Symbole: Abschnitt Definition Anwendung p Algol-Regel C-Regel p 1 p 2 p 1 p 2 2014 bei Prof. Dr. Uwe Kstens p p p hier gilt noch ds äußere p!
Getrennte Nmensräume GPS-3-6 In mnchen Sprchen werden die Bezeichner für Progrmmgegenstände bestimmter Art jeweils einem Nmensrum zugeordnet z. B. in Jv jeweils ein Nmensrum für Pckges, Typen (Klssen und Interfces), Vrible (lokle Vrible, Prmeter, Objekt- und Klssenvrible), Methoden, Anweisungsmrken Gültigkeits- und Verdeckungsregeln werden nur innerhb eines Nmensrumes ngewndt - nicht zwischen verschiedenen Nmensräumen. Zu welchem Nmensrum ein Bezeichner gehört, knn m syntktischen Kontext erknnt werden. (In Jv mit einigen zusätzlichen Regeln) 2005 bei Prof. Dr. Uwe Kstens Eine Klssendeklrtion nur für Zwecke der Demonstrtion: clss Multi { Multi () { Multi = 5; privte int Multi; Multi Multi (Multi Multi) { if (Multi == null) return new Multi(); else return Multi (new Multi ()); Typ Vrible Methode
Gültigkeitsbereiche in Jv GPS-3-6 Pckge-Nmen: sichtbre Übersetzungseinheiten Typnmen: in der gnzen Übersetzungseinheit, Algol-60-Verdeckungsregel Methodennmen: umgebende Klsse, Algol-60-Verdeckungsregel, ber Objektmethoden der Oberklssen werden überschrieben oder überlden - nicht verdeckt Nmen von Objekt- und Klssenvriblen: umgebende Klsse, Algol-60-Verdeckungsregel, Objekt- und Klssenvrible können Vrible der Oberklssen verdecken Prmeter: Methodenrumpf, (dürfen nur durch innere Klssen verdeckt werden) 2005 bei Prof. Dr. Uwe Kstens Lokle Vrible: Rest des Blockes (bzw. bei Lufvrible in for-schleife: Rest der for-schleife), C-Verdeckungsregel (dürfen nur durch innere Klssen verdeckt werden) Terminologie in Jv: shdowing für verdecken bei Schchtelung, hiding für verdecken beim Erben
Beispiele für Gültigkeitsbereiche in Jv GPS-3.6 2005 bei Prof. Dr. Uwe Kstens clss A { void m (int p) { cnt += 1; flot f; B mm () { return new B(); int cnt = 42; clss B { A B m mm cnt p f clss Ober { int k; clss Unter extends Ober { int k; void m () { k = 5; void g (int p) { int k = 7; k = 42; for ( int i = 0; i<10; i++) { int k; // verboten
GPS-3.6b Innere Klssen in Jv: Verdeckung von loklen Vriblen clss A { chr x; chr int flot x x x void m () { int x; 2011 bei Prof. Dr. Uwe Kstens clss B { void h () { flot x; Innere Klsse B: Lokle Vrible flot x in h verdeckt lokle Vrible int x in m der äußeren Klsse
Gültigkeitsregeln in nderen Progrmmiersprchen C, C++: grundsätzlich gilt die C-Regel; für Sprungmrken gilt die Algol-Regel. Pscl, Ad, Modul-2: grundsätzlich gilt die Algol-Regel. Aber eine Zustzregel fordert: void f () { goto finish; finish: printf (); GPS-3-6b Ein ngewndtes Auftreten eines Bezeichners drf nicht vor seiner Definition stehen. Dvon gibt es dnn in den Sprchen unterschiedliche Ausnhmen, um wechselweise rekursive Definitionen von Funktionen und Typen zu ermöglichen. 2012 bei Prof. Dr. Uwe Kstens Pscl: type ListPtr = ^ List; List = record i: integer; n: ListPtr end; C: typedef struct _el *ListPtr; typedef struct _el { int i; ListPtr n; Elem; Pscl: procedure f (:rel) forwrd; procedure g (b:rel) begin f(3.5); end; procedure f (:rel) begin g(7.5); end;
Zusmmenfssung zum Kpitel 3 GPS-3-7 Mit den Vorlesungen und Übungen zu Kpitel 3 sollen Sie nun Folgendes können: Bindung von Bezeichnern verstehen Verdeckungsregeln für die Gültigkeit von Definitionen nwenden Grundbegriffe in den Gültigkeitsregeln von Progrmmiersprchen erkennen 2005 bei Prof. Dr. Uwe Kstens