Chapter 6 intermediate code generation

42
Chapter 6 Intermediate Code Generation

description

intermediate code generation

Transcript of Chapter 6 intermediate code generation

Page 1: Chapter 6   intermediate code generation

Chapter 6Intermediate Code Generation

Page 2: Chapter 6   intermediate code generation

OutlineVariants of Syntax TreesThree-address codeTypes and declarationsTranslation of expressionsType checkingControl flowBackpatching

Page 3: Chapter 6   intermediate code generation

IntroductionIntermediate code is the interface between front end

and back end in a compilerIdeally the details of source language are confined to

the front end and the details of target machines to the back end (a m*n model)

In this chapter we study intermediate representations, static type checking and intermediate code generation

Parser StaticChecker

Intermediate Code Generator

Code Generator

Front end Back end

Page 4: Chapter 6   intermediate code generation

Variants of syntax treesIt is sometimes beneficial to crate a DAG instead of

tree for Expressions.This way we can easily show the common sub-

expressions and then use that knowledge during code generation

Example: a+a*(b-c)+(b-c)*d

+

+ *

*

-

b c

a

d

Page 5: Chapter 6   intermediate code generation

SDD for creating DAG’s

1) E -> E1+T2) E -> E1-T3) E -> T4) T -> (E)5) T -> id6) T -> num

Production Semantic Rules

E.node= new Node(‘+’, E1.node,T.node)E.node= new Node(‘-’, E1.node,T.node)E.node = T.nodeT.node = E.nodeT.node = new Leaf(id, id.entry)T.node = new Leaf(num, num.val)

Example:1)p1=Leaf(id, entry-a)2)P2=Leaf(id, entry-a)=p13)p3=Leaf(id, entry-b)4)p4=Leaf(id, entry-c)5)p5=Node(‘-’,p3,p4)6)p6=Node(‘*’,p1,p5)7)p7=Node(‘+’,p1,p6)

8) p8=Leaf(id,entry-b)=p39) p9=Leaf(id,entry-c)=p410) p10=Node(‘-’,p3,p4)=p511) p11=Leaf(id,entry-d)12) p12=Node(‘*’,p5,p11)13) p13=Node(‘+’,p7,p12)

Page 6: Chapter 6   intermediate code generation

Value-number method for constructing DAG’s

AlgorithmSearch the array for a node M with label op, left child l

and right child rIf there is such a node, return the value number MIf not create in the array a new node N with label op,

left child l, and right child r and return its valueWe may use a hash table

=

+

10i

id To entry for inum 10+ 1 23 1 3

Page 7: Chapter 6   intermediate code generation

Three address codeIn a three address code there is at most one operator

at the right side of an instructionExample:

+

+ *

*

-

b c

a

d

t1 = b – ct2 = a * t1t3 = a + t2t4 = t1 * dt5 = t3 + t4

Page 8: Chapter 6   intermediate code generation

Forms of three address instructionsx = y op zx = op yx = ygoto L if x goto L and ifFalse x goto L if x relop y goto LProcedure calls using:

param x call p,n y = call p,n

x = y[i] and x[i] = yx = &y and x = *y and *x =y

Page 9: Chapter 6   intermediate code generation

Exampledo i = i+1; while (a[i] < v);

L: t1 = i + 1i = t1t2 = i * 8t3 = a[t2]if t3 < v goto L

Symbolic labels

100: t1 = i + 1101: i = t1102: t2 = i * 8103: t3 = a[t2]104: if t3 < v goto 100

Position numbers

Page 10: Chapter 6   intermediate code generation

Data structures for three address codesQuadruples

Has four fields: op, arg1, arg2 and resultTriples

Temporaries are not used and instead references to instructions are made

Indirect triplesIn addition to triples we use a list of pointers to triples

Page 11: Chapter 6   intermediate code generation

Exampleb * minus c + b * minus c

t1 = minus ct2 = b * t1t3 = minus ct4 = b * t3t5 = t2 + t4a = t5

Three address code

minus*

minus c t3*+=

c t1b t2t1

b t4t3t2 t5t4t5 a

arg1 resultarg2op

Quadruples

minus*

minus c*+=

cb (0)

b (2)(1) (3)a

arg1 arg2op

Triples

(4)

012345

minus*

minus c*+=

cb (0)

b (2)(1) (3)a

arg1 arg2op

Indirect Triples

(4)

012345

(0)(1)

(2)(3)(4)(5)

