CSE 504. Expression evaluation. Expression Evaluation, Runtime Environments. One possible semantics: Problem:

Similar documents
CSE 307: Principles of Programming Languages

CSE 504: Compilers. Expressions. R. Sekar

CSE 307: Principles of Programming Languages

Run-time Environments

Run-time Environments

CS558 Programming Languages

CS558 Programming Languages Winter 2018 Lecture 4a. Andrew Tolmach Portland State University

Procedure and Object- Oriented Abstraction

Module 27 Switch-case statements and Run-time storage management

CIT Week13 Lecture

CSE 504: Compiler Design. Runtime Environments

G Programming Languages - Fall 2012

Code Generation & Parameter Passing

System Software Assignment 1 Runtime Support for Procedures

CS 314 Principles of Programming Languages. Lecture 13

CS 330 Lecture 18. Symbol table. C scope rules. Declarations. Chapter 5 Louden Outline

Weeks 6&7: Procedures and Parameter Passing

Concepts Introduced in Chapter 7

CSE 3302 Programming Languages Lecture 5: Control

CS1622. Semantic Analysis. The Compiler So Far. Lecture 15 Semantic Analysis. How to build symbol tables How to use them to find

The basic operations defined on a symbol table include: free to remove all entries and free the storage of a symbol table

Run-time Environments - 2

Informatica 3 Marcello Restelli

G Programming Languages Spring 2010 Lecture 4. Robert Grimm, New York University

CS 480 Fall Runtime Environments. Mike Lam, Professor. (a.k.a. procedure calls and heap management)

Run-time Environments. Lecture 13. Prof. Alex Aiken Original Slides (Modified by Prof. Vijay Ganesh) Lecture 13

Example. program sort; var a : array[0..10] of integer; procedure readarray; : function partition (y, z :integer) :integer; var i, j,x, v :integer; :

The Procedure Abstraction

Procedure and Function Calls, Part II. Comp 412 COMP 412 FALL Chapter 6 in EaC2e. target code. source code Front End Optimizer Back End

1 Lexical Considerations

! Those values must be stored somewhere! Therefore, variables must somehow be bound. ! How?

SE352b: Roadmap. SE352b Software Engineering Design Tools. W3: Programming Paradigms

Naming in OOLs and Storage Layout Comp 412

Chapter 10. Implementing Subprograms ISBN

Implementing Subprograms

CS356: Discussion #6 Assembly Procedures and Arrays. Marco Paolieri

CSE 307: Principles of Programming Languages

Principles of Programming Languages

SEMANTIC ANALYSIS TYPES AND DECLARATIONS

Scope, Functions, and Storage Management

Memory Management and Run-Time Systems

Lecture 7: Type Systems and Symbol Tables. CS 540 George Mason University

CS 536 Introduction to Programming Languages and Compilers Charles N. Fischer Lecture 11

Run Time Environments

Separate compilation. Topic 6: Runtime Environments p.1/21. CS 526 Topic 6: Runtime Environments The linkage convention

Programming Languages: Lecture 12

Announcements. My office hours are today in Gates 160 from 1PM-3PM. Programming Project 3 checkpoint due tomorrow night at 11:59PM.

Lexical Considerations

THEORY OF COMPILATION

Principles of Programming Languages

Run-Time Data Structures

Compilers. 8. Run-time Support. Laszlo Böszörmenyi Compilers Run-time - 1

Principles of Programming Languages Topic: Scope and Memory Professor Louis Steinberg Fall 2004

CA Compiler Construction

Design Issues. Subroutines and Control Abstraction. Subroutines and Control Abstraction. CSC 4101: Programming Languages 1. Textbook, Chapter 8

Where We Are. Lexical Analysis. Syntax Analysis. IR Generation. IR Optimization. Code Generation. Machine Code. Optimization.

Compilation /15a Lecture 7. Activation Records Noam Rinetzky

Run Time Environment. Procedure Abstraction. The Procedure as a Control Abstraction. The Procedure as a Control Abstraction

Implementing Subprograms

Attributes of Variable. Lecture 13: Run-Time Storage Management. Lifetime. Value & Location

