Download - Chapter 6 intermediate code generation
![Page 1: Chapter 6 intermediate code generation](https://reader033.vdocuments.mx/reader033/viewer/2022052206/559e3c5f1a28ab3e1a8b458e/html5/thumbnails/1.jpg)
Chapter 6Intermediate Code Generation
![Page 2: Chapter 6 intermediate code generation](https://reader033.vdocuments.mx/reader033/viewer/2022052206/559e3c5f1a28ab3e1a8b458e/html5/thumbnails/2.jpg)
OutlineVariants of Syntax TreesThree-address codeTypes and declarationsTranslation of expressionsType checkingControl flowBackpatching
![Page 3: Chapter 6 intermediate code generation](https://reader033.vdocuments.mx/reader033/viewer/2022052206/559e3c5f1a28ab3e1a8b458e/html5/thumbnails/3.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022052206/559e3c5f1a28ab3e1a8b458e/html5/thumbnails/4.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022052206/559e3c5f1a28ab3e1a8b458e/html5/thumbnails/5.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022052206/559e3c5f1a28ab3e1a8b458e/html5/thumbnails/6.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022052206/559e3c5f1a28ab3e1a8b458e/html5/thumbnails/7.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022052206/559e3c5f1a28ab3e1a8b458e/html5/thumbnails/8.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022052206/559e3c5f1a28ab3e1a8b458e/html5/thumbnails/9.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022052206/559e3c5f1a28ab3e1a8b458e/html5/thumbnails/10.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022052206/559e3c5f1a28ab3e1a8b458e/html5/thumbnails/11.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022052206/559e3c5f1a28ab3e1a8b458e/html5/thumbnails/12.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022052206/559e3c5f1a28ab3e1a8b458e/html5/thumbnails/13.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022052206/559e3c5f1a28ab3e1a8b458e/html5/thumbnails/14.jpg)
Declarations
![Page 15: Chapter 6 intermediate code generation](https://reader033.vdocuments.mx/reader033/viewer/2022052206/559e3c5f1a28ab3e1a8b458e/html5/thumbnails/15.jpg)
Storage Layout for Local NamesComputing types and their widths
![Page 16: Chapter 6 intermediate code generation](https://reader033.vdocuments.mx/reader033/viewer/2022052206/559e3c5f1a28ab3e1a8b458e/html5/thumbnails/16.jpg)
Storage Layout for Local NamesSyntax-directed translation of array types
![Page 17: Chapter 6 intermediate code generation](https://reader033.vdocuments.mx/reader033/viewer/2022052206/559e3c5f1a28ab3e1a8b458e/html5/thumbnails/17.jpg)
Sequences of Declarations
Actions at the end:
![Page 18: Chapter 6 intermediate code generation](https://reader033.vdocuments.mx/reader033/viewer/2022052206/559e3c5f1a28ab3e1a8b458e/html5/thumbnails/18.jpg)
Fields in Records and Classes
![Page 19: Chapter 6 intermediate code generation](https://reader033.vdocuments.mx/reader033/viewer/2022052206/559e3c5f1a28ab3e1a8b458e/html5/thumbnails/19.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022052206/559e3c5f1a28ab3e1a8b458e/html5/thumbnails/20.jpg)
Three-address code for expressions
![Page 21: Chapter 6 intermediate code generation](https://reader033.vdocuments.mx/reader033/viewer/2022052206/559e3c5f1a28ab3e1a8b458e/html5/thumbnails/21.jpg)
Incremental Translation
![Page 22: Chapter 6 intermediate code generation](https://reader033.vdocuments.mx/reader033/viewer/2022052206/559e3c5f1a28ab3e1a8b458e/html5/thumbnails/22.jpg)
Addressing Array ElementsLayouts for a two-dimensional array:
![Page 23: Chapter 6 intermediate code generation](https://reader033.vdocuments.mx/reader033/viewer/2022052206/559e3c5f1a28ab3e1a8b458e/html5/thumbnails/23.jpg)
Semantic actions for array reference
![Page 24: Chapter 6 intermediate code generation](https://reader033.vdocuments.mx/reader033/viewer/2022052206/559e3c5f1a28ab3e1a8b458e/html5/thumbnails/24.jpg)
Translation of Array References
Nonterminal L has three synthesized attributes:
L.addrL.arrayL.type
![Page 25: Chapter 6 intermediate code generation](https://reader033.vdocuments.mx/reader033/viewer/2022052206/559e3c5f1a28ab3e1a8b458e/html5/thumbnails/25.jpg)
Conversions between primitive types in Java
![Page 26: Chapter 6 intermediate code generation](https://reader033.vdocuments.mx/reader033/viewer/2022052206/559e3c5f1a28ab3e1a8b458e/html5/thumbnails/26.jpg)
Introducing type conversions into expression evaluation
![Page 27: Chapter 6 intermediate code generation](https://reader033.vdocuments.mx/reader033/viewer/2022052206/559e3c5f1a28ab3e1a8b458e/html5/thumbnails/27.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022052206/559e3c5f1a28ab3e1a8b458e/html5/thumbnails/28.jpg)
Inferring a type for the function length
![Page 29: Chapter 6 intermediate code generation](https://reader033.vdocuments.mx/reader033/viewer/2022052206/559e3c5f1a28ab3e1a8b458e/html5/thumbnails/29.jpg)
Algorithm for Unification
![Page 30: Chapter 6 intermediate code generation](https://reader033.vdocuments.mx/reader033/viewer/2022052206/559e3c5f1a28ab3e1a8b458e/html5/thumbnails/30.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022052206/559e3c5f1a28ab3e1a8b458e/html5/thumbnails/31.jpg)
Control Flow
boolean expressions are often used to:Alter the flow of control.Compute logical values.
![Page 32: Chapter 6 intermediate code generation](https://reader033.vdocuments.mx/reader033/viewer/2022052206/559e3c5f1a28ab3e1a8b458e/html5/thumbnails/32.jpg)
Short-Circuit Code
![Page 33: Chapter 6 intermediate code generation](https://reader033.vdocuments.mx/reader033/viewer/2022052206/559e3c5f1a28ab3e1a8b458e/html5/thumbnails/33.jpg)
Flow-of-Control Statements
![Page 34: Chapter 6 intermediate code generation](https://reader033.vdocuments.mx/reader033/viewer/2022052206/559e3c5f1a28ab3e1a8b458e/html5/thumbnails/34.jpg)
Syntax-directed definition
![Page 35: Chapter 6 intermediate code generation](https://reader033.vdocuments.mx/reader033/viewer/2022052206/559e3c5f1a28ab3e1a8b458e/html5/thumbnails/35.jpg)
Generating three-address code for booleans
![Page 36: Chapter 6 intermediate code generation](https://reader033.vdocuments.mx/reader033/viewer/2022052206/559e3c5f1a28ab3e1a8b458e/html5/thumbnails/36.jpg)
translation of a simple if-statement
![Page 37: Chapter 6 intermediate code generation](https://reader033.vdocuments.mx/reader033/viewer/2022052206/559e3c5f1a28ab3e1a8b458e/html5/thumbnails/37.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022052206/559e3c5f1a28ab3e1a8b458e/html5/thumbnails/38.jpg)
Backpatching for Boolean Expressions
![Page 39: Chapter 6 intermediate code generation](https://reader033.vdocuments.mx/reader033/viewer/2022052206/559e3c5f1a28ab3e1a8b458e/html5/thumbnails/39.jpg)
Backpatching for Boolean ExpressionsAnnotated parse tree for x < 100 || x > 200 && x ! = y
![Page 40: Chapter 6 intermediate code generation](https://reader033.vdocuments.mx/reader033/viewer/2022052206/559e3c5f1a28ab3e1a8b458e/html5/thumbnails/40.jpg)
Flow-of-Control Statements
![Page 41: Chapter 6 intermediate code generation](https://reader033.vdocuments.mx/reader033/viewer/2022052206/559e3c5f1a28ab3e1a8b458e/html5/thumbnails/41.jpg)
Translation of a switch-statement
![Page 42: Chapter 6 intermediate code generation](https://reader033.vdocuments.mx/reader033/viewer/2022052206/559e3c5f1a28ab3e1a8b458e/html5/thumbnails/42.jpg)
ReadingsChapter 6 of the book