cs 153: concepts of compiler design october 7 class meeting department of computer science san jose...

29
CS 153: Concepts of Compiler Design October 7 Class Meeting Department of Computer Science San Jose State University Fall 2015 Instructor: Ron Mak www.cs.sjsu.edu/~mak 1

Upload: doris-hudson

Post on 14-Dec-2015

215 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: CS 153: Concepts of Compiler Design October 7 Class Meeting Department of Computer Science San Jose State University Fall 2015 Instructor: Ron Mak mak

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

Page 2: CS 153: Concepts of Compiler Design October 7 Class Meeting Department of Computer Science San Jose State University Fall 2015 Instructor: Ron Mak 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

Page 3: CS 153: Concepts of Compiler Design October 7 Class Meeting Department of Computer Science San Jose State University Fall 2015 Instructor: Ron Mak mak

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!

Page 4: CS 153: Concepts of Compiler Design October 7 Class Meeting Department of Computer Science San Jose State University Fall 2015 Instructor: Ron Mak mak

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

Page 5: CS 153: Concepts of Compiler Design October 7 Class Meeting Department of Computer Science San Jose State University Fall 2015 Instructor: Ron Mak mak

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!

Page 6: CS 153: Concepts of Compiler Design October 7 Class Meeting Department of Computer Science San Jose State University Fall 2015 Instructor: Ron Mak mak

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.

Page 7: CS 153: Concepts of Compiler Design October 7 Class Meeting Department of Computer Science San Jose State University Fall 2015 Instructor: Ron Mak mak

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.

Page 8: CS 153: Concepts of Compiler Design October 7 Class Meeting Department of Computer Science San Jose State University Fall 2015 Instructor: Ron Mak mak

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

Page 9: CS 153: Concepts of Compiler Design October 7 Class Meeting Department of Computer Science San Jose State University Fall 2015 Instructor: Ron Mak mak

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

Page 10: CS 153: Concepts of Compiler Design October 7 Class Meeting Department of Computer Science San Jose State University Fall 2015 Instructor: Ron Mak mak

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.

Page 11: CS 153: Concepts of Compiler Design October 7 Class Meeting Department of Computer Science San Jose State University Fall 2015 Instructor: Ron Mak mak

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.

Page 12: CS 153: Concepts of Compiler Design October 7 Class Meeting Department of Computer Science San Jose State University Fall 2015 Instructor: Ron Mak mak

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

Page 13: CS 153: Concepts of Compiler Design October 7 Class Meeting Department of Computer Science San Jose State University Fall 2015 Instructor: Ron Mak mak

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

Page 14: CS 153: Concepts of Compiler Design October 7 Class Meeting Department of Computer Science San Jose State University Fall 2015 Instructor: Ron Mak mak

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!

Page 15: CS 153: Concepts of Compiler Design October 7 Class Meeting Department of Computer Science San Jose State University Fall 2015 Instructor: Ron Mak mak

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

Page 16: CS 153: Concepts of Compiler Design October 7 Class Meeting Department of Computer Science San Jose State University Fall 2015 Instructor: Ron Mak mak

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

Page 17: CS 153: Concepts of Compiler Design October 7 Class Meeting Department of Computer Science San Jose State University Fall 2015 Instructor: Ron Mak mak

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!)

Page 18: CS 153: Concepts of Compiler Design October 7 Class Meeting Department of Computer Science San Jose State University Fall 2015 Instructor: Ron Mak mak

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.

Page 19: CS 153: Concepts of Compiler Design October 7 Class Meeting Department of Computer Science San Jose State University Fall 2015 Instructor: Ron Mak mak

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.

Page 20: CS 153: Concepts of Compiler Design October 7 Class Meeting Department of Computer Science San Jose State University Fall 2015 Instructor: Ron Mak mak

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.

Page 21: CS 153: Concepts of Compiler Design October 7 Class Meeting Department of Computer Science San Jose State University Fall 2015 Instructor: Ron Mak mak

Computer Science Dept.Fall 2015: October 7

CS 153: Concepts of Compiler Design© R. Mak

21

Executing Procedure and Function Calls

Page 22: CS 153: Concepts of Compiler Design October 7 Class Meeting Department of Computer Science San Jose State University Fall 2015 Instructor: Ron Mak mak

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.

Page 23: CS 153: Concepts of Compiler Design October 7 Class Meeting Department of Computer Science San Jose State University Fall 2015 Instructor: Ron Mak mak

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.

Page 24: CS 153: Concepts of Compiler Design October 7 Class Meeting Department of Computer Science San Jose State University Fall 2015 Instructor: Ron Mak mak

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());

Page 25: CS 153: Concepts of Compiler Design October 7 Class Meeting Department of Computer Science San Jose State University Fall 2015 Instructor: Ron Mak mak

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);

Page 26: CS 153: Concepts of Compiler Design October 7 Class Meeting Department of Computer Science San Jose State University Fall 2015 Instructor: Ron Mak mak

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);

Page 27: CS 153: Concepts of Compiler Design October 7 Class Meeting Department of Computer Science San Jose State University Fall 2015 Instructor: Ron Mak mak

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; }}

Page 28: CS 153: Concepts of Compiler Design October 7 Class Meeting Department of Computer Science San Jose State University Fall 2015 Instructor: Ron Mak mak

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.

Page 29: CS 153: Concepts of Compiler Design October 7 Class Meeting Department of Computer Science San Jose State University Fall 2015 Instructor: Ron Mak mak

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