1 / 29

CS 153: Concepts of Compiler Design October 8 Class Meeting

CS 153: Concepts of Compiler Design October 8 Class Meeting. Department of Computer Science San Jose State University Fall 2014 Instructor: Ron Mak www.cs.sjsu.edu/~mak. Runtime Activation Records.

Download Presentation

CS 153: Concepts of Compiler Design October 8 Class Meeting

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. CS 153: Concepts of Compiler DesignOctober 8 Class Meeting Department of Computer ScienceSan Jose State UniversityFall 2014Instructor: Ron Mak www.cs.sjsu.edu/~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_

  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!

  4. AR: proc3 AR: proc2a AR: proc2b m AR: main1 m j j i j Runtime Access to Nonlocal Variables 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. • 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. 66 55 14 5 33 11 55 RUNTIME STACK main1  proc2b  proc2a  proc3

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

  6. The Runtime Display, cont’d • Elementnof the display always points to the topmost activation record at scope nesting level non the runtime stack. • The display must be updated as activation records are pushed onto and popped off the runtime stack._

  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._

  8. AR: proc3 AR: proc2a AR: proc2b m AR: main1 m j j j i Runtime Access to Nonlocal Variables 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. 3 2 1 RUNTIME DISPLAY The runtime display allows faster access to nonlocal values. RUNTIME STACK main1  proc2b  proc2a  proc3

  9. Recursive Calls PROGRAM main1 FUNCTION func2 FUNCTION func3 PROCEDURE proc2 PROCEDURE proc3 AR: proc2 AR: func3 AR: proc3 AR: func2 AR: proc3 3 2 AR: proc2 1 RUNTIME DISPLAY AR: main1 RUNTIME STACK  proc2  proc3  proc3 main1  func2  func3  proc2

  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.

  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._

  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; AR: proc i x k j y z a b

  13. Allocating an Activation Record 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; • Obtain the names and types of the local variables and formal parameters from the routine’s symbol table. AR: proc i x k j y z a b

  14. Allocating an Activation Record 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; • 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. AR: proc i x k j y z a b No more storing runtime values in the symbol table!

  15. index epsilon 10 -3.1 count delta 84 0.07 triplet 10 20 30 AR: main Passing Parameters During a Call 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. • Value parameters: A copy of the value is passed. • VAR parameters: A reference to the actual parameter is passed. AR: proc i x 12 j y 84 a b 10 20 30 RUNTIME STACK

  16. Memory Management Interfaces • Implementations: • Runtime stack: ArrayList<ActivationRecord> • Runtime display: ArrayList<ActivationRecord> • Memory map: HashMap<String, Cell> • Class MemoryFactorycreates: • runtime stack • runtime display • memory map • cell

  17. Class RuntimeStackImpl • In package backend.interpreter.memoryImpl • Extends ArrayList<ActivationRecord> • Methods • push(ActivationRecordar)Push an activation record onto the runtime stack. • ActivationRecord pop()Pop off the top activation record. • ActivationRecordgetTopmost(intnestingLevel)Return the topmost activation record at a given nesting level. (Uses the runtime display!)

  18. Class RuntimeDisplayImpl • In package backend.interpreter.memoryImpl • Extends ArrayList<ActivationRecord> • Methods • ActivationRecordgetActivationRecord (intnestingLevel)Get the activation record at a given nesting level. • callUpdate(intnestingLevel, ActivationRecordar)Update the display for a call to a routine at a given nesting level. • returnUpdate(intnestingLevel)Update the display for a return from a routine at a given nesting level.

  19. Class MemoryMapImpl • In package backend.interpreter.memoryimpl • Extends HashMap<String, Cell> • Methods • MemoryMapImpl(SymTabsymTab)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.

  20. Class ActivationRecordImpl • In package backend.interpreter.memoryimpl • Fields • intnestingLevel • MemoryMapmemoryMapValues 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.

  21. Executing Procedure and Function Calls

  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._

  23. Class CallDeclaredExecutorcont’d • Method execute() cont’d • Push the new activation recordonto 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._

  24. Class CallDeclaredExecutor • Method executeActualParms() • Obtain the formal parameter cell in the new activation record: • Cell formalCell = newAr.getCell (formalId.getName());

  25. Class CallDeclaredExecutor • Method executeActualParms() cont’d • Value parameter: • Object value = expressionExecutor.execute(actualNode);assignmentExecutor.assignValue (actualNode, formalId,formalCell, formalType, value, valueType); Set a copy of the value of the actual parameter into the memory cell for the formal parameter.

  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. • Cell actualCell= (Cell) ExpressionExecutor.executeVariable (actualNode);formalCell.setValue(actualCell); Set a reference to the actual parameter into the memory cell for the formal parameter.

  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 CellImplimplements Cell { private Object value = null; ... public void setValue(Object newValue) { value = newValue; } public Object getValue() { return value; } }

  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.

  29. Pascal Interpreter • Now we can execute entire Pascal programs! • Demo

More Related