150 likes | 317 Views
Identifiers. Identifiers name many things in programs, including…. Identifier Properties. Symbol Tables. Static properties are determined at compile time. The symbol table is the compiler’s dictionary. Examples (Java). int myInt = 3;.
E N D
Identifiers Identifiers name many things in programs, including… Identifier Properties
Symbol Tables Static properties are determined at compile time. Thesymbol tableis the compiler’s dictionary. Examples (Java) int myInt = 3; public double total(double a, double b, double c) …
Binding Bindingoccurs when a symbol (usually an identifier) is associated with a memory location a type (for a future lecture) a set of possible values a particular value a meaning (as for a subprogram) a set of possible meanings Such bindings can happen… ____________ binding means that a binding is fixed throughout execution. ____________ binding allows bindings to change in the midst of execution. malloc polymorphism
Lifetime Three kinds of data lifetime - allocated from beginning to end of program execution. implemented via fixed memory - allocated when a block is entered and deallocated at block exit. implemented via run-time stack The textbook calls this type of data stack dynamic - allocated under program control implemented via storage heap Block-structured languages define regions for automatic data. Lifetime and scope are related, but different, concepts.
Modula-2 Example MODULE Example1; VAR I : INTEGER; C : CARDINAL; GlobalBoo : BOOLEAN; PROCEDURE foo(B : BOOLEAN); VAR R : REAL; C : CHAR; Boo : BOOLEAN; BEGIN foo(Boo); END; (* foo *) BEGIN (* Example2 *) foo(GlobalBoo); END Example1.
Java Example public class myClass { public int myInt; public SomeClass myClassVar; public final int size = 100; public static myStaticInt; public void myFunction( int j ) { int w = 4; for (int m = 0; m<20; m++) { System.out.println( m*w + j ); } myClass = new SomeClass(); myClass = new SomeClass(); myStaticInt = 7; } }
Scope in Java… private - access restricted to containing class. public - unrestricted access. protected - access restricted to containing class and descendant classes. <instance variable with unspecified scope> - access restricted to package of classes <local variable> - access restricted to method/for statement block {…} in Eiffel… feature {NONE} - access restricted to containing object and subclasses. feature {ANY} - unrestricted access. feature {MyClass, YourClass} - access restricted to objects belonging to MyClass and YourClass type objects <local variable> - access restricted to block {…} Eiffel features are read only. Eiffel extends scope by objects. Java extends scope by classes. in Perl… dynamic scope
program Example1(input, output); var j, k : integer; globalBoo : boolean; procedure foo1(b : boolean); var r, k : real; boo : boolean; function foo2(z : real) : real; begin foo2 := z + r + k + j; end begin {foo1} foo1(boo); k := foo2(r); end {foo1} begin {Example1} foo1(globalBoo); end. Pascal Example
public class Outer { public int outPub; private int outPriv; private InnerPub inPubZ = new InnerPub(); private InnerPriv inPrivZ = new InnerPriv(); public class InnerPub { public int inPubPub; private int inPubPriv; public InnerPub() { } public void testAccess() { outPub = 1; outPriv = 1; inPrivZ.inPrivPub = 1; inPrivZ.inPrivPriv = 1; } } private class InnerPriv { public int inPrivPub; private int inPrivPriv; public InnerPriv() { } public void testAccess() { outPub = 1; outPriv = 1; inPubZinPubPub = 1; inPubZ.inPubPriv = 1; } } public Outer() { outPub = 1; outPriv = 1; inPubZ.inPubPub = 1; inPubZ.inPubPriv = 1; inPrivZ.inPrivPub = 1; inPrivZ.inPrivPriv = 1; inPubZ.testAccess(); inPrivZ.testAccess(); } } Java - inner classes
Java public class Driver { public Classy c1, c2; public NotSoClassy nc1, nc2; public void Driver() { c1 = new Classy(); c2 = new Classy(); c1.z = 1; c1.s = “c1”; c2.z = 2; c2.s = “c2”; System.out.println(c1.z + “…” + c1.s); System.out.println(c2.z + “…” + c2.s); nc1 = new NotSoClassy(); nc2 = new NotSoClassy(); nc1.z = 1; nc1.s = “c1”; nc2.z = 2; nc2.s = “c2”; System.out.println(nc1.z + “…” + nc1.s); System.out.println(nc2.z + “…” + nc2.s); } } public class Classy { public int z; public String s; public Classy() { … } } public class NotSoClassy { public static int z; public static String s; public static final String alpha = “abc”; public NotSoClassy() { … } }
Java public class OrderedPair { public int x; private int y; public OrderedPair(int a, int b) { x = a; y = b; } public boolean isBiggerThan(OrderedPair p) { returns (x > p.x && y > p.y); } } public class MyClass { public OrderedPair point1, point2; public MyClass() { point1 = new OrderedPair(1, 2); point2 = new OrderedPair(3, 2); if (point1.isBiggerThan(point2)) System.out.println(“Hi Mom”); point1.x = point.x * 2; point1.y = point.y* 2; // this instruction violates scope. } }
Eiffel - part 1 class OrderedPair creation create; feature {ANY} x : INTEGER; create(a, b : INTEGER) is do x := a; y := b; end; isBiggerThan( p : OrderedPair ) : BOOLEAN is do result := (x > p.x and y > p.y); // p.y is a scope violation end; feature {NONE} y : INTEGER; end -- class OrderedPair
Eiffel - part 2 class myClass feature {ANY} point1, point2 : OrderedPair; someMethod is do !!point1.create(1, 2); !!point2.create(3, 2); if point1.isBiggerThan(point2) then io.putstring(“Hi Mom.”); end; point1.x = point.x * 2; //write access is not permitted. point1.y = point.y* 2; // this violates both scope & write access end; end -- class myClass