cs 153: concepts of compiler design october 7 class meeting department of computer science san jose...
TRANSCRIPT
1
CS 153: Concepts of Compiler DesignOctober 7 Class Meeting
Department of Computer ScienceSan Jose State University
Fall 2015Instructor: Ron Mak
www.cs.sjsu.edu/~mak
Computer Science Dept.Fall 2015: October 7
CS 153: Concepts of Compiler Design© R. Mak
2
Runtime Activation Records
An activation record (AKA stack frame) maintains information about the currently executing routine
a procedure a function the main program itself
Computer Science Dept.Fall 2015: October 7
CS 153: Concepts of Compiler Design© R. Mak
3
Runtime Activation Records
In particular, an activation record contains the routine’s local memory.
values of local variables values of formal parameters
This local memory is a memory map.
Key: The name of the local variable or formal parameter.
Value: The current value of the variable or parameter. In other words, local memory is a hash table!
Computer Science Dept.Fall 2015: October 7
CS 153: Concepts of Compiler Design© R. Mak
4
PROGRAM main1;VAR i, j : integer;
PROCEDURE proc2a; VAR m : integer; PROCEDURE proc3; VAR j : integer BEGIN j := i + m; END;
BEGIN {proc2a} i := 11; m := j; proc3; END; PROCEDURE proc2b; VAR j, m : integer; BEGIN j := 14; m := 5; proc2a; END;
BEGIN {main1} i := 33; j := 55; proc2b;END.
Runtime Access to Nonlocal Variables
RUNTIME STACK
AR: main1i j
AR: proc2am
AR: proc3j
33 5511
55
66
AR: proc2bj m
Each parse tree node for a variable contains the variable’s symbol table entry as its VALUE attribute. Each symbol table
entry has the variable’s nesting level n.
To access the value of a variable at nesting level n, the value must come from the topmost activation record at level n. Search the runtime
stack from top to bottom for the topmost activation record at level n.
main1 proc2b proc2a proc3
14 5
Computer Science Dept.Fall 2015: October 7
CS 153: Concepts of Compiler Design© R. Mak
5
The Runtime Display
A vector called the runtime display makes it easier to access nonlocal values.
This has nothing to do with video displays!
Computer Science Dept.Fall 2015: October 7
CS 153: Concepts of Compiler Design© R. Mak
6
The Runtime Display, cont’d
Element n of the display always points to the topmost activation record at scope nesting level n on the runtime stack.
The display must be updated as activation records are pushed onto and popped off the runtime stack.
Computer Science Dept.Fall 2015: October 7
CS 153: Concepts of Compiler Design© R. Mak
7
The Runtime Display, cont’d
Whenever a new activation record at level n is pushed onto the stack, it links to the previous topmost activation record at level n.
This link helps to restore the runtime stack as activation records are popped off when returning from procedures and functions.
Computer Science Dept.Fall 2015: October 7
CS 153: Concepts of Compiler Design© R. Mak
8
Runtime Access to Nonlocal Variables
AR: main1i j
AR: proc2am
AR: proc3j
PROGRAM main1;VAR i, j : integer;
PROCEDURE proc2a; VAR m : integer; PROCEDURE proc3; VAR j : integer BEGIN j := i + m; END;
BEGIN {proc2a} i := 11; m := j; proc3; END; PROCEDURE proc2b; VAR j, m : integer; BEGIN j := 14; m := 5; proc2a; END;
BEGIN {main1} i := 33; j := 55; proc2b;END.
RUNTIMEDISPLAY
1
2
3
RUNTIME STACK
AR: proc2bj m
The runtime displayallows faster accessto nonlocal values.
main1 proc2b proc2a proc3
Computer Science Dept.Fall 2015: October 7
CS 153: Concepts of Compiler Design© R. Mak
9
Recursive Calls
PROGRAM main1
FUNCTION func2
FUNCTION func3
PROCEDURE proc2
PROCEDURE proc3
RUNTIME STACK
RUNTIMEDISPLAYAR: main1
AR: proc2
AR: proc3
AR: proc3
AR: func3
AR: func2
1
2
3
main1 proc2 proc3 proc3 func2 func3 proc2
AR: proc2
Computer Science Dept.Fall 2015: October 7
CS 153: Concepts of Compiler Design© R. Mak
10
Reminders
A VARIABLE node in the parse tree contains a pointer to the variable name’s symbol table entry.
Set in the front end by method VariableParser.parse()
The method that takes two parameters.
A symbol table entry points to its parent symbol table. The symbol table that contains the entry.
Computer Science Dept.Fall 2015: October 7
CS 153: Concepts of Compiler Design© R. Mak
11
Reminders, cont’d
Each symbol table has a nesting level field.
Therefore, at run time, for a given VARIABLE node, the executor can determine the nesting level of the variable.
Computer Science Dept.Fall 2015: October 7
CS 153: Concepts of Compiler Design© R. Mak
12
Allocating an Activation Record
The activation record for a routine (procedure, function, or the main program) needs one or more “data cells” to store the value of each of the routine’s local variables and formal parameters.
TYPE arr = ARRAY[1..3] OF integer;...PROCEDURE proc(i, j : integer; VAR x, y : real; VAR a : arr; b : arr);VAR k : integer; z : real;
i
j
x
y
k
z
b
AR: proc
a
Computer Science Dept.Fall 2015: October 7
CS 153: Concepts of Compiler Design© R. Mak
13
Allocating an Activation Record
Obtain the names and types of the local variables and formal parameters from the routine’s symbol table.
TYPE arr = ARRAY[1..3] OF integer;...PROCEDURE proc(i, j : integer; VAR x, y : real; VAR a : arr; b : arr);VAR k : integer; z : real;
i
j
x
y
k
z
b
AR: proc
a
Computer Science Dept.Fall 2015: October 7
CS 153: Concepts of Compiler Design© R. Mak
14
Allocating an Activation Record
Whenever we call a procedure or function:
Create an activation record. Push the activation record onto the runtime stack. Allocate the memory map of data cells
based on the symbol table.
TYPE arr = ARRAY[1..3] OF integer;...PROCEDURE proc(i, j : integer; VAR x, y : real; VAR a : arr; b : arr);VAR k : integer; z : real;
i
j
x
y
k
z
b
AR: proc
a
No more storingruntime values
in the symbol table!
Computer Science Dept.Fall 2015: October 7
CS 153: Concepts of Compiler Design© R. Mak
15
Passing Parameters During a Call
Value parameters: A copy of the value is passed. VAR parameters: A reference to the actual parameter is passed.
PROGRAM main;TYPE arr = ARRAY[1..3] OF integer;VAR index, count : integer; epsilon, delta : real; triplet : arr;
PROCEDURE proc(i, j : integer; VAR x, y : real; VAR a : arr; b : arr); ...BEGIN {main} ... proc(index + 2, count, epsilon, delta, triplet, triplet);END.
index
count
epsilon
delta
AR: main
triplet
i
j
x
y
b
AR: proc
a
RUNTIME STACK
10
12
84
20 30
10
84
-3.1
0.07
10 20 30
Computer Science Dept.Fall 2015: October 7
CS 153: Concepts of Compiler Design© R. Mak
16
Memory Management Interfaces
Implementations:
Runtime stack: ArrayList<ActivationRecord>
Runtime display: ArrayList<ActivationRecord>
Memory map: HashMap<String, Cell>
Class MemoryFactory creates: runtime stack runtime display memory map cell
Computer Science Dept.Fall 2015: October 7
CS 153: Concepts of Compiler Design© R. Mak
17
Class RuntimeStackImpl
In package backend.interpreter.memoryImpl Extends ArrayList<ActivationRecord>
Methods push(ActivationRecord ar)
Push an activation record onto the runtime stack.
ActivationRecord pop()Pop off the top activation record.
ActivationRecord getTopmost (int nestingLevel)Return the topmost activation record at a given nesting level. (Uses the runtime display!)
Computer Science Dept.Fall 2015: October 7
CS 153: Concepts of Compiler Design© R. Mak
18
Class RuntimeDisplayImpl
In package backend.interpreter.memoryImpl Extends ArrayList<ActivationRecord>
Methods ActivationRecord getActivationRecord
(int nestingLevel)Get the activation record at a given nesting level.
callUpdate(int nestingLevel, ActivationRecord ar)Update the display for a call to a routine at a given nesting level.
returnUpdate(int nestingLevel)Update the display for a return from a routine at a given nesting level.
Computer Science Dept.Fall 2015: October 7
CS 153: Concepts of Compiler Design© R. Mak
19
Class MemoryMapImpl
In package backend.interpreter.memoryimpl Extends HashMap<String, Cell>
Methods MemoryMapImpl(SymTab symTab)
Allocate the memory cells based on the names and types of the local variables and formal parameters in the symbol table.
Cell getCell(String name)Return the memory cell with the given name.
ArrayList<String> getAllNames()Return the list of all the names in this memory map.
Computer Science Dept.Fall 2015: October 7
CS 153: Concepts of Compiler Design© R. Mak
20
Class ActivationRecordImpl In package backend.interpreter.memoryimpl
Fields int nestingLevel
MemoryMap memoryMapValues of the local variables and formal parameters
ActivationRecord linkLink to the previous topmost activation record with the same nesting level in the runtime stack
Method Cell getCell(String name) Return a reference to a memory cell in the memory map that is
keyed by the name of a local variable or formal parameter.
Computer Science Dept.Fall 2015: October 7
CS 153: Concepts of Compiler Design© R. Mak
21
Executing Procedure and Function Calls
Computer Science Dept.Fall 2015: October 7
CS 153: Concepts of Compiler Design© R. Mak
22
Class CallDeclaredExecutor
Method execute()
Create a new activation record based on the called routine’s symbol table.
Execute the actual parameter expressions.
Initialize the memory map of the new activation record.
The symbol table entry of the name of the called routine points to the routine’s symbol table.
Copy values of actual parameters passed by value. Set pointers to actual parameters passed by reference.
Computer Science Dept.Fall 2015: October 7
CS 153: Concepts of Compiler Design© R. Mak
23
Class CallDeclaredExecutor cont’d
Method execute() cont’d
Push the new activation record onto the runtime stack.
Access the root of the called routine’s parse tree. The symbol table entry of the name of the called routine
points to the routine’s parse tree.
Execute the routine.
Pop the activation record off the runtime stack.
Computer Science Dept.Fall 2015: October 7
CS 153: Concepts of Compiler Design© R. Mak
24
Method executeActualParms()
Obtain the formal parameter cell in the new activation record:
Class CallDeclaredExecutor
Cell formalCell = newAr.getCell (formalId.getName());
Computer Science Dept.Fall 2015: October 7
CS 153: Concepts of Compiler Design© R. Mak
25
Method executeActualParms() cont’d
Value parameter:
Class CallDeclaredExecutor
Set a copy of the value of the actual parameterinto the memory cell for the formal parameter.
Object value = expressionExecutor.execute(actualNode); assignmentExecutor.assignValue (actualNode, formalId, formalCell, formalType, value, valueType);
Computer Science Dept.Fall 2015: October 7
CS 153: Concepts of Compiler Design© R. Mak
26
Class CallDeclaredExecutor
Method executeActualParms() cont’d
VAR (reference) parameter:
Method expressionExecutor.executeVariable()
executes the parse tree for an actual parameter and returns the reference to the value.
Set a reference to the actual parameterinto the memory cell for the formal parameter.
Cell actualCell= (Cell) ExpressionExecutor.executeVariable (actualNode);formalCell.setValue(actualCell);
Computer Science Dept.Fall 2015: October 7
CS 153: Concepts of Compiler Design© R. Mak
27
Class Cell
Since a memory cell can contain a value of any type or a reference, we implement it simply as a Java object. package wci.backend.interpreter.memoryimpl;
public class CellImpl implements Cell{ private Object value = null;
...
public void setValue(Object newValue) { value = newValue; }
public Object getValue() { return value; }}
Computer Science Dept.Fall 2015: October 7
CS 153: Concepts of Compiler Design© R. Mak
28
Runtime Error Checking
Range error
Assign a value to a variable with a subrange type. Verify the value is within range (not less than the
minimum value and not greater than the maximum value)
Method StatementExecutor.checkRange()
Division by zero error
Before executing a division operation, check that the divisor’s value is not zero.
Computer Science Dept.Fall 2015: October 7
CS 153: Concepts of Compiler Design© R. Mak
29
Pascal Interpreter
Now we can execute entire Pascal programs!
Demo