op353637383940

Page 12: Chapter 6   intermediate code generation

Type ExpressionsExample: int[2][3]

array(2,array(3,integer))

A basic type is a type expression A type name is a type expression A type expression can be formed by applying the array type

constructor to a number and a type expression. A record is a data structure with named field A type expression can be formed by using the type constructor for

function types If s and t are type expressions, then their Cartesian product s*t is a

type expression Type expressions may contain variables whose values are type

expressions

Page 13: Chapter 6   intermediate code generation

Type Equivalence

They are the same basic type.They are formed by applying the same constructor to

structurally equivalent types.One is a type name that denotes the other.

Page 14: Chapter 6   intermediate code generation

Declarations

Page 15: Chapter 6   intermediate code generation

Storage Layout for Local NamesComputing types and their widths

Page 16: Chapter 6   intermediate code generation

Storage Layout for Local NamesSyntax-directed translation of array types

Page 17: Chapter 6   intermediate code generation

Sequences of Declarations

Actions at the end:

Page 18: Chapter 6   intermediate code generation

Fields in Records and Classes

Page 19: Chapter 6   intermediate code generation

Translation of Expressions and StatementsWe discussed how to find the types and offset of

variablesWe have therefore necessary preparations to discuss

about translation to intermediate codeWe also discuss the type checking

Page 20: Chapter 6   intermediate code generation

Three-address code for expressions

Page 21: Chapter 6   intermediate code generation

Incremental Translation

Page 22: Chapter 6   intermediate code generation

Addressing Array ElementsLayouts for a two-dimensional array:

Page 23: Chapter 6   intermediate code generation

Semantic actions for array reference

Page 24: Chapter 6   intermediate code generation

Translation of Array References

Nonterminal L has three synthesized attributes:

L.addrL.arrayL.type

Page 25: Chapter 6   intermediate code generation

Conversions between primitive types in Java

Page 26: Chapter 6   intermediate code generation

Introducing type conversions into expression evaluation

Page 27: Chapter 6   intermediate code generation

Abstract syntax tree for the function definitionfun length(x) = if null(x) then 0 else length(tl(x)+1)

This is a polymorphic function in ML language

Page 28: Chapter 6   intermediate code generation

Inferring a type for the function length

Page 29: Chapter 6   intermediate code generation

Algorithm for Unification

Page 30: Chapter 6   intermediate code generation

Unification algorithmboolean unify (Node m, Node n) {

s = find(m); t = find(n);if ( s = t ) return true;else if ( nodes s and t represent the same basic type ) return true;else if (s is an op-node with children s1 and s2 and

t is an op-node with children t1 and t2) {union(s , t) ;return unify(s1, t1) and unify(s2, t2);

}else if s or t represents a variable {

union(s, t) ;return true;

}else return false;

}

Page 31: Chapter 6   intermediate code generation

Control Flow

boolean expressions are often used to:Alter the flow of control.Compute logical values.

Page 32: Chapter 6   intermediate code generation

Short-Circuit Code

Page 33: Chapter 6   intermediate code generation

Flow-of-Control Statements

Page 34: Chapter 6   intermediate code generation

Syntax-directed definition

Page 35: Chapter 6   intermediate code generation

Generating three-address code for booleans

Page 36: Chapter 6   intermediate code generation

translation of a simple if-statement

Page 37: Chapter 6   intermediate code generation

BackpatchingPrevious codes for Boolean expressions insert symbolic labels for

jumps It therefore needs a separate pass to set them to appropriate addressesWe can use a technique named backpatching to avoid thisWe assume we save instructions into an array and labels will be

indices in the arrayFor nonterminal B we use two attributes B.truelist and B.falselist

together with following functions: makelist(i): create a new list containing only I, an index into the array

of instructions Merge(p1,p2): concatenates the lists pointed by p1 and p2 and returns a

pointer to the concatenated list Backpatch(p,i): inserts i as the target label for each of the instruction

on the list pointed to by p

Page 38: Chapter 6   intermediate code generation

Backpatching for Boolean Expressions

Page 39: Chapter 6   intermediate code generation

Backpatching for Boolean ExpressionsAnnotated parse tree for x < 100 || x > 200 && x ! = y

Page 40: Chapter 6   intermediate code generation

Flow-of-Control Statements

Page 41: Chapter 6   intermediate code generation

Translation of a switch-statement

Page 42: Chapter 6   intermediate code generation

ReadingsChapter 6 of the book