lec12
CS 314 Principles of Programming Languages
Prof. Zheng Zhang
Rutgers University
Lecture 12: Names, Scopes and Bindings
October 12, 2018
Review: Names, Scopes and Binding
2
• Denotes a programming language construct
• Has associated “attributes”
Examples: type, memory location, read/write permission, storage
class, access restrictions.
• Has a meaning
Examples: represents a semantic object, a type description, an
integer value, a function value, a memory address.
What’s in a name? — Each name “means” something!
3
• Compile time: during compilation process – static
(e.g.: macro expansion, type definition)
• Link time: separately compiled modules/files are joined together by
the linker (e.g: adding the standard library routines for I/O (stdio.h),
external variables)
• Run time: when program executes – dynamic
Review: Names, Bindings and Memory
Compiler needs bindings to know meaning of names during translation
(and execution).
Bindings – Association of a name with the thing it “names”
(e.g., a name and a memory location, a function name and its
“meaning”, a name and a value)
Review: How to Maintain Bindings
4
• Symbol table: maintained by compiler during compilation
• Referencing Environment: maintained by compiler-generated-code
during program execution
• How long do bindings last for a name hold in a program?
• What initiates a binding?
• What ends a binding?
Question:
Scope of a binding:
The part of program the in which the binding is active.
Review: Lexical Scope v.s. Dynamic Scope
5
• Non-local variables are associated with declarations at compile time
• Find the smallest block syntactically enclosing the reference and
containing a declaration of the variable
Lexical Scope
• Non-local variables are associated with declarations at run time
• Find the most recent, currently active run-time stack frame
containing a declaration of the variable
Dynamic Scope
Lexical Scope
6
A name that is introduced in a declaration is known in the scope in
which it is declared, and in each internally nested scope, unless it is
hidden by another declaration of the same name in one or more
nested scopes.
Closest scope rule
Scope Example
7
procedure P1(A1)
var X — local to P1
…
procedure P2(A2)
…
procedure P3(A3)
…
begin
… — body of P3
end
…
begin
… — body of P2
end
procedure P4(A4)
…
function F1(A5)
var X — local to F1
…
begin
… — body of F1
end
…
begin
… — body of P4
end
…
begin
… — body of P1
end
A1 X P2
A2 P3
A3
P4
A4 F1
A5 X
Scope Example
8
procedure P1(A1)
var X — local to P1
…
procedure P2(A2)
…
procedure P3(A3)
…
begin
… — body of P3
end
…
begin
… — body of P2
end
procedure P4(A4)
…
function F1(A5)
var X — local to F1
…
begin
… — body of F1
end
…
begin
… — body of P4
end
…
begin
… — body of P1
end
A1 X P2
A2 P3
A3
P4
A4 F1
A5 X
Scope Example
9
procedure P1(A1)
var X — local to P1
…
procedure P2(A2)
…
procedure P3(A3)
…
begin
… — body of P3
end
…
begin
… — body of P2
end
procedure P4(A4)
…
function F1(A5)
var X — local to F1
…
begin
… — body of F1
end
…
begin
… — body of P4
end
…
begin
… — body of P1
end
A1 X P2
A2 P3
A3
P4
A4 F1
A5 X
Scope Example
10
procedure P1(A1)
var X — local to P1
…
procedure P2(A2)
…
procedure P3(A3)
…
begin
… — body of P3
end
…
begin
… — body of P2
end
procedure P4(A4)
…
function F1(A5)
var X — local to F1
…
begin
… — body of F1
end
…
begin
… — body of P4
end
…
begin
… — body of P1
end
A1 X P2
A2 P3
A3
P4
A4 F1
A5 X
Scope Example
11
procedure P1(A1)
var X — local to P1
…
procedure P2(A2)
…
procedure P3(A3)
…
begin
… — body of P3
end
…
begin
… — body of P2
end
procedure P4(A4)
…
function F1(A5)
var X — local to F1
…
begin
… — body of F1
end
…
begin
… — body of P4
end
…
begin
… — body of P1
end
A1 X P2
A2 P3
A3
P4
A4 F1
A5 X
Scope Example
12
procedure P1(A1)
var X — local to P1
…
procedure P2(A2)
…
procedure P3(A3)
…
begin
… — body of P3
end
…
begin
… — body of P2
end
procedure P4(A4)
…
function F1(A5)
var X — local to F1
…
begin
… — body of F1
end
…
begin
… — body of P4
end
…
begin
… — body of P1
end
A1 X P2
A2 P3
A3
P4
A4 F1
A5 X
local to P1
local to F1
X local to F1
is hidden by
X local to F1
also called a
“hole”
Dynamic Scope
13
The “current” binding for a given name is the one encountered most
recently during execution, and not yet destroyed by returning from
its scope.
Depending on the Flow of Execution at Run Time
program L;
var n: char; {n declared in L}
procedure W;
begin
write (n); {n referenced in W}
end;
procedure D;
var n: char; {n declared in D}
begin
n := ‘D’; {n referenced in D}
W
end;
begin
n := ‘L’; {n referenced in L}
W;
D
end
Dynamic Scope
14
L ⇒ D ⇒ W
Calling Chain:
The output is ?
Caller
D
Which “n”?
program L;
var n: char; {n declared in L}
procedure W;
begin
write (n); {n referenced in W}
end;
procedure D;
var n: char; {n declared in D}
begin
n := ‘D’; {n referenced in D}
W
end;
begin
n := ‘L’; {n referenced in L}
D
end
Review: Program Memory Layout
15
• Static objects are given an absolute address
that is retained throughout the execution of
the program
• Stack objects are allocated and deallocated in
last-in, first-out order, usually in conjunction
with subroutine calls and returns
• Heap objects are allocated and deallocated at
any arbitrary time
stack
heap
static &
global
code
Procedure Activations
16
• Begins when control enters activation (call)
• Ends when control returns from call
Example:
Subroutine C
Subroutine B
Subroutine B
Subroutine A
procedure C:
D
procedure B:
if…then B else C
procedure A:
B
main program:
A
sp
Direction of
stack growth
(usually lower
addresses)
Calling chain: A ⇒ B ⇒ B ⇒ C ⇒ D
parameter
return value
return address
access link
caller FP
local variables
Subroutine D
Procedure Activations
17
• Run-time stack contains frames from main program & active procedure
• Each stack frame includes:
1. Pointer to stack frame of caller
(control link for stack maintenance and dynamic scoping)
2. Return address (within calling procedure)
3. Mechanism to find non-local variables (access link for lexical scoping)
4. Storage for parameters, local variables and final values
5. Other temporaries including intermediate values & saved register
parameter
return value
return address
access link
caller FP
local variables
Stack Frame
or
Activation Record Frame Pointer (FP)
or Activation Record
Pointer (ARP)
Usually stored in a register
Implementation of Lexical Scope and Dynamic Scope
18
• Non-local variables are associated with declarations at compile time
• Find the smallest block syntactically enclosing the reference and
containing a declaration of the variable
• Access link points to the most recently activated immediate lexical
ancestor
Lexical Scope
• Non-local variables are associated with declarations at run time
• Find the most recent, currently active run-time stack frame
containing a declaration of the variable
• Control link points to the caller
Dynamic Scope
Program
x, y: integer // declarations of x and y
Procedure B // declaration of B
y, z: real // declaration of y and z
begin
…
y = x + z // occurrences of y, x, and z
if (…) call B // occurrence of B
end
Procedure C // declaration of C
x: real
begin
…
call B // occurrence of B
end
begin
…
call C // occurrence of C
call B // occurrence of B
end
19
Calling chain: MAIN⇒ C ⇒ B ⇒ B Control linksAccess links
fp
main
o
o
x
y
C
o
o
x
B
o
o
y
z
B
o
o
y
z
Implementation of Lexical Scope and Dynamic Scope
Context of Procedures
20
Two contexts
• static placement in source code (same for each invocation)
• dynamic run-time stack context (different for each invocation)
Scope Rules:
Each variable reference must be associated with a single declaration.
Context of Procedures
21
Two choices:
1. Use static and dynamic context: lexical scope
2. Use dynamic context: dynamic scope
• Easier for variables declared locally: same for lexical and
dynamic scoping
• Harder for variables not declared locally: not same for lexical
and dynamic scoping
Access to Non-Local Data(Lexical Scoping)
22
1. Compile-time: How do we map a name into a (level, offset) pair?
We use a block structured symbol table (compile time)
– When we look up a name, we want to get the most recent declaration
for the name
– The declaration may be found in the current procedure or in any
ancestor procedure
2. Run-time: Given a (level, offset) pair, what’s the address?
– Two classical approaches:
⇒ access link (static link)
⇒ display
Two important steps
Compile-Time
23
Symbol table generated at compile time matches declarations and occurrences.
⇒ Each name can be represented as a pair (nesting_level, local_index).
Program
(1,1), (1,2): integer // declarations of x and y
Procedure (1,3) // declaration of B
(2,1), (2,2): real // declaration of y and z
begin
…
(2,1) = (1,1) + (2,2) // occurrences of y, x, and z
if (…) call (1,3) // occurrence of B
end
Procedure (1,4) // declaration of C
(2,1): real
begin
…
call (1,3) // occurrence of B
end
begin
…
call (1,4) // occurrence of C
call (1,3) // occurrence of B
end
Program
x, y: integer // declarations of x and y
Procedure B // declaration of B
y, z: real // declaration of y and z
begin
…
y = x + z // occurrences of y, x, and z
if (…) call B // occurrence of B
end
Procedure C // declaration of C
x: real
begin
…
call B // occurrence of B
end
begin
…
call C // occurrence of C
call B // occurrence of B
end
Runtime Access to Non-Local Data (Lexical Scoping)
24
• Assume current procedure level is k
• If k = l, it is a local variable
• If k > l, must find l’s activation record (stack frame)
⇒ follow k − l access link
• k < l cannot occur Runtime: To find the value specified by (l, o) Assume nested procedure has higher index than its parent procedure. Using access link: Access to Non-Local Data(Lexical Scoping): Access Link 25 • Each AR has a pointer to most recent AR of immediate lexical ancestor • Lexical ancestor does not need to be the caller Using access links (static links) parameter register save area return value return address access link caller’s ARP local variables ARP parameter register save area return value return address access link caller’s ARP local variables parameter register save area return value return address access link caller’s ARP local variables Cost of access link is proportional to lexical distance Activation Record Pointer level: p level: p - 2level: p - 1 Maintaining Access Links 26 • Calling level k + 1 procedure 1. Pass the caller’s FP as access link 2. The caller’s backward chain will work for lower levels • Calling procedure at level i ≤ k 1. Find the caller’s link to level i - 1 and pass it to callee 2. Its access link will work for lower levels If the callee procedure p is nested immediately within the caller procedure q, the access link for p points to the activation record of the most recent activation of q. Setting up access link (the caller does the job): Assuming current level is k: An Improvement: The Display 27 • table of access links for lower levels • lookup is index from known offset • takes slight amount of time at call • a single display or one per frame To improve run-time access costs, use a display. Access with the display assume a value described by (l,o) • find slot as DP[l] in display pointer array • add offset to pointer from slot “Setting up the activation frame” now includes display manipulation. Access to Non - Local Data(Lexical Scoping): Display 28 • Global arrays of pointers to nameable array • Needed ARP is an array access away Using a display ARP parameter register save area return value return address saved ptr caller’s ARP local variables level 0 level 1 level 2 level 3 Display parameter register save area return value return address saved ptr caller’s ARP local variables parameter register save area return value return address saved ptr caller’s ARP local variables Example: reference to
looks up p’s APR in display and add 16
Cost of access link is constant (APR + offset)
Display Management
29
Single global display:
On entry to a procedure at level i:
Save the level i display value
push FP into level i display slot
On return:
Restore the level i display value
parameter
register
save area
return value
return address
saved ptr
caller’s ARP
local variables
Procedures
30
• Modularize program structure
– Actual parameter: information passed from caller to callee (Argument)
– Formal parameter: local variable whose value (usually) is received from
caller
• Procedure declaration
– Procedure names, formal parameters, procedure body with formal local
declarations and statement lists, optional result type
Example: void translate(point *p, int dx)
Parameters
31
• Positional association: Arguments associated with formals one-by-one;
Example: C, Pascal, Java, Scheme
• Keyword association: formal/actual pairs; mix of positional and
keyword possible;
Example: Ada
procedure plot(x, y: in real; z: in boolean)
… plot (0.0, 0.0, z ⇒ true)
… plot (z ⇒ true, x ⇒ 0.0, y ⇒ 0.0)
Parameter Association
Parameter Passing Modes
• Pass-by-value: C/C++, Pascal, Java/C# (value types), Scheme
• Pass-by-result: Ada, Algol W
• Pass-by-value-result: Ada, Swift
• Pass-by-reference: Fortran, Pascal, C++, Ruby, ML
Pass-by-value
32
Advantage: Argument protected from changes in callee.
Disadvantage: Copying of values takes execution time and
space, especially for aggregate values (e.g.: structs, arrays)
begin
c: array[1…10] of integer;
m, n: integer;
procedure r(k, j: integer)
begin
k := k + 1;
j := j + 2;
end r;
…
m := 5;
n := 3;
r(m, n);
write m,n;
end
Output:
5 3
Pass-by-reference
33
begin
c: array[1…10] of integer;
m, n: integer;
procedure r(k,j: integer)
begin
k := k + 1;
j := j + 2;
end r;
…
m := 5;
n := 3;
r(m, n);
write m, n;
end
Output: Advantage: more efficient than copying
Disadvantage: leads to aliasing, there are two or more
names for the storage location; hard to track side effects
6 5
Pass-by-result
34
begin
c: array[1…10] of integer;
m, n: integer;
procedure r(k, j: integer)
begin
k := k + 1;
j := j + 2;
end r;
…
m := 5;
n := 3;
r(m, n);
write m, n;
end
Output:
Program doesn’t compile or has runtime error
ERROR:
CANNOT USE PARAMETERS WHICH ARE UNINITIALIZED
Pass-by-result
35
begin
c: array[1…10] of integer;
m, n: integer;
procedure r(k, j: integer)
begin
k := 1;
j := 2;
end r;
…
m := 5;
n := 3;
r(m, n);
write m, n;
end
Output: ?
HERE IS A PROGRAM THAT WORKS
Pass-by-result
36
begin
c: array[1…10] of integer;
m, n: integer;
procedure r(k, j: integer)
begin
k := 1;
j := 2;
end r;
…
m := 5;
n := 3;
r(m, n);
write m, n;
end
Output: 1 2
HERE IS A PROGRAM THAT WORKS
Pass-by-result
37
begin
c: array[1…10] of integer;
m, n: integer;
procedure r(k, j: integer)
begin
k := 1;
j := 2;
end r;
…
m := 5;
n := 3;
r(m, m);
write m, n;
end
Output: 1 or 2 for m?
Problem: order of copy back makes a difference;
implementation dependent.
NOTE: CHANGE THE CALL
Pass-by-value-result
38
begin
c: array[1…10] of integer;
m, n: integer;
procedure r(k, j: integer)
begin
k := k + 1;
j := j + 2;
end r;
…
m := 5;
n := 3;
r(m, n);
write m, n;
end
Output: 6 5
Problem: order of copy back makes a difference;
implementation dependent.
39
begin
c: array[1…10] of integer;
m, n: integer;
procedure r(k, j: integer)
begin
k := k + 1;
j := j + 2;
end r;
…
/* set c[m] = m */
m := 2;
r(m,c[m]);
write c[1], c[2], c[3], … c[10];
end
Pass-by-value-result
Output:
1 4 3 4 5 … 10 on entry
1 2 4 4 5 … 10 on exit
Problem: When is the address computed for the copy-back operation?
At procedure call (procedure entry), just before procedure exit, or
somewhere in between? (Example: ADA on entry)
WHAT ELEMENT OF “c” IS ASSIGNED TO?
40
begin
c: array[1…10] of integer;
m, n: integer;
procedure r(k, j: integer)
begin
k := k + 1;
j := j + 2;
end r;
…
/* set c[m] = m */
m := 2;
r(m,c[m]);
write c[1], c[2], c[3], … c[10];
end
Pass-by-value-result
Output:
1 4 3 4 5 … 10 on entry
1 2 4 4 5 … 10 on exit
Problem: When is the address computed for the copy-back operation?
At procedure call (procedure entry), just before procedure exit, or
somewhere in between? (Example: ADA on entry)
WHAT ELEMENT OF “c” IS ASSIGNED TO?
41
begin
c: array[1…10] of integer;
m, n: integer;
procedure r(k, j: integer)
begin
k := k + 1;
j := j + 2;
end r;
…
/* set c[m] = m */
m := 2;
r(m,c[m]);
write c[1], c[2], c[3], … c[10];
end
Pass-by-value-result
Output:
1 4 3 4 5 … 10 on entry
1 2 4 4 5 … 10 on exit
Problem: When is the address computed for the copy-back operation?
At procedure call (procedure entry), just before procedure exit, or
somewhere in between? (Example: ADA on entry)
WHAT ELEMENT OF “c” IS ASSIGNED TO?
42
begin
c: array[1…10] of integer;
m, n: integer;
procedure r(k, j: integer)
begin
k := k + 1;
j := j + 2;
end r;
…
/* set c[m] = m */
m := 2;
r(m,c[m]);
write c[1], c[2], c[3], … c[10];
end
Pass-by-value-result
Output:
1 4 3 4 5 … 10 on entry
1 2 4 4 5 … 10 on exit
Problem: When is the address computed for the copy-back operation?
At procedure call (procedure entry), just before procedure exit, or
somewhere in between? (Example: ADA on entry)
WHAT ELEMENT OF “c” IS ASSIGNED TO?
Aliasing
43
Aliasing:
begin
j, k, m: integer;
procedure r(a, b: integer)
begin
b := 3;
m := m * a;
end
…
q(m, k);
q(j, j);
write y;
end
More than two ways to name the same object within a scope
Even without pointers, you can have aliasing through
(global formal) and (formal formal) parameter passing.
formal/formal ALIAS PAIR
global/formal
Comparison: by-value-result vs. by-reference
44
Actual parameters need to evaluate to L-values (addresses).
begin
y: integer;
procedure p(x: integer)
begin
x := x + 1
x := x + y
end
…
y := 2;
p(y);
write y;
end
Output:
• pass-by-reference: 6
• pass-by-value-result: 5
Note: by-value-result: Requires copying of parameter values (expansive for
aggregate values); does not have aliasing, but copy-back order dependence.
ref: x and y are ALIASED
val-res: x and y are NOT ALIASED
Next Lecture
45
• Read Scott, Chapter 9.1 – 9.3 (4th Edition) or Chapter 8.1 – 8.3
(3rd Edition), Chapter 11.1 – 11.3 (4th Edition)
Things to do:
Procedures
46
• Modularize program structure
– Actual parameter: information passed from caller to callee (Argument)
– Formal parameter: local variable whose value is received from caller
• Procedure declaration
– Procedure names, formal parameters, procedure body with formal local
declarations and statement lists, optional result type
Example: void translate(point *p, int dx)
Parameters
47
• Positional association: Arguments associated with formals one-by-one;
Example: C, Pascal, Java, Scheme
• Keyword association: formal/actual pairs; mix of positional and
keyword possible;
Example: Ada
procedure plot(x, y: in real; z: in boolean)
… plot (0.0, 0.0, z ⇒ true)
… plot (z ⇒ true, x ⇒ 0.0, y ⇒ 0.0)
Parameter Association
Parameter Passing Modes
• Pass-by-value: C/C++, Pascal, Java/C# (value types), Scheme
• Pass-by-result: Ada, Algol W
• Pass-by-value-result: Ada, Swift
• Pass-by-reference: Fortran, Pascal, C++, Ruby, ML
Pass-by-value
48
Advantage: Argument protected from changes in callee.
Disadvantage: Copying of values takes execution time and
space, especially for aggregate values (e.g.: structs, arrays)
begin
c: array[1…10] of integer;
m, n: integer;
procedure r(k, j: integer)
begin
k := k + 1;
j := j + 2;
end r;
…
m := 5;
n := 3;
r(m, n);
write m,n;
end
Output:
5 3
Pass-by-reference
49
begin
c: array[1…10] of integer;
m, n: integer;
procedure r(k,j: integer)
begin
k := k + 1;
j := j + 2;
end r;
…
m := 5;
n := 3;
r(m, n);
write m, n;
end
Output: Advantage: more efficient than copying
Disadvantage: leads to aliasing, there are two or more
names for the storage location; hard to track side effects
6 5
Pass-by-result
50
begin
c: array[1…10] of integer;
m, n: integer;
procedure r(k, j: integer)
begin
k := k + 1;
j := j + 2;
end r;
…
m := 5;
n := 3;
r(m, n);
write m, n;
end
Output:
Program doesn’t compile or has runtime error
ERROR:
CANNOT USE PARAMETERS WHICH ARE UNINITIALIZED
Pass-by-result
51
begin
c: array[1…10] of integer;
m, n: integer;
procedure r(k, j: integer)
begin
k := 1;
j := 2;
end r;
…
m := 5;
n := 3;
r(m, n);
write m, n;
end
Output: ?
HERE IS A PROGRAM THAT WORKS
Pass-by-result
52
begin
c: array[1…10] of integer;
m, n: integer;
procedure r(k, j: integer)
begin
k := 1;
j := 2;
end r;
…
m := 5;
n := 3;
r(m, m);
write m, n;
end
Output: 1 or 2 for m?
Problem: order of copy back makes a difference;
implementation dependent.
HERE IS ANOTHER PROGRAM THAT WORKS
NOTE: CHANGE THE CALL
Pass-by-value-result
53
begin
c: array[1…10] of integer;
m, n: integer;
procedure r(k, j: integer)
begin
k := k + 1;
j := j + 2;
end r;
…
m := 5;
n := 3;
r(m, n);
write m, n;
end
Output: 6 5
Problem: order of copy back makes a difference;
implementation dependent.
54
begin
c: array[1…10] of integer;
m, n: integer;
procedure r(k, j: integer)
begin
k := k + 1;
j := j + 2;
end r;
…
/* set c[m] = m */
m := 2;
r(m,c[m]);
write c[1], c[2], c[3], … c[10];
end
Pass-by-value-result
Output:
1 4 3 4 5 … 10 on entry
1 2 4 4 5 … 10 on exit
Problem: When is the address computed for the copy-back operation?
At procedure call (procedure entry), just before procedure exit, or
somewhere in between? (Example: ADA on entry)
WHAT ELEMENT OF “c” IS ASSIGNED TO?
55
begin
c: array[1…10] of integer;
m, n: integer;
procedure r(k, j: integer)
begin
k := k + 1;
j := j + 2;
end r;
…
/* set c[m] = m */
m := 2;
r(m,c[m]);
write c[1], c[2], c[3], … c[10];
end
Pass-by-value-result
Output:
1 4 3 4 5 … 10 on entry
1 2 4 4 5 … 10 on exit
Problem: When is the address computed for the copy-back operation?
At procedure call (procedure entry), just before procedure exit, or
somewhere in between? (Example: ADA on entry)
WHAT ELEMENT OF “c” IS ASSIGNED TO?
56
begin
c: array[1…10] of integer;
m, n: integer;
procedure r(k, j: integer)
begin
k := k + 1;
j := j + 2;
end r;
…
/* set c[m] = m */
m := 2;
r(m,c[m]);
write c[1], c[2], c[3], … c[10];
end
Pass-by-value-result
Output:
1 4 3 4 5 … 10 on entry
1 2 4 4 5 … 10 on exit
Problem: When is the address computed for the copy-back operation?
At procedure call (procedure entry), just before procedure exit, or
somewhere in between? (Example: ADA on entry)
WHAT ELEMENT OF “c” IS ASSIGNED TO?
57
begin
c: array[1…10] of integer;
m, n: integer;
procedure r(k, j: integer)
begin
k := k + 1;
j := j + 2;
end r;
…
/* set c[m] = m */
m := 2;
r(m,c[m]);
write c[1], c[2], c[3], … c[10];
end
Pass-by-value-result
Output:
1 4 3 4 5 … 10 on entry
1 2 4 4 5 … 10 on exit
Problem: When is the address computed for the copy-back operation?
At procedure call (procedure entry), just before procedure exit, or
somewhere in between? (Example: ADA on entry)
WHAT ELEMENT OF “c” IS ASSIGNED TO?
Aliasing
58
Aliasing:
begin
j, k, m: integer;
procedure r(a, b: integer)
begin
b := 3;
m := m * a;
end
…
q(m, k);
q(j, j);
write y;
end
More than two ways to name the same object within a scope
Even without pointers, you can have aliasing through
(global formal) and (formal formal) parameter passing.
formal/formal ALIAS PAIR
global/formal
Comparison: by-value-result vs. by-reference
59
Actual parameters need to evaluate to L-values (addresses).
begin
y: integer;
procedure p(x: integer)
begin
x := x + 1
x := x + y
end
…
y := 2;
p(y);
write y;
end
Output:
• pass-by-reference: 6
• pass-by-value-result: 5
Note: by-value-result: Requires copying of parameter values (expansive for
aggregate values); does not have aliasing, but copy-back order dependence.
ref: x and y are ALIASED
val-res: x and y are NOT ALIASED
Next Lecture
60
• Read Scott, Chapter 9.1 – 9.3 (4th Edition) or Chapter 8.1 – 8.3
(3rd Edition), Chapter 11.1 – 11.3 (4th Edition)
Things to do:
Look up Non-local Variable Reference
61
Access links and control links are used to look for non-local
variable references.
Static Scope:
Access link points to the stack frame of the most recently activated
lexically enclosing procedure
⇒ Non-local name binding is determined at compile time, and
implemented at run-time
Dynamic Scope:
Control link points to the stack frame of caller
⇒ Non-local name binding is determined and implemented at
run-time