Lexical Considerations

Code Generation. Lecture 12

CS558 Programming Languages

MIPS Functions and the Runtime Stack

Subroutines and Control Abstraction. CSE 307 Principles of Programming Languages Stony Brook University

CS558 Programming Languages

Run Time Environment. Activation Records Procedure Linkage Name Translation and Variable Access

IMPORTANT QUESTIONS IN C FOR THE INTERVIEW

Programming Languages

Control Abstraction. Hwansoo Han

Chapter 9 :: Subroutines and Control Abstraction

CS558 Programming Languages. Winter 2013 Lecture 3

The structure of a compiler

Review of the C Programming Language

Programming Languages Third Edition. Chapter 7 Basic Semantics

Topic 3-a. Calling Convention 2/29/2008 1

Implementing Subprograms

Programming Languages

Names, Scopes, and Bindings. CSE 307 Principles of Programming Languages Stony Brook University

Winter Compiler Construction T10 IR part 3 + Activation records. Today. LIR language

Symbol Tables. ASU Textbook Chapter 7.6, 6.5 and 6.3. Tsan-sheng Hsu.

Chap. 8 :: Subroutines and Control Abstraction

Intermediate Code Generation (ICG)

Names, Scopes, and Bindings. CSE 307 Principles of Programming Languages Stony Brook University

Semantic Analysis and Type Checking

Symbol Tables. For compile-time efficiency, compilers often use a symbol table: associates lexical names (symbols) with their attributes

CS558 Programming Languages

Topic 7: Activation Records

Programming Languages Third Edition. Chapter 10 Control II Procedures and Environments

Code Generation II. Code generation for OO languages. Object layout Dynamic dispatch. Parameter-passing mechanisms Allocating temporaries in the AR

Design issues for objectoriented. languages. Objects-only "pure" language vs mixed. Are subclasses subtypes of the superclass?

Run-time Environment

Acknowledgement. CS Compiler Design. Semantic Processing. Alternatives for semantic processing. Intro to Semantic Analysis. V.

CS558 Programming Languages. Winter 2013 Lecture 4

Chapter 11. Categories of languages that support OOP: 1. OOP support is added to an existing language

Names, Bindings, Scopes

Symbol Table Information. Symbol Tables. Symbol table organization. Hash Tables. What kind of information might the compiler need?

Short Notes of CS201

ASSEMBLY III: PROCEDURES. Jo, Heeseung

Special Topics: Programming Languages

Transcription:

