Scope Rules

42
Scope Rules Prepared by Manuel E. Bermúdez, Ph.D. Associate Professor University of Florida Programming Language Principles Lecture 16

description

Scope Rules. Programming Language Principles Lecture 16. Prepared by Manuel E. Bermúdez, Ph.D. Associate Professor University of Florida. Definition. Scope: the region of program text in which a binding holds. Static binding is prevalent in most modern PLs. New scope in each function. - PowerPoint PPT Presentation

Transcript of Scope Rules

Page 1: Scope Rules

Scope Rules

Prepared by

Manuel E. Bermúdez, Ph.D.Associate ProfessorUniversity of Florida

Programming Language PrinciplesLecture 16

Page 2: Scope Rules

Definition

• Scope: the region of program text in which a binding holds.

• Static binding is prevalent in most modern PLs.• New scope in each function.

• Activate bindings for parameters and locals.

• Deactivate bindings of globals obscured by locals.

• Deactivate bindings upon function return.

Page 3: Scope Rules

RPAL Is Statically Scoped

(CSE Rule 4):

CONTROL STACK__________________________________________________ ec ... <λ,x,i,k> R ... ec

ec ... en δk en ...ec

__________________________________________________

where en = [R/x] ei. <--- defines lexical scoping !

Page 4: Scope Rules

RPAL Is Statically Scoped (cont’d)

• ei is the environment in effect when the lambda closure was created.

• Change ei to ec (the current environment at the point of function application), and RPAL becomes dynamically scoped.

Page 5: Scope Rules

Example

let Sqr x = x * x

in

let f a b = Sqr a + b

in

Print(f 4 3 + (let Sqr x = x+x in f 4 3)) )

• In RPAL, this program prints 19 + 19 = 38.

• If RPAL used dynamic scoping, the result would be 19 + 11 = 30.

Page 6: Scope Rules

Suggested Exercise

• Run the CSE by hand, and see the environments.

• Changing RPAL from lexical to dynamic scoping involves changing ONE letter ! (The power of formal semantic specification ...)

• Some dynamically scoped languages: SNOBOL, APL, perl (?) early LISP (later changed by J. McCarthy).

Page 7: Scope Rules

Terminology

• Referencing environment: the set of active bindings at a given point in a program's execution.

• Deep binding: the reference environment of a fcn/proc is determined when the function is created.

• Shallow binding: the reference environment of a fcn/proc is determined when the function is called.

Page 8: Scope Rules

Structure of Referencing Environments

• Normally, a stack suffices (C, C++, Java).

• If a procedure (not merely a pointer) can be passed as a parameter, the referencing environments are organized as a tree.

Page 9: Scope Rules

Example: Passing Procedures as Parameters in Pascal:

program test(output); procedure dummy; begin end;

procedure Q(procedure S; n:integer); procedure R; begin writeln(n) end;

begin { Q } if n=1 then Q(R,0) else S; end;

begin {main} Q(dummy,1) end.

The output of this program is ???

Page 10: Scope Rules
Page 11: Scope Rules
Page 12: Scope Rules

Types of Static Scope

• Flat: (BASIC, Cobol)• All name sin the same scope, all

visible everywhere.

• Local/global (Fortan, C, Prolog)• Only two referencing environments:

current and global.

Page 13: Scope Rules

Types of Static Scope (cont’d)

• Nested procedures (Algol, Pascal, Ada, Modula, RPAL).• Each procedure has its own scope,

visible to itself and all procedures nested within it.

Page 14: Scope Rules

Types of Static Scope (cont’d)

• Modular scope (Modula, Ada, C++, Java). Scopes defined by modules, which explicitly export names to:

• The global scope (public)• The scopes of subclasses (protected)• Nowhere (private)

Page 15: Scope Rules

Nested Scoping Example (in pseudo-Pascal): proc A; var a; proc B; var b: proc C; var c; begin c:=b-1; if b=1 then B else a:=a-c; end;{ C } begin b:=a-4; if b<2 then C; else a:=0; end;{ B } begin a:=5; B; end;{ A }

A can only see a. B can see a and b

but not c.C can see a, b, and

c.C can see many

versions of b and a, depending on the calling sequence.

Page 16: Scope Rules

Access to non-locals

• Needed to handle nested scoping.

• Two methods: • Static links• Displays.

• Will cover displays (and contrast them) later.

Page 17: Scope Rules

Static Link

• Pointer to the most recent instance of the next statically enclosing procedure (see diagram).

• Each instance of B points to the most recent version of A

• Each instance of C points to the most recent version of B

Page 18: Scope Rules
Page 19: Scope Rules

Static Link (cont’d)

• Compiler keeps track of nesting levels:• variable a is at level 1,• variable b is at level 2,• variable c is at level 3.

• To access a variable, subtract the variable's nesting depth from the current depth, and follow that many static links.

Page 20: Scope Rules

Examples

• For B to access a, depth[B]-depth[a] = 2-1= 1; follow 1 static link.

• For C to access b, depth[C]-depth[b] = 3-2= 1; follow 1 static link.

• For C to access a, depth[C]-depth[a] = 3-1= 2; follow 2 static links.

Page 21: Scope Rules

Block Scoping

• In the C language, execution blocks, delimited with {}, define scopes.

{ int t; t = a; a = b; { float t=3.14; printf("%f",t); } b = t;}

Page 22: Scope Rules

Block Scoping (cont’d)

• The variable's scope is limited to the {} block that contains its declaration.

• Handled like ordinary local variables: • Space allocated in subroutine

prologue (frame setup)• Deallocated in subroutine epilogue

