Intermediate Code Generation

Slides:



Advertisements
Similar presentations
CH4.1 Type Checking Md. Fahim Computer Engineering Department Jamia Millia Islamia (A Central University) New Delhi –
Advertisements

Chapter 6 Intermediate Code Generation
Intermediate Code Generation
Intermediate Code Generation. 2 Intermediate languages Declarations Expressions Statements.
8 Intermediate code generation
Chapter 8 Intermediate Code Generation. Intermediate languages: Syntax trees, three-address code, quadruples. Types of Three – Address Statements: x :=
1 Compiler Construction Intermediate Code Generation.
CH4.1 CSE244 Type Checking Aggelos Kiayias Computer Science & Engineering Department The University of Connecticut 371 Fairfield Road, Unit 1155 Storrs,
1 CMPSC 160 Translation of Programming Languages Fall 2002 Lecture-Modules 17 and 18 slides derived from Tevfik Bultan, Keith Cooper, and Linda Torczon.
1 Chapter 7: Runtime Environments. int * larger (int a, int b) { if (a > b) return &a; //wrong else return &b; //wrong } int * larger (int *a, int *b)
Intermediate Code Generation Professor Yihjia Tsai Tamkang University.
1 Intermediate Code generation. 2 Intermediate Code Generation l Intermediate languages l Declarations l Expressions l Statements l Reference: »Chapter.
Syntax Directed Translation
CH4.1 CSE244 Bottom Up Translation (revisited) Aggelos Kiayias Computer Science & Engineering Department The University of Connecticut 371 Fairfield Road,
CSC 8505 Compiler Construction Intermediate Representations.
CH4.1 CSE244 Syntax Directed Translation Aggelos Kiayias Computer Science & Engineering Department The University of Connecticut 371 Fairfield Road, Unit.
Compiler Construction A Compulsory Module for Students in Computer Science Department Faculty of IT / Al – Al Bayt University Second Semester 2008/2009.
CH4.1 CSE244 Intermediate Code Generation Aggelos Kiayias Computer Science & Engineering Department The University of Connecticut 371 Fairfield Road, Unit.
Static checking and symbol table Chapter 6, Chapter 7.6 and Chapter 8.2 Static checking: check whether the program follows both the syntactic and semantic.
What is Three Address Code? A statement of the form x = y op z is a three address statement. x, y and z here are the three operands and op is any logical.
1 Structure of a Compiler Front end of a compiler is efficient and can be automated Back end is generally hard to automate and finding the optimum solution.
Compiler Chapter# 5 Intermediate code generation.
1 Intermediate Code Generation Part I Chapter 8 COP5621 Compiler Construction Copyright Robert van Engelen, Florida State University, 2007.
Chapter 8: Intermediate Code Generation
1 October 25, October 25, 2015October 25, 2015October 25, 2015 Azusa, CA Sheldon X. Liang Ph. D. Computer Science at Azusa Pacific University Azusa.
Intermediate Code Generation
Intermediate Code Generation
1 June 3, June 3, 2016June 3, 2016June 3, 2016 Azusa, CA Sheldon X. Liang Ph. D. Computer Science at Azusa Pacific University Azusa Pacific University,
Chapter 5. Syntax-Directed Translation. 2 Fig Syntax-directed definition of a simple desk calculator ProductionSemantic Rules L  E n print ( E.val.
Topic #7: Intermediate Code EE 456 – Compiling Techniques Prof. Carl Sable Fall 2003.
1 Intermediate Code Generation Abstraction at the source level identifiers, operators, expressions, statements, conditionals, iteration, functions (user.
Review: Syntax directed translation. –Translation is done according to the parse tree. Each production (when used in the parsing) is a sub- structure of.
Code Generation CPSC 388 Ellen Walker Hiram College.
1 Structure of a Compiler Source Language Target Language Semantic Analyzer Syntax Analyzer Lexical Analyzer Front End Code Optimizer Target Code Generator.
Three Address Code Generation of Control Statements continued..
CS 404Ahmed Ezzat 1 CS 404 Introduction to Compiler Design Lecture 10 Ahmed Ezzat.
1 Compiler Construction (CS-636) Muhammad Bilal Bashir UIIT, Rawalpindi.
CS 404 Introduction to Compiler Design
Syntax-Directed Translation
Context-Sensitive Analysis
Intermediate code Jakub Yaghob
Compilers Principles, Techniques, & Tools Taught by Jing Zhang
Compiler Construction
Compiler Construction
Intermediate Code Generation
Subject Name:COMPILER DESIGN Subject Code:10CS63
Compiler Optimization and Code Generation
Intermediate Code Generation Part I
פרק 5 תרגום מונחה תחביר תורת הקומפילציה איתן אביאור.
Chapter 2: A Simple One Pass Compiler
Intermediate Code Generation
Chapter 6 Intermediate-Code Generation
Three Address Code Generation - Control Statements
Intermediate Code Generation Part I
Designing a Predictive Parser
Intermediate code generation
Three-address code A more common representation is THREE-ADDRESS CODE . Three address code is close to assembly language, making machine code generation.
Syntax-Directed Translation Part II
Compiler Design 21. Intermediate Code Generation
Intermediate Code Generation Part I
SYNTAX DIRECTED DEFINITION
Intermediate Code Generation
THREE ADDRESS CODE GENERATION
Intermediate Code Generation
Syntax-Directed Translation Part II
Intermediate Code Generation Part I
Compiler Construction
Compiler Design 21. Intermediate Code Generation
Review: What is an activation record?
Intermediate Code Generating machine-independent intermediate form.
Presentation transcript:

Intermediate Code Generation Aggelos Kiayias Computer Science & Engineering Department The University of Connecticut 371 Fairfield Road, Unit 1155 Storrs, CT 06269-1155 aggelos@cse.uconn.edu http://www.cse.uconn.edu/~akiayias

Intermediate Code Generation Translating source program into an “intermediate language.” Simple CPU Independent, …yet, close in spirit to machine language. Or, depending on the application other intermediate languages may be used, but in general, we opt for simple, well structured intermediate forms. (and this completes the “Front-End” of Compilation).

Types of Intermediate Languages Graphical Representations. Consider the assignment a:=b*-c+b*-c: assign assign a + + a * * * uminus b uminus uminus b b c c c

Syntax Dir. Definition for Gr. Reps. PRODUCTION Semantic Rule S  id := E { S.nptr = mknode (‘assign’, mkleaf(id, id.entry), E.nptr) } E  E1 + E2 {E.nptr = mknode(‘+’, E1.nptr,E2.nptr) } E  E1 * E2 {E.nptr = mknode(‘*’, E1.nptr,E2.nptr) } E  - E1 {E.nptr = mknode(‘uminus’, E1.nptr) } E  ( E1 ) {E.nptr = E1.nptr } E  id {E.nptr = mkleaf(id, id.entry) }

Three Address Code Statements of general form x:=y op z No built-up arithmetic expressions are allowed. As a result, x:=y + z * w should be represented as t1:=z * w t2:=y + t1 x:=t2 Observe that given the syntax-tree or the dag of the graphical representation we can easily derive a three address code for assignments as above. In fact three-address code is a linearization of the tree. Three-address code is useful: related to machine-language/ simple/ optimizable.

Example of 3-address code t1:=- c t2:=b * t1 t3:=- c t4:=b * t3 t5:=t2 + t4 a:=t5 t1:=- c t2:=b * t1 t5:=t2 + t2 a:=t5

Types of Three-Address Statements. x:=y op z x:=op z x:=z goto L if x relop y goto L Push/pop (stack) more advanced: param x1 param x2 … param xn call p,n x:=&y x:=*y *x:=y x:=y[i] x[i]:=y l-value of y (memory address That corresponds to variable y) Dereference of y, i.e., treat the r-value of y as memory Location and *y would be its Contents. Dereference of y+i, i.e. y[i] =df *(y+i)

Syntax-Directed Translation into 3-address code. First deal with assignments. Use attributes E.place to hold the name of the “place” that will hold the value of E Identifier will be assumed to already have the place attribute defined. For example, the place attribute will be of the form t0, t1, t2, … for identifiers and v0,v1,v2 etc. for the rest. E.code to hold the three address code statements that evaluate E (this is the `translation’ attribute). Use function newtemp that returns a new temporary variable that we can use. Use function gen to generate a single three address statement given the necessary information (variable names and operations).

Syntax-Dir. Definition for 3-address code PRODUCTION Semantic Rule S  id := E { S.code = E.code||gen(id.place ‘=’ E.place ‘;’) } E  E1 + E2 {E.place= newtemp ; E.code = E1.code || E2.code || || gen(E.place‘:=’E1.place‘+’E2.place) } E  E1 * E2 {E.place= newtemp ; || gen(E.place‘=’E1.place‘*’E2.place) } E  - E1 {E.place= newtemp ; E.code = E1.code || || gen(E.place ‘=’ ‘uminus’ E1.place) } E  ( E1 ) {E.place= E1.place ; E.code = E1.code} E  id {E.place = id.entry ; E.code = ‘’ } e.g. a := b * - (c+d)

What about things that are not assignments? E.g. while statements of the form “while E do S” (intepreted as while the value of E is not 0 do S) Extension to the previous syntax-dir. Def. PRODUCTION S  while E do S1 Semantic Rule begin = newlabel; after = newlabel ; S.code = gen(begin ‘:’) || E.code || gen(‘if’ E.place ‘=’ ‘0’ ‘goto’ after) || || S1.code || gen(‘goto’ begin) || gen(after ‘:’)

Dealing with Procedures P  procedure ident ‘;’ block ‘;’ Semantic Rule begin = newlabel; Enter into symbol-table in the entry of the procedure name the begin label. P.code = gen(begin ‘:’) || block.code || gen(‘pop’ return_address) || gen(“goto return_address”) S  call ident Look up symbol table to find procedure name. Find its begin label called proc_begin return = newlabel; S.code = gen(‘push’return); gen(goto proc_begin) || gen(return “:”)

Implementations of 3-address statements Quadruples t1:=- c t2:=b * t1 t3:=- c t4:=b * t3 t5:=t2 + t4 a:=t5 op arg1 arg2 result (0) uminus c t1 (1) * b t2 (2) (3) t3 t4 (4) + t5 (5) := a

Implementations of 3-address statements, II Triples t1:=- c t2:=b * t1 t3:=- c t4:=b * t3 t5:=t2 + t4 a:=t5 op arg1 arg2 (0) uminus c (1) * b (2) (3) (4) + (5) assign a

Other types of 3-address statements e.g. ternary operations like x[i]:=y x:=y[i] require two or more entries. e.g. op arg1 arg2 (0) [ ] = x i (1) assign y op arg1 arg2 (0) [ ] = y i (1) assign x

Implementations of 3-address statements, III Indirect Triples op (0) (14) (1) (15) (2) (16) (3) (17) (4) (18) (5) (19) op arg1 arg2 (14) uminus c (15) * b (16) (17) (18) + (19) assign a

Declarations Using a global variable offset PRODUCTION Semantic Rule P  M D { } M   {offset:=0 } D  id : T { addtype(id.entry, T.type, offset) offset:=offset + T.width } T  char {T.type = char; T.width = 1; } T  integer {T.type = integer ; T.width = 4; } T  array [ num ] of T1 {T.type=array(1..num.val,T1.type) T.width = num.val * T1.width} T  ^T1 {T.type = pointer(T1.type); T1.width = 4}

Keeping Track of Scope Information Consider the grammar fraction: P  D D  D ; D | id : T | proc id ; D ; S Each procedure should be allowed to use independent names. Nested procedures are allowed.

functions Mktable(previous) creates a new symbol table and returns a pointer to the new table. previous points to the previously created symbol table. enter(table, name, type, offset) creates a new entry for a name name in the symbol table pointed to by table addwidth(table, witdth) enterproc

Keeping Track of Scope Information (a translation scheme) P  M D { addwidth(top(tblptr), top(offset)); pop(tblptr); pop(offset) } M   { t:=mktable(null); push(t, tblptr); push(0, offset)} D  D1 ; D2 ... D  proc id ; N D ; S { t:=top(tblpr); addwidth(t,top(offset)); pop(tblptr); pop(offset); enterproc(top(tblptr), id.name, t)} N   {t:=mktable(top(tblptr)); push(t,tblptr); push(0,offset);} D  id : T {enter(top(tblptr), id.name, T.type, top(offset); top(offset):=top(offset) + T.width Example: proc func1; D; proc func2 D; S; S