Expression evaluation CSE 504 Order of evaluation For the abstract syntax tree + + 5 Expression Evaluation, Runtime Environments + + x 3 2 4 the equivalent expression is (x + 3) + (2 + 4) + 5 1 2 (. Contd ) Expression evaluation One possible semantics: evaluate AST bottom-up, left-to-right. Problem: constrains optimizations based on mathematical properties, e.g., commutativity and associativity Consider (x+0)+(y+3)+(z+4) Using associativity and commutativity, the compiler ( runtime can simplify this to x+y+z+7 (3 additions at A strict left-to-right evaluation would require 5 addition operations at runtime. 3 (. Contd ) Expression evaluation Some languages leave order of eval unspecified. Problem: Semantics of expressions with side-effects, e.g., (x++) + x If initial value of x is 5, left-to-right evaluation yields 11 as answer, but right-to-left evaluation yields 10 So, languages that allow expressions with sideeffects are forced to specify order of evaluation Still, it is bad programming practice to use expressions where different orders of evaluation can lead to different results Impacts readability (and maintainability) of programs 4

Evaluation of Boolean Expressions Left-to-right evaluation with short-circuit semantics is appropriate for boolean expressions. In e1&&e2, e2 is evaluated only if e1 evaluates to true. In e1 e2, e2 is evaluated only if e1 evaluates to false. This semantics is convenient in programming: ( a[i]!=0 Consider statement: if ((i<n) && With short-circuiting, a[i] never accessed if i>= n ( p->value>0 Another example: if((p!=null) && 5 Switch Statement switch (<expr>) { case <value> : case <value> :... default : Evaluate <expr> to get value v. Evaluate the case that corresponds to v. Restrictions: <value> has to be constant, of an ordinal type e.g., int Why? 6 Implementation of Switch statement Naive algorithm: Sequential comparison of value v with case labels. This is simple, but inefficient. It involves O(N) comparisons. switch (e) { case 0 : s0 ; case 1 : s1 ; case 2 : s2 ; default: s3 ; can be translated as v = e ; if (v == 0) s0 ; else if (v == 1) s1 ; else if (v == 2) s2 ; else s3 ; 7 Implementation of switch statement (. Contd ) Binary search: O(log N) comparisons, a drastic improvement over sequential search for large N. Using this, the above case statement can be translated as v = e; ( 1 <= (v if if(v == 0) s0; else if (v == 1) s1; else if (v == 2) s2 ; else s3 ; 8

Implementation of switch statement (. Contd ) Another technique is to use hash tables. This maps the value v to the case label that corresponds to the value v. This takes constant time (average case). Loops while: Consider the statement: while C do S Its semantics is equivalent to: if C then {S; s1 repeat: Consider: repeat S until C Its semantics is equivalent to S; if (!C) then S2 for: Semantics of for (S2; C; S3) S is the same as that of S2; while C do {S; S3 9 10 (. contd ) Control Statements Procedure calls: Communication between the calling and the called procedures takes place via parameters. Semantics: substitute formal parameters with actual parameters rename local variables so that they are unique in the program replace procedure call with the body of called procedure Parameter-passing semantics Call-by-value Call-by-reference Call-by-value-result Call-by-need Differences with macros 11 12

Call-by-value Evaluate the actual parameters Assign them to corresponding formal parameters Execute the body of the procedure. We need to ensure that the names of local variables and formal parameters of callee do not clash with the variable names visible in the caller If they do, the variables in the callee should be renamed to avoid any clash. 13 (. Contd ) Call-By-Value Example: int z; void p(int x) { main() { z = 2*x; int y; ==> int x = y; main() { z = 2*x; int y; p(y); 14 Call-By-Value-Result In addition to the steps in CBV, add: assignment statements to copy values of formal parameters to actuals at the end of callee code int z; main() { void p(int x) { int y; z = 2*x; int x = y; ==> z = 2*x; main() { y = x; int y; p(y); 15 Call-By-Reference Works like CBV, with one important difference: l-values (rather than r-values) are passed in. int z; void p(int x) { main() { z = 2*x; int y; ==> int& x = y; main() { z = 2*x; int y; p(y); Call-by-reference supported in C++ but not C Effect realized in C by explicitly passing l-values of parameters using the & operator 16

(. contd ) Call-by-reference Explicit simulation in C provides a clearer understanding of the semantics of call-by-reference: int p(int *x) { *x = *x + 1; return *x;... int z; y = p(&z); CBVR Vs CBR Consider void p(int x, int y) { x = x+1; y = y+1;... int a = 3; p (a, a); With CBVR, a will have the value 4 With CBR, a will have the value 5 17 18 Call-by-Name Instead of assigning l-values or r-values, CBN works by substituting actual parameter expressions in place of formal parameters in the body of callee int z; void p(int x,y) { main() { z = x+x+y; int z1; ==> main() { z = (y++)+(y++) int y=0; +(y--); p(y++, y--); 19 Macros Macros work like CBN, with one important difference: no renaming of local variables This means that possible name clashes between actual parameters and variables in the body of the macro will lead to unexpected results. 20

(. Macros(Contd given #define sixtimes(y) {int z=0; z = 2*y; y = 3*z; main() { int x = 5, z = 3; sixtimes(z); After macro substitution, we get the program: main() { int x = 5, z = 3; { int z=0; z = 2*z; y = 3*z; 21 (. Macros(Contd It is different from what we would have got with CBN parameter passing. In particular, the name confusion between the local variable z and the actual parameter z would have been avoided, leading to the following result: main() { int x = 5, z = 3; { int z1=0; z1 = 2*z; z = 3*z1; 22 Difficulties in Using the Parameter Passing Mechanisms CBV: Easiest to understand, no difficulties or unexpected results. CBVR: When the same parameter is passed in twice, the end result can differ depending on the order. void p(int x, int y) { x = x+1; y = y+2;... int a = 3; p (a, a); // a=4 or a=5? Otherwise, relatively easy to understand. 23 Difficulties in Using CBR Aliasing can create problems. int arev(int a[], int b[], int size) { (++ i for (int i = 0; i < size; a[i] = b[size-i-1]; The above procedure will normally copy b into a, while reversing the order of elements in b. However, if a and b are the same, as in an invocation arev(c,c,4), the result is quite different. If c is {1,2,3,4 at the point of call, then its value on exit from arev will be {4,3,3,4. 24

Difficulties in Using CBN CBN is probably the most complicated of the parameter passing mechanisms, and can be quite confusing in several situations. If the actual parameter is an expression with side-effects: void f(int x) { int y = x; int z = x; main() { int y = 0; f(y++); Note that after a call to f, y's value will be 2 rather than 1. 25 (. CBN(Contd Difficulties in Using If the same variable is used in multiple parameters. void swap(int x, int y) { int tp = x; x = y; y = x; main() { int a[] = {1, 1, 0; int i = 2; swap(i, a[i]); When using CBN, by replacing the call to swap by the body of swap: i will be 0, and a will be {0, 1, 0. 26 Difficulties in Using Macro Macros share all of the problems associated with CBN. In addition, macro substitution does not perform renaming of local variables, leading to additional problems. Components of ( RTE ) Runtime Environment Static area allocated at load/startup time. Examples: global/static variables Variables mapped to absolute addresses at compile time Stack area for execution-time data that obeys a last-in first-out lifetime rule. Examples: local variables, parameters, temporary vars Heap area for "fully dynamic" data, i.e. data that doesn t obey LIFO rule. Examples: objects in Java, lists in Scheme. 27 28

Languages and Environments Languages differ on where activation records must go in the environment: (Old) Fortran is static: all data, including activation records, are statically allocated. Each function has only one activation record no recursion! Functional languages (Scheme,ML) and some OO languages (Smalltalk) are heap-oriented: almost all data, including AR, allocated dynamically. Most languages are in between: data can go ( properties anywhere (depending on its ARs go on the stack. Stack Allocation An Activation Record (AR) is created for each invocation of a procedure Structure of AR: Base Pointer Actual parameters Return value Return address ( link Saved BP (control Local variables Temporary variables Direction of stack growth 29 30 Simple stack-based allocation Local variables are allocated at a fixed offset on the stack Accessed using this constant offset from BP Example: to load a local variable at offset 8 into the EBX register (x86 architecture) mov 0x8(%ebp), %ebx Example: { int x; int y; { int z; { int w; Steps involved in a procedure call Caller Save registers Evaluate actual parameters, push on the stack Push l-values for CBR, r-values in the case of CBV Allocate space for return value on stack Save return address Jump to the beginning of called function Callee ( AR Save BP (control link field in Move SP to BP ( SP Allocate storage for locals and temporaries (Decrement Local variables accessed as [FP+k], parameters using [FP-l] 31 32

Steps in return Callee Copy return value into its location on AR Increment SP to deallocate locals/temporaries Restore BP from Control link Jump to return address on stack Caller Copy return values Pop parameters from stack Restore saved registers int x; ( y void p( int { int i = x; char c;... ( a void q ( int { int x; p(1); () main { q(2); return 0; Example (C): 33 34 Non-local variable access Requires that the environment be able to identify frames representing enclosing scopes. Using the control link results in dynamic scope (and also kills the fixed-offset property). If procedures can't be nested (C), the enclosing scope is always locatable: ( directly it is global/static (accessed If procedures can be nested (Ada, Pascal), to maintain lexical scope a new link must be added to each frame: access link, pointing to the activation of the defining environment of each procedure. 35 Implementation Aspects of OO-Languages Allocation of space for data members: The space for data members is laid out the same way it is done for structures in C or other languages. Specifically: The data members are allocated next to each other. Some padding may be required in between fields, if the underlying machine architecture requires primitive types to be aligned at certain addresses. At runtime, there is no need to look up the name of a field and identify the corresponding offset into a structure; instead, we can statically translate field names into relative addresses, with respect to the beginning of the object. Data members for a derived class immediately follow the data members of the base class Multiple inheritance requires more complicated handling, we will not discuss it here 36

Implementation Aspects of OO-Languages Implementation Aspects of OO-Languages class B { int i; double d; char c; float f; 0 int i // Integer requires 4 bytes 4 // pad, XXXXXXXXXXX 8 // Double requires 8 bytes double d char c XXXXX 16 // char needs 1 byte, 3 are padded 20 float f // float to be aligned on 4-byte // require 4-bytes of space class C { 0 int k, l; B b; 4 8 12 16 int k int l int i XXXXXXXXXXX double d char c XXXXX float f 37 38 Implementation Aspects of OO-Languages class D: public C { 0 double x; 4 8 int k int l int i XXXXXXXXXXX double d Implementation of Virtual Functions Approach 1: Lookup type info at runtime, and then call the function defined by that type. Problem: very expensive, require type info to be maintained at runtime. 12 16 char c XXXXX float f double x 24 39 40

Implementation of Virtual (. Functions(Contd Approach 2: Treat function members like data members: Allocate storage for them within the object. Put a pointer to the function in this location, and translate calls to the function to make an indirection through this field. Benefit: No need to maintain type info at runtime. Implementation of virtual methods is fast. Problem: Potentially lot of space is wasted for each object. Even though all objects of the same class have identical values for the table. Implementation of Virtual (. Functions(Contd Approach 3: Introduce additional indirection into approach 2. Store a pointer to a table in the object, and this table holds the actual pointers to virtual functions. Now we use only one word of storage in each object. 41 42 class B { int i ; char c ; virtual void g(); virtual void h(); B b1, b2; Implementation of Virtual (. Functions(Contd i c VMT ptr i c VMT ptr Ptr to B s g Ptr to B s h Impact of subtype principle on Implementation The subtype principle requires that any piece of code that operates on an object of type B can work "as is" when given an object belonging to a subclass of B. This implies that runtime representation used for objects of a subtype A must be compatible with those for objects of the base type B. Note that the way the fields of an object are accessed at runtime is using an offset from the start address for the object. For instance, b1.i will be accessed using an expression of the form *(&b1+0), where 0 is the offset corresponding to the field i. Similarly, the field b1.c will be accessed using the ( b1+1 &)* expression 43 44

Impact of subtype principle on (. Contd ) Implementation an invocation of the virtual member function b1.h() will be implemented at runtime using an instruction of the form: ( b1+2)+1 &)*)* call &b1+2 gives the location where the VMT ptr is located *(&b1+2) gives the value of the VMT ptr, which corresponds to the location of the VMT table *(&b1+2) + 1 yields the location within the VMT table where the pointer to virtual function h is stored. Impact of subtype principle on (. Contd ) Implementation The subtype principle imposes the following constraint: Any field of an object of type B must be stored at the same offset from the base of any object that belongs to a subtype of B. The VMT ptr must be present at the same offset from the base of any object of type B or one of its subclasses. The location of virtual function pointers within the VMT should remain the same for all virtual functions of B across all subclasses of B. 45 46 Impact of subtype principle on (. Contd ) Implementation We must use the following layout for an object of type A defined as follows: class A: public B { float f; void h(); // reuses implementation of G from B; virtual void k(); A a; a s layout i c VMT ptr Float f Virtual Method Table (VMT)for class A Ptr to B s g Ptr to A s h Ptr to A s k 47 Impact of subtype principle on (. Contd ) Implementation In order to satisfy the constraint that VMT ptr appear at the same position in objects of type A and B, it is necessary for the data field f in A to appear after the VMT field. A couple of other points: a) non-virtual functions are statically dispatched, so they do not appear in the VMT table b) when a virtual function f is NOT redefined in a subclass, the VMT table for that class is initialized with an entry to the function f defined its superclass. 48