(frame destruction).• Compiler's symbol table keeps track

of declarations.

Page 23: Scope Rules

Modular Scoping

• First languages to incorporate information hiding.

• Reduces "cognitive load" on programmers.

• CIA principle: if a code segment doesn't need to know about an object, it shouldn't.

• Tends to narrow (simplify) interfaces.• Aids in abstraction.

Page 24: Scope Rules

Modular Scoping (cont’d)

• Modules allow encapsulation of objects.

• Objects inside the module are visible to each other.

• Objects inside are only visible outside if explicitly exported.

• Objects outside not visible inside unless imported.

Page 25: Scope Rules

Modular Scoping (cont’d)

• Various terms for modules:

• Clu: clusters• Modula, Ada, Java: packages• C++: namespaces

Page 26: Scope Rules

Example (Pseudo Modula)module Zorch;

export A,b;

var b:integer;

var c:real:

proc A();

...

end

end Zorch;

module Zip;

import A;

export D;

var t:real;

proc D();

...

end;

end Zip;

module Zap;

import b,D;

export Q;

proc Q();

...

end;

proc R();

...

end;

end Zap;• Procedure A can see b and c.• Procedure D can see A and t, but not b or c.• Procedures Q and R can see b and D, but not

A, c, or t.

Page 27: Scope Rules

Module Types and Classes

• In Modula-2, Turing, and Ada83, a module can define only one instance of the object (module as manager).

• In Simula, Euclid, and ML, programmer can declare an arbitrary number of module objects (module as type).

Page 28: Scope Rules

Module Types and Classes (cont’d)

• Historically, this led to classes (Smalltalk, Eiffel, C++, Java), and object-orientation.

• Classes define types (abstraction).• Classes encapsulate object data and

methods (encapsulation).• Classes hide information (information

hiding).• Classes facilitate polymorphism and

inheritance (polymorphism).

Page 29: Scope Rules

Symbol Tables

• Compiler must keep track of declared names (type, variables, constants, etc.)

• Table stores mapping of names to attributes.• Must enforce scope rules. Typical operations:

• Enter a new name, with relevant information (type, components, etc.)

• Lookup a name. Must return correct instance, in accordance with scope rules.

Page 30: Scope Rules

Symbol Tables (cont’d)

• Open_scope. New scope must allow visibility of names in outer scopes, and redeclaration of names in new scope.

• Close_scope. Probably non-destructively, without reclaiming space (need debugging info). Restore mapping of previous scope.

Page 31: Scope Rules

Symbol Tables (cont’d)

• Must allow forward declarations (name used before it is declared)

• Hash coded table, each entry a linked list of hash synonyms.

Page 32: Scope Rules

Example

• LeBlanc-Cook symbol table (see text book)

• Intrinsics added first (integer, real).• Situation depicts environment in with

statement.• A2, F2 and T are synonyms.

Page 33: Scope Rules

Example (cont’d)

• Other mechanisms: Central Reference Tables.• Used to keep track of run-time

environments.• Equivalent to RPAL's environment

trees.

Page 34: Scope Rules

Binding of Reference Environments

• Needed when passing a function/proc as a parameter.

• Need subroutine closures: 4 items.

1. The fact that it is a function.2. Functionality (prototype, parameters, etc.)3. Pointer to body of fcn/proc.4. Referencing environment (environment link in

RPAL).

Page 35: Scope Rules

Binding of Reference Environments (cont’d)

• In C, functions are second-class.• Can only pass function pointer

(item 3) as a parameter.

• Fcns/procs are first class in Lisp, ML, Haskell, RPAL, but not in Modula, Ada, C, C++, or Java. Some would argue they are, but ...

Page 36: Scope Rules

Overloading

• Multiple meanings for the same name, context dependent.

• Most languages allow it in some limited fashion, e.g. arithmetic operators (a+b for ints and reals).

• In C++, one can overload both functions and operators. Can only overload fcns in Java (may change, more later).

Page 37: Scope Rules

Pitfalls in Language Design

• In Pascal, functions return values by assigning to the function name (no return statement). If the function name is redeclared, it becomes impossible to return a value.

• Example: function f: integer; var f:integer; begin f := 10; // won't return 10 end;

Page 38: Scope Rules

Pitfalls in Language Design (cont’d)

• Using an outer scope name, and then declaring it (maybe much later), is illegal in Pascal. Very expensive to check.

const m = 0; procedure f; const n = m; { illegal use of m, }

{ m not yet declared.} ... m = 0; { scope of m is all } { of f } end;

Page 39: Scope Rules

Pitfalls in Language Design (cont’d)

• The same applies to functions:

procedure f;

...

end;

procedure A; procedure B; begin f; {intent is to call } {outer f. } end; {error: f used before} {it's declared } ... procedure f; ... end;

end;

Page 40: Scope Rules

Pitfalls in Language Design (cont’d)• Some Pascal compilers (and most Pascal

successors) specify that the scope of a declaration is limited to the remainder of (not the entire) block.

• Confusingly, Pascal allows use of pointer types before they are declared:

type aptr = ^a; a = record data: ...; next: aptr; end;

Page 41: Scope Rules

Pitfalls in Language Design (cont’d)

• Modula-3 changed this: scope of name is still the entire block, but names need not be declared before they are used.

• C, C++, Java have a mixed strategy:

variables must be declared before they are used, but not type (class) names. Class names are visible over the entire containing module (package).

• Separate compilation (read in book).

Page 42: Scope Rules

Scope Rules

Prepared by

Manuel E. Bermúdez, Ph.D.Associate ProfessorUniversity of Florida

Programming Language PrinciplesLecture 16