intermediate code generationmgv/csce531sp21/notes/4-interm-codegen.pdfintermediate code generation...
TRANSCRIPT
![Page 1: Intermediate Code Generationmgv/csce531sp21/notes/4-interm-codegen.pdfIntermediate Code Generation Cosmin E. Oancea cosmin.oancea@diku.dk Modi ed by Marco Valtorta for CSCE 531 at](https://reader035.vdocuments.site/reader035/viewer/2022071511/612fbaec1ecc51586943a351/html5/thumbnails/1.jpg)
Intermediate Code Generation
Cosmin E. [email protected]
Modified by Marco Valtorta for CSCE 531 at UofSCBased on Jost Berthold’s slides and Torben Mogensen’s bookDepartment of Computer ScienceUniversity of Copenhagen
March 2021, modified from 2018 IPS Lecture Slides
![Page 2: Intermediate Code Generationmgv/csce531sp21/notes/4-interm-codegen.pdfIntermediate Code Generation Cosmin E. Oancea cosmin.oancea@diku.dk Modi ed by Marco Valtorta for CSCE 531 at](https://reader035.vdocuments.site/reader035/viewer/2022071511/612fbaec1ecc51586943a351/html5/thumbnails/2.jpg)
University of Copenhagen Department of Computer Science
Structure of a CompilerProgram text
↓Lexical analysis Binary machine code
↓ ↑Symbol sequence Assembly and linking
↓ ↑Syntax analysis Ditto with named registers
↓ ↑Syntax tree Register allocation
↓ ↑Typecheck Symbolic machine code
↓ ↑Syntax tree Machine code generation
↓ ↑Intermediate code generation −→ Intermediate code
2 / 38
![Page 3: Intermediate Code Generationmgv/csce531sp21/notes/4-interm-codegen.pdfIntermediate Code Generation Cosmin E. Oancea cosmin.oancea@diku.dk Modi ed by Marco Valtorta for CSCE 531 at](https://reader035.vdocuments.site/reader035/viewer/2022071511/612fbaec1ecc51586943a351/html5/thumbnails/3.jpg)
University of Copenhagen Department of Computer Science
1 Why Intermediate Code?Intermediate LanguageTo-Be-Translated Language
2 Syntax-Directed TranslationArithmetic ExpressionsStatementsBoolean Expressions, Sequential Evaluation
3 Translating More Complex StructuresMore Control StructuresArrays and Other Structured DataRole of Declarations in the Translation
3 / 38
![Page 4: Intermediate Code Generationmgv/csce531sp21/notes/4-interm-codegen.pdfIntermediate Code Generation Cosmin E. Oancea cosmin.oancea@diku.dk Modi ed by Marco Valtorta for CSCE 531 at](https://reader035.vdocuments.site/reader035/viewer/2022071511/612fbaec1ecc51586943a351/html5/thumbnails/4.jpg)
University of Copenhagen Department of Computer Science
Why Intermediate Language (IL)?Compilers for different platforms and languages can share parts.
C++
Pascal
Fortran
�����*-
HHHHHj Intermed.Lang �
����*
-HHHHHj X86
X86 64
ARM
�
Without IL: how many translators do I need to write to map n
languages to m different hardware?
Answer: n*m instead of n+m!
Machine-independent optimizations are possible.
Also enables interpretation ...
4 / 38
![Page 5: Intermediate Code Generationmgv/csce531sp21/notes/4-interm-codegen.pdfIntermediate Code Generation Cosmin E. Oancea cosmin.oancea@diku.dk Modi ed by Marco Valtorta for CSCE 531 at](https://reader035.vdocuments.site/reader035/viewer/2022071511/612fbaec1ecc51586943a351/html5/thumbnails/5.jpg)
University of Copenhagen Department of Computer Science
Why Intermediate Language (IL)?Compilers for different platforms and languages can share parts.
C++
Pascal
Fortran
�����*-
HHHHHj Intermed.Lang �
����*
-HHHHHj X86
X86 64
ARM
�
Without IL: how many translators do I need to write to map n
languages to m different hardware?Answer: n*m instead of n+m!
Machine-independent optimizations are possible.
Also enables interpretation ...
4 / 38
![Page 6: Intermediate Code Generationmgv/csce531sp21/notes/4-interm-codegen.pdfIntermediate Code Generation Cosmin E. Oancea cosmin.oancea@diku.dk Modi ed by Marco Valtorta for CSCE 531 at](https://reader035.vdocuments.site/reader035/viewer/2022071511/612fbaec1ecc51586943a351/html5/thumbnails/6.jpg)
University of Copenhagen Department of Computer Science
Intermediate Language (IL)Machine Independent: unlimited number of registers andmemory space, no machine-specific instructions.
Mid-level(s) between source and machine languages (tradeoff):simpler constructs, easier to generate machine code.
What features/constructs should IL support?
every translation loses information ⇒use the information before losing it!
typically a chain of ILs moving from higher towards lower level.
How complex should IL’s instruction be?
complex: good for interpretation (amortizes instruction-decodingoverhead),
simple: can more easily generate optimal machine code.
5 / 38
![Page 7: Intermediate Code Generationmgv/csce531sp21/notes/4-interm-codegen.pdfIntermediate Code Generation Cosmin E. Oancea cosmin.oancea@diku.dk Modi ed by Marco Valtorta for CSCE 531 at](https://reader035.vdocuments.site/reader035/viewer/2022071511/612fbaec1ecc51586943a351/html5/thumbnails/7.jpg)
University of Copenhagen Department of Computer Science
Intermediate Language (IL)
Here: Low-level language,but keeping functions(procedures).Small instructions:
3-address code: oneoperation per expression
Memory read/write (M)(address is atom).
Jump labels, GOTO andconditional jump (IF).
Function calls andreturns
Prg → FctsFcts → Fct Fcts | FctFct → Hdr BdHdr → functionid(Args)Bd → [ Instrs ]
Instrs → Instr , Instrs | InstrInstr → id := Atom | id := unop Atom
| id := id binop Atom| id := M[Atom] | M[Atom] := id| LABEL label | GOTO label| IF id relop Atom
THEN label ELSE label| id := CALL functionid(Args)| RETURN id
Atom → id | num
Args → id , Args | id
6 / 38
![Page 8: Intermediate Code Generationmgv/csce531sp21/notes/4-interm-codegen.pdfIntermediate Code Generation Cosmin E. Oancea cosmin.oancea@diku.dk Modi ed by Marco Valtorta for CSCE 531 at](https://reader035.vdocuments.site/reader035/viewer/2022071511/612fbaec1ecc51586943a351/html5/thumbnails/8.jpg)
University of Copenhagen Department of Computer Science
Intermediate Language (IL)
Here: Low-level language,but keeping functions(procedures).Small instructions:
3-address code: oneoperation per expression
Memory read/write (M)(address is atom).
Jump labels, GOTO andconditional jump (IF).
Function calls andreturns
Prg → FctsFcts → Fct Fcts | FctFct → Hdr BdHdr → functionid(Args)Bd → [ Instrs ]
Instrs → Instr , Instrs | InstrInstr → id := Atom | id := unop Atom
| id := id binop Atom
| id := M[Atom] | M[Atom] := id| LABEL label | GOTO label| IF id relop Atom
THEN label ELSE label| id := CALL functionid(Args)| RETURN id
Atom → id | num
Args → id , Args | id
6 / 38
![Page 9: Intermediate Code Generationmgv/csce531sp21/notes/4-interm-codegen.pdfIntermediate Code Generation Cosmin E. Oancea cosmin.oancea@diku.dk Modi ed by Marco Valtorta for CSCE 531 at](https://reader035.vdocuments.site/reader035/viewer/2022071511/612fbaec1ecc51586943a351/html5/thumbnails/9.jpg)
University of Copenhagen Department of Computer Science
Intermediate Language (IL)
Here: Low-level language,but keeping functions(procedures).Small instructions:
3-address code: oneoperation per expression
Memory read/write (M)(address is atom).
Jump labels, GOTO andconditional jump (IF).
Function calls andreturns
Prg → FctsFcts → Fct Fcts | FctFct → Hdr BdHdr → functionid(Args)Bd → [ Instrs ]
Instrs → Instr , Instrs | InstrInstr → id := Atom | id := unop Atom
| id := id binop Atom| id := M[Atom] | M[Atom] := id
| LABEL label | GOTO label| IF id relop Atom
THEN label ELSE label| id := CALL functionid(Args)| RETURN id
Atom → id | num
Args → id , Args | id
6 / 38
![Page 10: Intermediate Code Generationmgv/csce531sp21/notes/4-interm-codegen.pdfIntermediate Code Generation Cosmin E. Oancea cosmin.oancea@diku.dk Modi ed by Marco Valtorta for CSCE 531 at](https://reader035.vdocuments.site/reader035/viewer/2022071511/612fbaec1ecc51586943a351/html5/thumbnails/10.jpg)
University of Copenhagen Department of Computer Science
Intermediate Language (IL)
Here: Low-level language,but keeping functions(procedures).Small instructions:
3-address code: oneoperation per expression
Memory read/write (M)(address is atom).
Jump labels, GOTO andconditional jump (IF).
Function calls andreturns
Prg → FctsFcts → Fct Fcts | FctFct → Hdr BdHdr → functionid(Args)Bd → [ Instrs ]
Instrs → Instr , Instrs | InstrInstr → id := Atom | id := unop Atom
| id := id binop Atom| id := M[Atom] | M[Atom] := id| LABEL label | GOTO label| IF id relop Atom
THEN label ELSE label
| id := CALL functionid(Args)| RETURN id
Atom → id | num
Args → id , Args | id
6 / 38
![Page 11: Intermediate Code Generationmgv/csce531sp21/notes/4-interm-codegen.pdfIntermediate Code Generation Cosmin E. Oancea cosmin.oancea@diku.dk Modi ed by Marco Valtorta for CSCE 531 at](https://reader035.vdocuments.site/reader035/viewer/2022071511/612fbaec1ecc51586943a351/html5/thumbnails/11.jpg)
University of Copenhagen Department of Computer Science
Intermediate Language (IL)
Here: Low-level language,but keeping functions(procedures).Small instructions:
3-address code: oneoperation per expression
Memory read/write (M)(address is atom).
Jump labels, GOTO andconditional jump (IF).
Function calls andreturns
Prg → FctsFcts → Fct Fcts | FctFct → Hdr BdHdr → functionid(Args)Bd → [ Instrs ]
Instrs → Instr , Instrs | InstrInstr → id := Atom | id := unop Atom
| id := id binop Atom| id := M[Atom] | M[Atom] := id| LABEL label | GOTO label| IF id relop Atom
THEN label ELSE label| id := CALL functionid(Args)| RETURN id
Atom → id | numArgs → id , Args | id
6 / 38
![Page 12: Intermediate Code Generationmgv/csce531sp21/notes/4-interm-codegen.pdfIntermediate Code Generation Cosmin E. Oancea cosmin.oancea@diku.dk Modi ed by Marco Valtorta for CSCE 531 at](https://reader035.vdocuments.site/reader035/viewer/2022071511/612fbaec1ecc51586943a351/html5/thumbnails/12.jpg)
University of Copenhagen Department of Computer Science
The To-Be-Translated Language
We shall translate a simple procedural language:
Arithmetic expressions and function calls, boolean expressions,
conditional branching (if),
two loops constructs (while and repeat until).
Syntax-directed translation:
In practice we work on the abstract syntax tree AbSyn(but here we use a generic grammar notation),
Implement each syntactic category via a translation function:Arithmetic expressions, Boolean expressions, Statements.
Code for subtrees is generated independent of context,(i.e., context is a parameter to the translation function and/or avalue returned by the translation function)
7 / 38
![Page 13: Intermediate Code Generationmgv/csce531sp21/notes/4-interm-codegen.pdfIntermediate Code Generation Cosmin E. Oancea cosmin.oancea@diku.dk Modi ed by Marco Valtorta for CSCE 531 at](https://reader035.vdocuments.site/reader035/viewer/2022071511/612fbaec1ecc51586943a351/html5/thumbnails/13.jpg)
University of Copenhagen Department of Computer Science
1 Why Intermediate Code?Intermediate LanguageTo-Be-Translated Language
2 Syntax-Directed TranslationArithmetic ExpressionsStatementsBoolean Expressions, Sequential Evaluation
3 Translating More Complex StructuresMore Control StructuresArrays and Other Structured DataRole of Declarations in the Translation
8 / 38
![Page 14: Intermediate Code Generationmgv/csce531sp21/notes/4-interm-codegen.pdfIntermediate Code Generation Cosmin E. Oancea cosmin.oancea@diku.dk Modi ed by Marco Valtorta for CSCE 531 at](https://reader035.vdocuments.site/reader035/viewer/2022071511/612fbaec1ecc51586943a351/html5/thumbnails/14.jpg)
University of Copenhagen Department of Computer Science
Translating Arithmetic Expressions
Expressions in Source Language
Variables and number literals,
unary and binary operations,
function calls (with argument list).
Exp → num | id| unop Exp| Exp binop Exp| id(Exps)
Exps → Exp | Exp , Exps
Translation function:
TransExp :: (Exp, VTable, FTable, Location) -> [ICode]
Returns a list of intermediate code instructions [ICode] that . . .
. . . upon execution, computes Exp’s result in variable Location.
Case analysis on Exp’s abstract syntax tree AbSyn.
9 / 38
![Page 15: Intermediate Code Generationmgv/csce531sp21/notes/4-interm-codegen.pdfIntermediate Code Generation Cosmin E. Oancea cosmin.oancea@diku.dk Modi ed by Marco Valtorta for CSCE 531 at](https://reader035.vdocuments.site/reader035/viewer/2022071511/612fbaec1ecc51586943a351/html5/thumbnails/15.jpg)
University of Copenhagen Department of Computer Science
Translating Arithmetic Expressions
Expressions in Source Language
Variables and number literals,
unary and binary operations,
function calls (with argument list).
Exp → num | id| unop Exp| Exp binop Exp| id(Exps)
Exps → Exp | Exp , Exps
Translation function:
TransExp :: (Exp, VTable, FTable, Location) -> [ICode]
Returns a list of intermediate code instructions [ICode] that . . .
. . . upon execution, computes Exp’s result in variable Location.
Case analysis on Exp’s abstract syntax tree AbSyn.
9 / 38
![Page 16: Intermediate Code Generationmgv/csce531sp21/notes/4-interm-codegen.pdfIntermediate Code Generation Cosmin E. Oancea cosmin.oancea@diku.dk Modi ed by Marco Valtorta for CSCE 531 at](https://reader035.vdocuments.site/reader035/viewer/2022071511/612fbaec1ecc51586943a351/html5/thumbnails/16.jpg)
University of Copenhagen Department of Computer Science
Symbol Tables and Helper Functions
Translation function:TransExp :: (Exp, VTable, FTable, Location) -> [ICode]
Symbol Tables
vtable : maps a variable name in source lang to itscorresponding (translation) IL variable name.
ftable : function names to function labels (for call)
Helper Functions
lookup: retrieve entry from a symbol table
getvalue: retrieve value of source language literal
getname: retrieve name of source language variable/operation
newvar: make new intermediate code variable
newlabel: make new label (for jumps in intermediate code)
trans op: translates an operator name to the name in IL.
10 / 38
![Page 17: Intermediate Code Generationmgv/csce531sp21/notes/4-interm-codegen.pdfIntermediate Code Generation Cosmin E. Oancea cosmin.oancea@diku.dk Modi ed by Marco Valtorta for CSCE 531 at](https://reader035.vdocuments.site/reader035/viewer/2022071511/612fbaec1ecc51586943a351/html5/thumbnails/17.jpg)
University of Copenhagen Department of Computer Science
Generating Code for an ExpressionTransExp : (Exp, VTable, FTable, Location) -> [ICode]
TransExp (exp, vtable, ftable, place) = case exp of
num v = getvalue(num)[place := v ]
id x = lookup(vtable, getname(id))[place := x ]
unop Exp1 place1 = newvar()code1 = TransExp(Exp1, vtable, ftable, place1)op = trans op(getname(unop))code1 ++ [place := op place1]
Exp1 binop Exp2 place1 = newvar()place2 = newvar()code1 = TransExp(Exp1, vtable, ftable, place1)code2 = TransExp(Exp2, vtable, ftable, place2)op = trans op(getname(binop))code1 ++ code2 ++ [place := place1 op place2]
11 / 38
![Page 18: Intermediate Code Generationmgv/csce531sp21/notes/4-interm-codegen.pdfIntermediate Code Generation Cosmin E. Oancea cosmin.oancea@diku.dk Modi ed by Marco Valtorta for CSCE 531 at](https://reader035.vdocuments.site/reader035/viewer/2022071511/612fbaec1ecc51586943a351/html5/thumbnails/18.jpg)
University of Copenhagen Department of Computer Science
Generating Code for a Function CallTransExp (exp, vtable, ftable, place) = case exp of
id(Exps) (code1, [a1, . . . , an]) = TransExps(Exps, vtable, ftable)fname = lookup(ftable, getname(id))code1 ++ [place := CALL fname(a1, . . . , an)]
TransExps returns the code that evaluates the function’s parameters,and the list of new-intermediate variables (that store the result).
TransExps : (Exps, VTable, FTable) -> ([ICode], [Location])
TransExps(exps, vtable, ftable) = case exps of
Exp place = newvar()code1 = TransExp(Exp, vtable, ftable, place)(code1, [place])
Exp , Exps place = newvar()code1 = TransExp(Exp, vtable, ftable, place)(code2, args) = TransExps(Exps, vtable, ftable)code3 = code1 ++ code2
args1 = place :: args(code3, args1)
12 / 38
![Page 19: Intermediate Code Generationmgv/csce531sp21/notes/4-interm-codegen.pdfIntermediate Code Generation Cosmin E. Oancea cosmin.oancea@diku.dk Modi ed by Marco Valtorta for CSCE 531 at](https://reader035.vdocuments.site/reader035/viewer/2022071511/612fbaec1ecc51586943a351/html5/thumbnails/19.jpg)
University of Copenhagen Department of Computer Science
Translation Example
Assume the following symbol tables:
vtable = [x 7→ v0, y 7→ v1, z 7→ v2]
ftable = [f 7→ F 1, + 7→ +, - 7→ -]
Translation of Exp with place = t0:
Exp=x-3
t1 := v0t2 := 3t0 := t1− t2
Exp=3+f(x-y,z)
t1 := 3t4 := v0t5 := v1
t3 := t4− t5t6 := v2
t2 := CALL F 1(t3, t6)t0 := t1 + t2
13 / 38
![Page 20: Intermediate Code Generationmgv/csce531sp21/notes/4-interm-codegen.pdfIntermediate Code Generation Cosmin E. Oancea cosmin.oancea@diku.dk Modi ed by Marco Valtorta for CSCE 531 at](https://reader035.vdocuments.site/reader035/viewer/2022071511/612fbaec1ecc51586943a351/html5/thumbnails/20.jpg)
University of Copenhagen Department of Computer Science
Translation Example
Assume the following symbol tables:
vtable = [x 7→ v0, y 7→ v1, z 7→ v2]
ftable = [f 7→ F 1, + 7→ +, - 7→ -]
Translation of Exp with place = t0:
Exp=x-3t1 := v0t2 := 3t0 := t1− t2
Exp=3+f(x-y,z)
t1 := 3t4 := v0t5 := v1
t3 := t4− t5t6 := v2
t2 := CALL F 1(t3, t6)t0 := t1 + t2
13 / 38
![Page 21: Intermediate Code Generationmgv/csce531sp21/notes/4-interm-codegen.pdfIntermediate Code Generation Cosmin E. Oancea cosmin.oancea@diku.dk Modi ed by Marco Valtorta for CSCE 531 at](https://reader035.vdocuments.site/reader035/viewer/2022071511/612fbaec1ecc51586943a351/html5/thumbnails/21.jpg)
University of Copenhagen Department of Computer Science
Translation Example
Assume the following symbol tables:
vtable = [x 7→ v0, y 7→ v1, z 7→ v2]
ftable = [f 7→ F 1, + 7→ +, - 7→ -]
Translation of Exp with place = t0:
Exp=x-3t1 := v0t2 := 3t0 := t1− t2
Exp=3+f(x-y,z)
t1 := 3t4 := v0t5 := v1
t3 := t4− t5t6 := v2
t2 := CALL F 1(t3, t6)t0 := t1 + t2
13 / 38
![Page 22: Intermediate Code Generationmgv/csce531sp21/notes/4-interm-codegen.pdfIntermediate Code Generation Cosmin E. Oancea cosmin.oancea@diku.dk Modi ed by Marco Valtorta for CSCE 531 at](https://reader035.vdocuments.site/reader035/viewer/2022071511/612fbaec1ecc51586943a351/html5/thumbnails/22.jpg)
University of Copenhagen Department of Computer Science
Translation Example
Assume the following symbol tables:
vtable = [x 7→ v0, y 7→ v1, z 7→ v2]
ftable = [f 7→ F 1, + 7→ +, - 7→ -]
Translation of Exp with place = t0:
Exp=x-3t1 := v0t2 := 3t0 := t1− t2
Exp=3+f(x-y,z)
t1 := 3t4 := v0t5 := v1
t3 := t4− t5t6 := v2
t2 := CALL F 1(t3, t6)t0 := t1 + t2
13 / 38
![Page 23: Intermediate Code Generationmgv/csce531sp21/notes/4-interm-codegen.pdfIntermediate Code Generation Cosmin E. Oancea cosmin.oancea@diku.dk Modi ed by Marco Valtorta for CSCE 531 at](https://reader035.vdocuments.site/reader035/viewer/2022071511/612fbaec1ecc51586943a351/html5/thumbnails/23.jpg)
University of Copenhagen Department of Computer Science
1 Why Intermediate Code?Intermediate LanguageTo-Be-Translated Language
2 Syntax-Directed TranslationArithmetic ExpressionsStatementsBoolean Expressions, Sequential Evaluation
3 Translating More Complex StructuresMore Control StructuresArrays and Other Structured DataRole of Declarations in the Translation
14 / 38
![Page 24: Intermediate Code Generationmgv/csce531sp21/notes/4-interm-codegen.pdfIntermediate Code Generation Cosmin E. Oancea cosmin.oancea@diku.dk Modi ed by Marco Valtorta for CSCE 531 at](https://reader035.vdocuments.site/reader035/viewer/2022071511/612fbaec1ecc51586943a351/html5/thumbnails/24.jpg)
University of Copenhagen Department of Computer Science
Translating Statements
Statements in SourceLanguage
Sequence of statements
Assignment
Conditional Branching
Loops: while and repeat
(simple conditions fornow)
Stat → Stat ; Stat| id := Exp| if Cond then { Stat }| if Cond then { Stat } else { Stat }| while Cond do { Stat }| repeat { Stat } until Cond
Cond → Exp relop Exp
We assume relational operators translate directly (using trans op).
Translation function:
TransStat :: (Stat, VTable, FTable) -> [ICode]
As before: syntax-directed, case analysis on Stat
Intermediate code instructions for statements
15 / 38
![Page 25: Intermediate Code Generationmgv/csce531sp21/notes/4-interm-codegen.pdfIntermediate Code Generation Cosmin E. Oancea cosmin.oancea@diku.dk Modi ed by Marco Valtorta for CSCE 531 at](https://reader035.vdocuments.site/reader035/viewer/2022071511/612fbaec1ecc51586943a351/html5/thumbnails/25.jpg)
University of Copenhagen Department of Computer Science
Translating Statements
Statements in SourceLanguage
Sequence of statements
Assignment
Conditional Branching
Loops: while and repeat
(simple conditions fornow)
Stat → Stat ; Stat| id := Exp| if Cond then { Stat }| if Cond then { Stat } else { Stat }| while Cond do { Stat }| repeat { Stat } until Cond
Cond → Exp relop Exp
We assume relational operators translate directly (using trans op).
Translation function:
TransStat :: (Stat, VTable, FTable) -> [ICode]
As before: syntax-directed, case analysis on Stat
Intermediate code instructions for statements
15 / 38
![Page 26: Intermediate Code Generationmgv/csce531sp21/notes/4-interm-codegen.pdfIntermediate Code Generation Cosmin E. Oancea cosmin.oancea@diku.dk Modi ed by Marco Valtorta for CSCE 531 at](https://reader035.vdocuments.site/reader035/viewer/2022071511/612fbaec1ecc51586943a351/html5/thumbnails/26.jpg)
University of Copenhagen Department of Computer Science
Generating Code for Sequences, Assignments,. . .
TransStat : (Stat, Vtable, Ftable) -> [ICode]
TransStat(stat, vtable, ftable) = case stat of
Stat1 ; Stat2 code1 = TransStat(Stat1, vtable, ftable)code2 = TransStat(Stat2, vtable, ftable)code1 ++ code2
id := Exp place = lookup(vtable, getname(id))TransExp(Exp, vtable, ftable, place)
. . . (rest coming soon)
Sequence of statements, sequence of code.
Symbol tables are inherited attributes.
16 / 38
![Page 27: Intermediate Code Generationmgv/csce531sp21/notes/4-interm-codegen.pdfIntermediate Code Generation Cosmin E. Oancea cosmin.oancea@diku.dk Modi ed by Marco Valtorta for CSCE 531 at](https://reader035.vdocuments.site/reader035/viewer/2022071511/612fbaec1ecc51586943a351/html5/thumbnails/27.jpg)
University of Copenhagen Department of Computer Science
Generating Code for Conditional Jumps: Helper
Helper function for loops and branches
Evaluates Cond, i.e., a boolean expression,then jumps to one of two labels, depending on result
TransCond : (Cond, Label, Label, Vtable, Ftable) -> [ICode]TransCond(cond , labelt , labelf , vtable, ftable) = case cond of
Exp1 relop Exp2 t1 = newvar()t2 = newvar()code1 = TransExp(Exp1, vtable, ftable, t1)code2 = TransExp(Exp2, vtable, ftable, t2)op = trans op(getname(relop))code1 ++ code2 ++ [IF t1 op t2 THEN labelt ELSE labelf ]
Uses the IF of the intermediate language
Expressions need to be evaluated before(restricted IF: only variables and atoms can be used)
17 / 38
![Page 28: Intermediate Code Generationmgv/csce531sp21/notes/4-interm-codegen.pdfIntermediate Code Generation Cosmin E. Oancea cosmin.oancea@diku.dk Modi ed by Marco Valtorta for CSCE 531 at](https://reader035.vdocuments.site/reader035/viewer/2022071511/612fbaec1ecc51586943a351/html5/thumbnails/28.jpg)
University of Copenhagen Department of Computer Science
Generating Code for If-Statements
Generate new labels for branches and following code
Translate If statement to a conditional jump
TransStat(stat, vtable, ftable) = case stat ofif Cond labelt = newlabel()then Stat1 labelf = newlabel()
codec = TransCond(Cond , labelt , labelf , vtable, ftable)codes = TransStat(Stat1, vtable, ftable)codec ++ [LABEL labelt ] ++ codes ++ [LABEL labelf ]
if Cond labelt = newlabel()then Stat1 labelf = newlabel()else Stat2 labele = newlabel()
codec = TransCond(Cond , labelt , labelf , vtable, ftable)code1 = TransStat(Stat1, vtable, ftable)code2 = TransStat(Stat2, vtable, ftable)codec ++ [LABEL labelt ] ++ code1 ++ [GOTO labele ]
++ [LABEL labelf ] ++ code2 ++ [LABEL labele ]
18 / 38
![Page 29: Intermediate Code Generationmgv/csce531sp21/notes/4-interm-codegen.pdfIntermediate Code Generation Cosmin E. Oancea cosmin.oancea@diku.dk Modi ed by Marco Valtorta for CSCE 531 at](https://reader035.vdocuments.site/reader035/viewer/2022071511/612fbaec1ecc51586943a351/html5/thumbnails/29.jpg)
University of Copenhagen Department of Computer Science
Generating Code for If-Statements
Generate new labels for branches and following code
Translate If statement to a conditional jump
TransStat(stat, vtable, ftable) = case stat ofif Cond labelt = newlabel()then Stat1 labelf = newlabel()
codec = TransCond(Cond , labelt , labelf , vtable, ftable)codes = TransStat(Stat1, vtable, ftable)codec ++ [LABEL labelt ] ++ codes ++ [LABEL labelf ]
if Cond labelt = newlabel()then Stat1 labelf = newlabel()else Stat2 labele = newlabel()
codec = TransCond(Cond , labelt , labelf , vtable, ftable)code1 = TransStat(Stat1, vtable, ftable)code2 = TransStat(Stat2, vtable, ftable)codec ++ [LABEL labelt ] ++ code1 ++ [GOTO labele ]
++ [LABEL labelf ] ++ code2 ++ [LABEL labele ]
18 / 38
![Page 30: Intermediate Code Generationmgv/csce531sp21/notes/4-interm-codegen.pdfIntermediate Code Generation Cosmin E. Oancea cosmin.oancea@diku.dk Modi ed by Marco Valtorta for CSCE 531 at](https://reader035.vdocuments.site/reader035/viewer/2022071511/612fbaec1ecc51586943a351/html5/thumbnails/30.jpg)
University of Copenhagen Department of Computer Science
Generating Code for Loops
repeat-until loop is the easy case:Execute body, check condition, jump back if false.
while loop needs check before body, one extra label needed.
TransStat(stat, vtable, ftable) = case stat ofrepeat Stat labelf = newlabel()until Cond labelt = newlabel()
code1 = TransStat(Stat, vtable, ftable)code2 = TransCond(Cond , labelt , labelf , vtable, ftable)[LABEL labelf ] ++ code1 ++ code2 ++ [LABEL labelt ]
while Cond labels = newlabel()do Stat labelt = newlabel()
labelf = newlabel()code1 = TransCond(Cond , labelt , labelf , vtable, ftable)code2 = TransStat(Stat, vtable, ftable)[LABEL labels ] ++ code1
++ [LABEL labelt ] ++ code2 ++ [GOTO labels ]++ [LABEL labelf ]
19 / 38
![Page 31: Intermediate Code Generationmgv/csce531sp21/notes/4-interm-codegen.pdfIntermediate Code Generation Cosmin E. Oancea cosmin.oancea@diku.dk Modi ed by Marco Valtorta for CSCE 531 at](https://reader035.vdocuments.site/reader035/viewer/2022071511/612fbaec1ecc51586943a351/html5/thumbnails/31.jpg)
University of Copenhagen Department of Computer Science
Generating Code for Loops
repeat-until loop is the easy case:Execute body, check condition, jump back if false.
while loop needs check before body, one extra label needed.TransStat(stat, vtable, ftable) = case stat of
repeat Stat labelf = newlabel()until Cond labelt = newlabel()
code1 = TransStat(Stat, vtable, ftable)code2 = TransCond(Cond , labelt , labelf , vtable, ftable)[LABEL labelf ] ++ code1 ++ code2 ++ [LABEL labelt ]
while Cond labels = newlabel()do Stat labelt = newlabel()
labelf = newlabel()code1 = TransCond(Cond , labelt , labelf , vtable, ftable)code2 = TransStat(Stat, vtable, ftable)[LABEL labels ] ++ code1
++ [LABEL labelt ] ++ code2 ++ [GOTO labels ]++ [LABEL labelf ]
19 / 38
![Page 32: Intermediate Code Generationmgv/csce531sp21/notes/4-interm-codegen.pdfIntermediate Code Generation Cosmin E. Oancea cosmin.oancea@diku.dk Modi ed by Marco Valtorta for CSCE 531 at](https://reader035.vdocuments.site/reader035/viewer/2022071511/612fbaec1ecc51586943a351/html5/thumbnails/32.jpg)
University of Copenhagen Department of Computer Science
Translation Example
Symbol table vtable: [x 7→ v0, y 7→ v1, z 7→ v2]
Symbol table ftable: [getInt 7→ libIO getInt]
x := 3;
y := getInt();
z := 1;
while y > 0
y := y - 1;
z := z * x
v 0 := 3
v 1 := CALL libIO getInt()
v 2 := 1
LABEL l s
t 1 := v 1
t 2 := 0
IF t 1 > t 2 THEN l t else l f
LABEL l t
t 3 := v 1
t 4 := 1
v 1 := t 3 - t 4
t 5 := v 2
t 6 := v 0
v 2 := t 5 * t 6
GOTO l s
LABEL l f
20 / 38
![Page 33: Intermediate Code Generationmgv/csce531sp21/notes/4-interm-codegen.pdfIntermediate Code Generation Cosmin E. Oancea cosmin.oancea@diku.dk Modi ed by Marco Valtorta for CSCE 531 at](https://reader035.vdocuments.site/reader035/viewer/2022071511/612fbaec1ecc51586943a351/html5/thumbnails/33.jpg)
University of Copenhagen Department of Computer Science
Translation Example
Symbol table vtable: [x 7→ v0, y 7→ v1, z 7→ v2]
Symbol table ftable: [getInt 7→ libIO getInt]
x := 3;
y := getInt();
z := 1;
while y > 0
y := y - 1;
z := z * x
v 0 := 3
v 1 := CALL libIO getInt()
v 2 := 1
LABEL l s
t 1 := v 1
t 2 := 0
IF t 1 > t 2 THEN l t else l f
LABEL l t
t 3 := v 1
t 4 := 1
v 1 := t 3 - t 4
t 5 := v 2
t 6 := v 0
v 2 := t 5 * t 6
GOTO l s
LABEL l f
20 / 38
![Page 34: Intermediate Code Generationmgv/csce531sp21/notes/4-interm-codegen.pdfIntermediate Code Generation Cosmin E. Oancea cosmin.oancea@diku.dk Modi ed by Marco Valtorta for CSCE 531 at](https://reader035.vdocuments.site/reader035/viewer/2022071511/612fbaec1ecc51586943a351/html5/thumbnails/34.jpg)
University of Copenhagen Department of Computer Science
Translation Example
Symbol table vtable: [x 7→ v0, y 7→ v1, z 7→ v2]
Symbol table ftable: [getInt 7→ libIO getInt]
x := 3;
y := getInt();
z := 1;
while y > 0
y := y - 1;
z := z * x
v 0 := 3
v 1 := CALL libIO getInt()
v 2 := 1
LABEL l s
t 1 := v 1
t 2 := 0
IF t 1 > t 2 THEN l t else l f
LABEL l t
t 3 := v 1
t 4 := 1
v 1 := t 3 - t 4
t 5 := v 2
t 6 := v 0
v 2 := t 5 * t 6
GOTO l s
LABEL l f
20 / 38
![Page 35: Intermediate Code Generationmgv/csce531sp21/notes/4-interm-codegen.pdfIntermediate Code Generation Cosmin E. Oancea cosmin.oancea@diku.dk Modi ed by Marco Valtorta for CSCE 531 at](https://reader035.vdocuments.site/reader035/viewer/2022071511/612fbaec1ecc51586943a351/html5/thumbnails/35.jpg)
University of Copenhagen Department of Computer Science
Translation Example
Symbol table vtable: [x 7→ v0, y 7→ v1, z 7→ v2]
Symbol table ftable: [getInt 7→ libIO getInt]
x := 3;
y := getInt();
z := 1;
while y > 0
y := y - 1;
z := z * x
v 0 := 3
v 1 := CALL libIO getInt()
v 2 := 1
LABEL l s
t 1 := v 1
t 2 := 0
IF t 1 > t 2 THEN l t else l f
LABEL l t
t 3 := v 1
t 4 := 1
v 1 := t 3 - t 4
t 5 := v 2
t 6 := v 0
v 2 := t 5 * t 6
GOTO l s
LABEL l f
20 / 38
![Page 36: Intermediate Code Generationmgv/csce531sp21/notes/4-interm-codegen.pdfIntermediate Code Generation Cosmin E. Oancea cosmin.oancea@diku.dk Modi ed by Marco Valtorta for CSCE 531 at](https://reader035.vdocuments.site/reader035/viewer/2022071511/612fbaec1ecc51586943a351/html5/thumbnails/36.jpg)
University of Copenhagen Department of Computer Science
Translation Example
Symbol table vtable: [x 7→ v0, y 7→ v1, z 7→ v2]
Symbol table ftable: [getInt 7→ libIO getInt]
x := 3;
y := getInt();
z := 1;
while y > 0
y := y - 1;
z := z * x
v 0 := 3
v 1 := CALL libIO getInt()
v 2 := 1
LABEL l s
t 1 := v 1
t 2 := 0
IF t 1 > t 2 THEN l t else l f
LABEL l t
t 3 := v 1
t 4 := 1
v 1 := t 3 - t 4
t 5 := v 2
t 6 := v 0
v 2 := t 5 * t 6
GOTO l s
LABEL l f
20 / 38
![Page 37: Intermediate Code Generationmgv/csce531sp21/notes/4-interm-codegen.pdfIntermediate Code Generation Cosmin E. Oancea cosmin.oancea@diku.dk Modi ed by Marco Valtorta for CSCE 531 at](https://reader035.vdocuments.site/reader035/viewer/2022071511/612fbaec1ecc51586943a351/html5/thumbnails/37.jpg)
University of Copenhagen Department of Computer Science
1 Why Intermediate Code?Intermediate LanguageTo-Be-Translated Language
2 Syntax-Directed TranslationArithmetic ExpressionsStatementsBoolean Expressions, Sequential Evaluation
3 Translating More Complex StructuresMore Control StructuresArrays and Other Structured DataRole of Declarations in the Translation
21 / 38
![Page 38: Intermediate Code Generationmgv/csce531sp21/notes/4-interm-codegen.pdfIntermediate Code Generation Cosmin E. Oancea cosmin.oancea@diku.dk Modi ed by Marco Valtorta for CSCE 531 at](https://reader035.vdocuments.site/reader035/viewer/2022071511/612fbaec1ecc51586943a351/html5/thumbnails/38.jpg)
University of Copenhagen Department of Computer Science
More Complex Conditions, Boolean Expressions
Boolean Expressions as Conditions
Arithmetic expressions used asBoolean
Logical operators (not, and, or)
Boolean expressions used inarithmetics
Cond → Exp relop Exp| Exp| not Cond| Cond and Cond| Cond or Cond
Exp → . . . | Cond
We extend the translation functions TransExp and TransCond :
Interpret numeric values as Boolean expressions:0 is false, all other values true.
Likewise: truth values as arithmetic expressions
22 / 38
![Page 39: Intermediate Code Generationmgv/csce531sp21/notes/4-interm-codegen.pdfIntermediate Code Generation Cosmin E. Oancea cosmin.oancea@diku.dk Modi ed by Marco Valtorta for CSCE 531 at](https://reader035.vdocuments.site/reader035/viewer/2022071511/612fbaec1ecc51586943a351/html5/thumbnails/39.jpg)
University of Copenhagen Department of Computer Science
More Complex Conditions, Boolean Expressions
Boolean Expressions as Conditions
Arithmetic expressions used asBoolean
Logical operators (not, and, or)
Boolean expressions used inarithmetics
Cond → Exp relop Exp| Exp| not Cond| Cond and Cond| Cond or Cond
Exp → . . . | Cond
We extend the translation functions TransExp and TransCond :
Interpret numeric values as Boolean expressions:0 is false, all other values true.
Likewise: truth values as arithmetic expressions
22 / 38
![Page 40: Intermediate Code Generationmgv/csce531sp21/notes/4-interm-codegen.pdfIntermediate Code Generation Cosmin E. Oancea cosmin.oancea@diku.dk Modi ed by Marco Valtorta for CSCE 531 at](https://reader035.vdocuments.site/reader035/viewer/2022071511/612fbaec1ecc51586943a351/html5/thumbnails/40.jpg)
University of Copenhagen Department of Computer Science
Numbers and Boolean Values, NegationExpressions as Boolean values, negation:TransCond : (Cond, Label, Label, Vtable, Ftable) -> [ICode]TransCond(cond , labelt , labelf , vtable, ftable) = case cond of
. . .Exp t = newvar()
code = TransExp(Exp, vtable, ftable, t)code ++ [IF t 6= 0 THEN labelt ELSE labelf ]
notCond TransCond(Cond , labelf , labelt , vtable, ftable)
. . .
Conversion of Boolean values to numbers (by jumps):TransExp : (Exp, Vtable, Ftable) -> [ICode]TransExp(exp, vtable, ftable, place) = case exp of
. . .Cond label1 = newlabel()
label2 = newlabel()t = newvar()code = TransCond(Cond , label1, label2, vtable, ftable)[t := 0] ++ code ++ [LABEL label1, t := 1] ++ [LABEL label2, place := t]
23 / 38
![Page 41: Intermediate Code Generationmgv/csce531sp21/notes/4-interm-codegen.pdfIntermediate Code Generation Cosmin E. Oancea cosmin.oancea@diku.dk Modi ed by Marco Valtorta for CSCE 531 at](https://reader035.vdocuments.site/reader035/viewer/2022071511/612fbaec1ecc51586943a351/html5/thumbnails/41.jpg)
University of Copenhagen Department of Computer Science
Numbers and Boolean Values, NegationExpressions as Boolean values, negation:TransCond : (Cond, Label, Label, Vtable, Ftable) -> [ICode]TransCond(cond , labelt , labelf , vtable, ftable) = case cond of
. . .Exp t = newvar()
code = TransExp(Exp, vtable, ftable, t)code ++ [IF t 6= 0 THEN labelt ELSE labelf ]
notCond TransCond(Cond , labelf , labelt , vtable, ftable)
. . .
Conversion of Boolean values to numbers (by jumps):TransExp : (Exp, Vtable, Ftable) -> [ICode]TransExp(exp, vtable, ftable, place) = case exp of
. . .Cond label1 = newlabel()
label2 = newlabel()t = newvar()code = TransCond(Cond , label1, label2, vtable, ftable)[t := 0] ++ code ++ [LABEL label1, t := 1] ++ [LABEL label2, place := t]
23 / 38
![Page 42: Intermediate Code Generationmgv/csce531sp21/notes/4-interm-codegen.pdfIntermediate Code Generation Cosmin E. Oancea cosmin.oancea@diku.dk Modi ed by Marco Valtorta for CSCE 531 at](https://reader035.vdocuments.site/reader035/viewer/2022071511/612fbaec1ecc51586943a351/html5/thumbnails/42.jpg)
University of Copenhagen Department of Computer Science
Sequential Evaluation of Conditions
Moscow ML version 2.01 (January 2004)
Enter ‘quit();’ to quit.
- fun f l = if (hd l = 1) then "one" else "not one";
> val f = fn : int list -> string
- f [];
! Uncaught exception:
! Empty
In most languages, logical operators are evaluated sequentially.
If B1 = false, do not evaluate B2 in B1&&B2 (anyway false).
If B1 = true, do not evaluate B2 in B1||B2 (anyway true).- fun g l = if not (null l) andalso (hd l = 1) then "one" else "not one";
> val g = fn : int list -> string
- g [];
> val it = "not one" : string
24 / 38
![Page 43: Intermediate Code Generationmgv/csce531sp21/notes/4-interm-codegen.pdfIntermediate Code Generation Cosmin E. Oancea cosmin.oancea@diku.dk Modi ed by Marco Valtorta for CSCE 531 at](https://reader035.vdocuments.site/reader035/viewer/2022071511/612fbaec1ecc51586943a351/html5/thumbnails/43.jpg)
University of Copenhagen Department of Computer Science
Sequential Evaluation of Conditions
Moscow ML version 2.01 (January 2004)
Enter ‘quit();’ to quit.
- fun f l = if (hd l = 1) then "one" else "not one";
> val f = fn : int list -> string
- f [];
! Uncaught exception:
! Empty
In most languages, logical operators are evaluated sequentially.
If B1 = false, do not evaluate B2 in B1&&B2 (anyway false).
If B1 = true, do not evaluate B2 in B1||B2 (anyway true).
- fun g l = if not (null l) andalso (hd l = 1) then "one" else "not one";
> val g = fn : int list -> string
- g [];
> val it = "not one" : string
24 / 38
![Page 44: Intermediate Code Generationmgv/csce531sp21/notes/4-interm-codegen.pdfIntermediate Code Generation Cosmin E. Oancea cosmin.oancea@diku.dk Modi ed by Marco Valtorta for CSCE 531 at](https://reader035.vdocuments.site/reader035/viewer/2022071511/612fbaec1ecc51586943a351/html5/thumbnails/44.jpg)
University of Copenhagen Department of Computer Science
Sequential Evaluation of Conditions
Moscow ML version 2.01 (January 2004)
Enter ‘quit();’ to quit.
- fun f l = if (hd l = 1) then "one" else "not one";
> val f = fn : int list -> string
- f [];
! Uncaught exception:
! Empty
In most languages, logical operators are evaluated sequentially.
If B1 = false, do not evaluate B2 in B1&&B2 (anyway false).
If B1 = true, do not evaluate B2 in B1||B2 (anyway true).- fun g l = if not (null l) andalso (hd l = 1) then "one" else "not one";
> val g = fn : int list -> string
- g [];
> val it = "not one" : string
24 / 38
![Page 45: Intermediate Code Generationmgv/csce531sp21/notes/4-interm-codegen.pdfIntermediate Code Generation Cosmin E. Oancea cosmin.oancea@diku.dk Modi ed by Marco Valtorta for CSCE 531 at](https://reader035.vdocuments.site/reader035/viewer/2022071511/612fbaec1ecc51586943a351/html5/thumbnails/45.jpg)
University of Copenhagen Department of Computer Science
Sequential Evaluation by “Jumping Code”TransCond : (Cond, Label, Label, Vtable, Ftable) -> [ICode]TransCond(cond , labelt , labelf , vtable, ftable) = case cond of
. . .Cond1 labelnext = newlabel()and code1=TransCond(Cond1, labelnext , labelf , vtable, ftable)Cond2 code2=TransCond(Cond2, labelt , labelf , vtable, ftable)
code1 ++ [LABEL labelnext ] ++ code2
Cond1 labelnext = newlabel()or code1=TransCond(Cond1, labelt , labelnext , vtable, ftable)Cond2 code2=TransCond(Cond2, labelt , labelf , vtable, ftable)
code1 ++ [LABEL labelnext ] ++ code2
Note: No logical operations in intermediate language!Logics of and and or encoded by jumps.
Alternative: Logical operators in intermediate languageCond ⇒ Exp ⇒ Exp binop Exp
Translated as an arithmetic operation. Evaluates both sides!
25 / 38
![Page 46: Intermediate Code Generationmgv/csce531sp21/notes/4-interm-codegen.pdfIntermediate Code Generation Cosmin E. Oancea cosmin.oancea@diku.dk Modi ed by Marco Valtorta for CSCE 531 at](https://reader035.vdocuments.site/reader035/viewer/2022071511/612fbaec1ecc51586943a351/html5/thumbnails/46.jpg)
University of Copenhagen Department of Computer Science
Sequential Evaluation by “Jumping Code”TransCond : (Cond, Label, Label, Vtable, Ftable) -> [ICode]TransCond(cond , labelt , labelf , vtable, ftable) = case cond of
. . .Cond1 labelnext = newlabel()and code1=TransCond(Cond1, labelnext , labelf , vtable, ftable)Cond2 code2=TransCond(Cond2, labelt , labelf , vtable, ftable)
code1 ++ [LABEL labelnext ] ++ code2
Cond1 labelnext = newlabel()or code1=TransCond(Cond1, labelt , labelnext , vtable, ftable)Cond2 code2=TransCond(Cond2, labelt , labelf , vtable, ftable)
code1 ++ [LABEL labelnext ] ++ code2
Note: No logical operations in intermediate language!Logics of and and or encoded by jumps.
Alternative: Logical operators in intermediate languageCond ⇒ Exp ⇒ Exp binop Exp
Translated as an arithmetic operation. Evaluates both sides!
25 / 38
![Page 47: Intermediate Code Generationmgv/csce531sp21/notes/4-interm-codegen.pdfIntermediate Code Generation Cosmin E. Oancea cosmin.oancea@diku.dk Modi ed by Marco Valtorta for CSCE 531 at](https://reader035.vdocuments.site/reader035/viewer/2022071511/612fbaec1ecc51586943a351/html5/thumbnails/47.jpg)
University of Copenhagen Department of Computer Science
Sequential Evaluation by “Jumping Code”TransCond : (Cond, Label, Label, Vtable, Ftable) -> [ICode]TransCond(cond , labelt , labelf , vtable, ftable) = case cond of
. . .Cond1 labelnext = newlabel()and code1=TransCond(Cond1, labelnext , labelf , vtable, ftable)Cond2 code2=TransCond(Cond2, labelt , labelf , vtable, ftable)
code1 ++ [LABEL labelnext ] ++ code2
Cond1 labelnext = newlabel()or code1=TransCond(Cond1, labelt , labelnext , vtable, ftable)Cond2 code2=TransCond(Cond2, labelt , labelf , vtable, ftable)
code1 ++ [LABEL labelnext ] ++ code2
Note: No logical operations in intermediate language!Logics of and and or encoded by jumps.
Alternative: Logical operators in intermediate languageCond ⇒ Exp ⇒ Exp binop Exp
Translated as an arithmetic operation.
Evaluates both sides!
25 / 38
![Page 48: Intermediate Code Generationmgv/csce531sp21/notes/4-interm-codegen.pdfIntermediate Code Generation Cosmin E. Oancea cosmin.oancea@diku.dk Modi ed by Marco Valtorta for CSCE 531 at](https://reader035.vdocuments.site/reader035/viewer/2022071511/612fbaec1ecc51586943a351/html5/thumbnails/48.jpg)
University of Copenhagen Department of Computer Science
Sequential Evaluation by “Jumping Code”TransCond : (Cond, Label, Label, Vtable, Ftable) -> [ICode]TransCond(cond , labelt , labelf , vtable, ftable) = case cond of
. . .Cond1 labelnext = newlabel()and code1=TransCond(Cond1, labelnext , labelf , vtable, ftable)Cond2 code2=TransCond(Cond2, labelt , labelf , vtable, ftable)
code1 ++ [LABEL labelnext ] ++ code2
Cond1 labelnext = newlabel()or code1=TransCond(Cond1, labelt , labelnext , vtable, ftable)Cond2 code2=TransCond(Cond2, labelt , labelf , vtable, ftable)
code1 ++ [LABEL labelnext ] ++ code2
Note: No logical operations in intermediate language!Logics of and and or encoded by jumps.
Alternative: Logical operators in intermediate languageCond ⇒ Exp ⇒ Exp binop Exp
Translated as an arithmetic operation. Evaluates both sides!
25 / 38
![Page 49: Intermediate Code Generationmgv/csce531sp21/notes/4-interm-codegen.pdfIntermediate Code Generation Cosmin E. Oancea cosmin.oancea@diku.dk Modi ed by Marco Valtorta for CSCE 531 at](https://reader035.vdocuments.site/reader035/viewer/2022071511/612fbaec1ecc51586943a351/html5/thumbnails/49.jpg)
University of Copenhagen Department of Computer Science
1 Why Intermediate Code?Intermediate LanguageTo-Be-Translated Language
2 Syntax-Directed TranslationArithmetic ExpressionsStatementsBoolean Expressions, Sequential Evaluation
3 Translating More Complex StructuresMore Control StructuresArrays and Other Structured DataRole of Declarations in the Translation
26 / 38
![Page 50: Intermediate Code Generationmgv/csce531sp21/notes/4-interm-codegen.pdfIntermediate Code Generation Cosmin E. Oancea cosmin.oancea@diku.dk Modi ed by Marco Valtorta for CSCE 531 at](https://reader035.vdocuments.site/reader035/viewer/2022071511/612fbaec1ecc51586943a351/html5/thumbnails/50.jpg)
University of Copenhagen Department of Computer Science
More Control Structures
Control structures determine control flow: which instruction toexecute next
A while-loop is enough
. . . but . . . languages usually offer more.
Explicit jumps: Stat → label :| goto label
Necessary instructions are in the intermediate language.Needs to build symbol table of labels.
Case/Switch: Stat → case Exp of [ Alts ]Alts → num : Stat | num : Stat, Alts
When exited after each case: chain of if-then-else
When “falling through” (e.g., in C): if-then-else and goto.
Break and Continue: Stat → break | continue(break: jump behind loop, continue: jump to end of loop body).Needs two jump target labels used only inside loop bodies(parameters to translation function TransStat)
. . . consideredharmful (Dijkstra 1968)
27 / 38
![Page 51: Intermediate Code Generationmgv/csce531sp21/notes/4-interm-codegen.pdfIntermediate Code Generation Cosmin E. Oancea cosmin.oancea@diku.dk Modi ed by Marco Valtorta for CSCE 531 at](https://reader035.vdocuments.site/reader035/viewer/2022071511/612fbaec1ecc51586943a351/html5/thumbnails/51.jpg)
University of Copenhagen Department of Computer Science
More Control Structures
Control structures determine control flow: which instruction toexecute next
A while-loop is enough . . . but . . . languages usually offer more.
Explicit jumps: Stat → label :| goto label
Necessary instructions are in the intermediate language.Needs to build symbol table of labels.
Case/Switch: Stat → case Exp of [ Alts ]Alts → num : Stat | num : Stat, Alts
When exited after each case: chain of if-then-else
When “falling through” (e.g., in C): if-then-else and goto.
Break and Continue: Stat → break | continue(break: jump behind loop, continue: jump to end of loop body).Needs two jump target labels used only inside loop bodies(parameters to translation function TransStat)
. . . consideredharmful (Dijkstra 1968)
27 / 38
![Page 52: Intermediate Code Generationmgv/csce531sp21/notes/4-interm-codegen.pdfIntermediate Code Generation Cosmin E. Oancea cosmin.oancea@diku.dk Modi ed by Marco Valtorta for CSCE 531 at](https://reader035.vdocuments.site/reader035/viewer/2022071511/612fbaec1ecc51586943a351/html5/thumbnails/52.jpg)
University of Copenhagen Department of Computer Science
More Control Structures
Control structures determine control flow: which instruction toexecute next
A while-loop is enough . . . but . . . languages usually offer more.
Explicit jumps: Stat → label :| goto label
Necessary instructions are in the intermediate language.Needs to build symbol table of labels.
Case/Switch: Stat → case Exp of [ Alts ]Alts → num : Stat | num : Stat, Alts
When exited after each case: chain of if-then-else
When “falling through” (e.g., in C): if-then-else and goto.
Break and Continue: Stat → break | continue(break: jump behind loop, continue: jump to end of loop body).Needs two jump target labels used only inside loop bodies(parameters to translation function TransStat)
. . . consideredharmful (Dijkstra 1968)
27 / 38
![Page 53: Intermediate Code Generationmgv/csce531sp21/notes/4-interm-codegen.pdfIntermediate Code Generation Cosmin E. Oancea cosmin.oancea@diku.dk Modi ed by Marco Valtorta for CSCE 531 at](https://reader035.vdocuments.site/reader035/viewer/2022071511/612fbaec1ecc51586943a351/html5/thumbnails/53.jpg)
University of Copenhagen Department of Computer Science
More Control Structures
Control structures determine control flow: which instruction toexecute next
A while-loop is enough . . . but . . . languages usually offer more.
Explicit jumps: Stat → label :| goto label
Necessary instructions are in the intermediate language.Needs to build symbol table of labels.
Case/Switch: Stat → case Exp of [ Alts ]Alts → num : Stat | num : Stat, Alts
When exited after each case: chain of if-then-else
When “falling through” (e.g., in C): if-then-else and goto.
Break and Continue: Stat → break | continue(break: jump behind loop, continue: jump to end of loop body).Needs two jump target labels used only inside loop bodies(parameters to translation function TransStat)
. . . consideredharmful (Dijkstra 1968)
27 / 38
![Page 54: Intermediate Code Generationmgv/csce531sp21/notes/4-interm-codegen.pdfIntermediate Code Generation Cosmin E. Oancea cosmin.oancea@diku.dk Modi ed by Marco Valtorta for CSCE 531 at](https://reader035.vdocuments.site/reader035/viewer/2022071511/612fbaec1ecc51586943a351/html5/thumbnails/54.jpg)
University of Copenhagen Department of Computer Science
More Control Structures
Control structures determine control flow: which instruction toexecute next
A while-loop is enough . . . but . . . languages usually offer more.
Explicit jumps: Stat → label :| goto label
Necessary instructions are in the intermediate language.Needs to build symbol table of labels.
Case/Switch: Stat → case Exp of [ Alts ]Alts → num : Stat | num : Stat, Alts
When exited after each case: chain of if-then-else
When “falling through” (e.g., in C): if-then-else and goto.
Break and Continue: Stat → break | continue(break: jump behind loop, continue: jump to end of loop body).Needs two jump target labels used only inside loop bodies(parameters to translation function TransStat)
. . . consideredharmful (Dijkstra 1968)
27 / 38
![Page 55: Intermediate Code Generationmgv/csce531sp21/notes/4-interm-codegen.pdfIntermediate Code Generation Cosmin E. Oancea cosmin.oancea@diku.dk Modi ed by Marco Valtorta for CSCE 531 at](https://reader035.vdocuments.site/reader035/viewer/2022071511/612fbaec1ecc51586943a351/html5/thumbnails/55.jpg)
University of Copenhagen Department of Computer Science
1 Why Intermediate Code?Intermediate LanguageTo-Be-Translated Language
2 Syntax-Directed TranslationArithmetic ExpressionsStatementsBoolean Expressions, Sequential Evaluation
3 Translating More Complex StructuresMore Control StructuresArrays and Other Structured DataRole of Declarations in the Translation
28 / 38
![Page 56: Intermediate Code Generationmgv/csce531sp21/notes/4-interm-codegen.pdfIntermediate Code Generation Cosmin E. Oancea cosmin.oancea@diku.dk Modi ed by Marco Valtorta for CSCE 531 at](https://reader035.vdocuments.site/reader035/viewer/2022071511/612fbaec1ecc51586943a351/html5/thumbnails/56.jpg)
University of Copenhagen Department of Computer Science
Translating Arrays (of int elements)
Extending the Source Language
Array elements used as an expression
Assignment to an array element
Array elements accessed by an index(expression)
Exp → . . . | IdxStat → . . . | Idx := Exp
Idx → id[ Exp ]
Again we extend TransExp and TransStat .
Arrays stored in pre-allocated memory area, generated code willuse memory access instructions.
Static (compile-time) or dynamic (run-time) allocation possible.
29 / 38
![Page 57: Intermediate Code Generationmgv/csce531sp21/notes/4-interm-codegen.pdfIntermediate Code Generation Cosmin E. Oancea cosmin.oancea@diku.dk Modi ed by Marco Valtorta for CSCE 531 at](https://reader035.vdocuments.site/reader035/viewer/2022071511/612fbaec1ecc51586943a351/html5/thumbnails/57.jpg)
University of Copenhagen Department of Computer Science
Translating Arrays (of int elements)
Extending the Source Language
Array elements used as an expression
Assignment to an array element
Array elements accessed by an index(expression)
Exp → . . . | IdxStat → . . . | Idx := Exp
Idx → id[ Exp ]
Again we extend TransExp and TransStat .
Arrays stored in pre-allocated memory area, generated code willuse memory access instructions.
Static (compile-time) or dynamic (run-time) allocation possible.
29 / 38
![Page 58: Intermediate Code Generationmgv/csce531sp21/notes/4-interm-codegen.pdfIntermediate Code Generation Cosmin E. Oancea cosmin.oancea@diku.dk Modi ed by Marco Valtorta for CSCE 531 at](https://reader035.vdocuments.site/reader035/viewer/2022071511/612fbaec1ecc51586943a351/html5/thumbnails/58.jpg)
University of Copenhagen Department of Computer Science
Generating Code for Address Calculation
vtable contains the base address of the array.
Elements are int here, so 4 bytes per element for address.
TransIdx(index , vtable, ftable) = case index of
id[Exp] base = lookup(vtable, getname(id))addr = newvar()code1 = TransExp(Exp, vtable, ftable, addr)code2 = code1 ++ [addr := addr∗4, addr := addr+base](code2, addr)
Returns:
Code to calculate the absolute address . . .
of the array element in memory (corresponding to index), . . .
. . . and a new variable (addr) where it will be stored.
30 / 38
![Page 59: Intermediate Code Generationmgv/csce531sp21/notes/4-interm-codegen.pdfIntermediate Code Generation Cosmin E. Oancea cosmin.oancea@diku.dk Modi ed by Marco Valtorta for CSCE 531 at](https://reader035.vdocuments.site/reader035/viewer/2022071511/612fbaec1ecc51586943a351/html5/thumbnails/59.jpg)
University of Copenhagen Department of Computer Science
Generating Code for Array Access
Address-calculation code: in expression and statement translation.
Read access inside expressions:
TransExp(exp, vtable, ftable, place) = case exp of
. . .
Idx (code1, address) = TransIdx(Idx , vtable, ftable)code1 ++ [place := M[address]]
Write access in assignments:
TransStat(stat, vtable, ftable) = case stat of
. . .
Idx := Exp (code1, address) =TransIdx(Index , vtable, ftable)t = newvar()code2 = TransExp(Exp, vtable, ftable, t)code1 ++ code2 ++ [M[address] := t]
31 / 38
![Page 60: Intermediate Code Generationmgv/csce531sp21/notes/4-interm-codegen.pdfIntermediate Code Generation Cosmin E. Oancea cosmin.oancea@diku.dk Modi ed by Marco Valtorta for CSCE 531 at](https://reader035.vdocuments.site/reader035/viewer/2022071511/612fbaec1ecc51586943a351/html5/thumbnails/60.jpg)
University of Copenhagen Department of Computer Science
Multi-Dimensional Arrays
Arrays in Multiple Dimensions
Only a small change to previousgrammar: Idx can now be recursive.
Needs to be mapped to an address inone dimension.
Exp → . . . | IdxStat → . . . | Idx := Exp
Idx → id[Exp] | Idx [Exp]
Arrays stored in row-major or column-major order.Standard: row-major, index of a[k][l] is k · dim1 + l(Index of b[k][l][m] is k · dim1 · dim2 + l · dim2 + m)
Address calculation need to know sizes in each dimension.Symbol table: base address and list of array-dimension sizes.
Need to change TransIdx , i.e., add recursive index calculation.
32 / 38
![Page 61: Intermediate Code Generationmgv/csce531sp21/notes/4-interm-codegen.pdfIntermediate Code Generation Cosmin E. Oancea cosmin.oancea@diku.dk Modi ed by Marco Valtorta for CSCE 531 at](https://reader035.vdocuments.site/reader035/viewer/2022071511/612fbaec1ecc51586943a351/html5/thumbnails/61.jpg)
University of Copenhagen Department of Computer Science
Multi-Dimensional Arrays
Arrays in Multiple Dimensions
Only a small change to previousgrammar: Idx can now be recursive.
Needs to be mapped to an address inone dimension.
Exp → . . . | IdxStat → . . . | Idx := Exp
Idx → id[Exp] | Idx [Exp]
Arrays stored in row-major or column-major order.Standard: row-major, index of a[k][l] is k · dim1 + l(Index of b[k][l][m] is k · dim1 · dim2 + l · dim2 + m)
Address calculation need to know sizes in each dimension.Symbol table: base address and list of array-dimension sizes.
Need to change TransIdx , i.e., add recursive index calculation.
32 / 38
![Page 62: Intermediate Code Generationmgv/csce531sp21/notes/4-interm-codegen.pdfIntermediate Code Generation Cosmin E. Oancea cosmin.oancea@diku.dk Modi ed by Marco Valtorta for CSCE 531 at](https://reader035.vdocuments.site/reader035/viewer/2022071511/612fbaec1ecc51586943a351/html5/thumbnails/62.jpg)
University of Copenhagen Department of Computer Science
Multi-Dimensional Arrays
Arrays in Multiple Dimensions
Only a small change to previousgrammar: Idx can now be recursive.
Needs to be mapped to an address inone dimension.
Exp → . . . | IdxStat → . . . | Idx := Exp
Idx → id[Exp] | Idx [Exp]
Arrays stored in row-major or column-major order.Standard: row-major, index of a[k][l] is k · dim1 + l(Index of b[k][l][m] is k · dim1 · dim2 + l · dim2 + m)
Address calculation need to know sizes in each dimension.Symbol table: base address and list of array-dimension sizes.
Need to change TransIdx , i.e., add recursive index calculation.
32 / 38
![Page 63: Intermediate Code Generationmgv/csce531sp21/notes/4-interm-codegen.pdfIntermediate Code Generation Cosmin E. Oancea cosmin.oancea@diku.dk Modi ed by Marco Valtorta for CSCE 531 at](https://reader035.vdocuments.site/reader035/viewer/2022071511/612fbaec1ecc51586943a351/html5/thumbnails/63.jpg)
University of Copenhagen Department of Computer Science
Address Calculation in Multiple DimensionsTransIdx(index , vtable, ftable) =
(code1, t, base, []) = CalcIdx(index , vtable, ftable)code2 = code1 ++ [t := t ∗ 4, t := t + base](code2, t)
Recursive index calculation, multiplies with dimension at each step.
CalcIdx(index , vtable, ftable) = case index of
id[Exp] (base, dims) = lookup(vtable, getname(id))addr = newvar()code = TransExp(Exp, vtable, ftable, addr)(code, addr , base, tail(dims))
Index [Exp] (code1, addr , base, dims) = CalcIdx(Index , vtable, ftable)d = head(dims)t = newvar()code2 = TransExp(Exp, vtable, ftable, t)code3 = code1 ++ code2 ++ [addr := addr ∗ d , addr := addr + t](code3, addr , base, tail(dims))
33 / 38
![Page 64: Intermediate Code Generationmgv/csce531sp21/notes/4-interm-codegen.pdfIntermediate Code Generation Cosmin E. Oancea cosmin.oancea@diku.dk Modi ed by Marco Valtorta for CSCE 531 at](https://reader035.vdocuments.site/reader035/viewer/2022071511/612fbaec1ecc51586943a351/html5/thumbnails/64.jpg)
University of Copenhagen Department of Computer Science
Address Calculation in Multiple DimensionsTransIdx(index , vtable, ftable) =
(code1, t, base, []) = CalcIdx(index , vtable, ftable)code2 = code1 ++ [t := t ∗ 4, t := t + base](code2, t)
Recursive index calculation, multiplies with dimension at each step.
CalcIdx(index , vtable, ftable) = case index of
id[Exp] (base, dims) = lookup(vtable, getname(id))addr = newvar()code = TransExp(Exp, vtable, ftable, addr)(code, addr , base, tail(dims))
Index [Exp] (code1, addr , base, dims) = CalcIdx(Index , vtable, ftable)d = head(dims)t = newvar()code2 = TransExp(Exp, vtable, ftable, t)code3 = code1 ++ code2 ++ [addr := addr ∗ d , addr := addr + t](code3, addr , base, tail(dims))
33 / 38
![Page 65: Intermediate Code Generationmgv/csce531sp21/notes/4-interm-codegen.pdfIntermediate Code Generation Cosmin E. Oancea cosmin.oancea@diku.dk Modi ed by Marco Valtorta for CSCE 531 at](https://reader035.vdocuments.site/reader035/viewer/2022071511/612fbaec1ecc51586943a351/html5/thumbnails/65.jpg)
University of Copenhagen Department of Computer Science
1 Why Intermediate Code?Intermediate LanguageTo-Be-Translated Language
2 Syntax-Directed TranslationArithmetic ExpressionsStatementsBoolean Expressions, Sequential Evaluation
3 Translating More Complex StructuresMore Control StructuresArrays and Other Structured DataRole of Declarations in the Translation
34 / 38
![Page 66: Intermediate Code Generationmgv/csce531sp21/notes/4-interm-codegen.pdfIntermediate Code Generation Cosmin E. Oancea cosmin.oancea@diku.dk Modi ed by Marco Valtorta for CSCE 531 at](https://reader035.vdocuments.site/reader035/viewer/2022071511/612fbaec1ecc51586943a351/html5/thumbnails/66.jpg)
University of Copenhagen Department of Computer Science
Declarations in the Translation
Declarations are necessary
to allocate space for arrays,
to compute addresses for multi-dimensional arrays,
. . . and when the language allows local declarations (scope).
Declarations and scope
Statements following a declarationscan see declared data.
Declaration of variables and arrays
Here: Constant size, one dimension
Stat → Decl ; StatDecl → int id
| int id[num]
Function TransDecl : (Decl, VTable) -> ([ICode], VTable)
translates declarations to code and new symbol table.
35 / 38
![Page 67: Intermediate Code Generationmgv/csce531sp21/notes/4-interm-codegen.pdfIntermediate Code Generation Cosmin E. Oancea cosmin.oancea@diku.dk Modi ed by Marco Valtorta for CSCE 531 at](https://reader035.vdocuments.site/reader035/viewer/2022071511/612fbaec1ecc51586943a351/html5/thumbnails/67.jpg)
University of Copenhagen Department of Computer Science
Declarations in the Translation
Declarations are necessary
to allocate space for arrays,
to compute addresses for multi-dimensional arrays,
. . . and when the language allows local declarations (scope).
Declarations and scope
Statements following a declarationscan see declared data.
Declaration of variables and arrays
Here: Constant size, one dimension
Stat → Decl ; StatDecl → int id
| int id[num]
Function TransDecl : (Decl, VTable) -> ([ICode], VTable)
translates declarations to code and new symbol table.
35 / 38
![Page 68: Intermediate Code Generationmgv/csce531sp21/notes/4-interm-codegen.pdfIntermediate Code Generation Cosmin E. Oancea cosmin.oancea@diku.dk Modi ed by Marco Valtorta for CSCE 531 at](https://reader035.vdocuments.site/reader035/viewer/2022071511/612fbaec1ecc51586943a351/html5/thumbnails/68.jpg)
University of Copenhagen Department of Computer Science
Translating Declarations to Scope and AllocationCode with local scope (extended symbol table):
TransStat(stat, vtable, ftable) = case stat of
Decl ; Stat1 (code1, vtable1) = TransDecl(Decl , vtable)code2 = TransStat(Stat1, vtable1, ftable)code1 ++ code2
Building the symbol table and allocating:
TransDecl : (Decl, VTable) -> ([ICode], VTable )
TransDecl(decl , vtable) = case decl of
int id t1 = newvar()vtable1 = bind(vtable, getname(id), t1)([], vtable1)
int id[num] t1 = newvar()vtable1 = bind(vtable, getname(id), t1)([t1 := HP, HP := HP + (4 ∗ getvalue(num))], vtable1)
. . . where HP is the heap pointer, indicating the first free space in a managed heapat runtime; used for dynamic allocation.
36 / 38
![Page 69: Intermediate Code Generationmgv/csce531sp21/notes/4-interm-codegen.pdfIntermediate Code Generation Cosmin E. Oancea cosmin.oancea@diku.dk Modi ed by Marco Valtorta for CSCE 531 at](https://reader035.vdocuments.site/reader035/viewer/2022071511/612fbaec1ecc51586943a351/html5/thumbnails/69.jpg)
University of Copenhagen Department of Computer Science
Translating Declarations to Scope and AllocationCode with local scope (extended symbol table):
TransStat(stat, vtable, ftable) = case stat of
Decl ; Stat1 (code1, vtable1) = TransDecl(Decl , vtable)code2 = TransStat(Stat1, vtable1, ftable)code1 ++ code2
Building the symbol table and allocating:
TransDecl : (Decl, VTable) -> ([ICode], VTable )
TransDecl(decl , vtable) = case decl of
int id t1 = newvar()vtable1 = bind(vtable, getname(id), t1)([], vtable1)
int id[num] t1 = newvar()vtable1 = bind(vtable, getname(id), t1)([t1 := HP, HP := HP + (4 ∗ getvalue(num))], vtable1)
. . . where HP is the heap pointer, indicating the first free space in a managed heapat runtime; used for dynamic allocation.
36 / 38
![Page 70: Intermediate Code Generationmgv/csce531sp21/notes/4-interm-codegen.pdfIntermediate Code Generation Cosmin E. Oancea cosmin.oancea@diku.dk Modi ed by Marco Valtorta for CSCE 531 at](https://reader035.vdocuments.site/reader035/viewer/2022071511/612fbaec1ecc51586943a351/html5/thumbnails/70.jpg)
University of Copenhagen Department of Computer Science
Other Structures that Require Special Treatment
Floating-Point values:Often stored in different registersAlways require different machine operationsSymbol table needs type information when creating variables inintermediate code.
StringsSometimes just arrays of (1-byte) char type, but variable length.In modern languages/implementations, elements can be char orunicode (UTF-8 and UTF-16 variable size!)Usually handled by library functions.
Records and UnionsLinear in memory. Field types and sizes can be different.Field selector known at compile time: compute offset from base.
37 / 38
![Page 71: Intermediate Code Generationmgv/csce531sp21/notes/4-interm-codegen.pdfIntermediate Code Generation Cosmin E. Oancea cosmin.oancea@diku.dk Modi ed by Marco Valtorta for CSCE 531 at](https://reader035.vdocuments.site/reader035/viewer/2022071511/612fbaec1ecc51586943a351/html5/thumbnails/71.jpg)
University of Copenhagen Department of Computer Science
Other Structures that Require Special Treatment
Floating-Point values:Often stored in different registersAlways require different machine operationsSymbol table needs type information when creating variables inintermediate code.
StringsSometimes just arrays of (1-byte) char type, but variable length.In modern languages/implementations, elements can be char orunicode (UTF-8 and UTF-16 variable size!)Usually handled by library functions.
Records and UnionsLinear in memory. Field types and sizes can be different.Field selector known at compile time: compute offset from base.
37 / 38
![Page 72: Intermediate Code Generationmgv/csce531sp21/notes/4-interm-codegen.pdfIntermediate Code Generation Cosmin E. Oancea cosmin.oancea@diku.dk Modi ed by Marco Valtorta for CSCE 531 at](https://reader035.vdocuments.site/reader035/viewer/2022071511/612fbaec1ecc51586943a351/html5/thumbnails/72.jpg)
University of Copenhagen Department of Computer Science
Other Structures that Require Special Treatment
Floating-Point values:Often stored in different registersAlways require different machine operationsSymbol table needs type information when creating variables inintermediate code.
StringsSometimes just arrays of (1-byte) char type, but variable length.In modern languages/implementations, elements can be char orunicode (UTF-8 and UTF-16 variable size!)Usually handled by library functions.
Records and UnionsLinear in memory. Field types and sizes can be different.Field selector known at compile time: compute offset from base.
37 / 38
![Page 73: Intermediate Code Generationmgv/csce531sp21/notes/4-interm-codegen.pdfIntermediate Code Generation Cosmin E. Oancea cosmin.oancea@diku.dk Modi ed by Marco Valtorta for CSCE 531 at](https://reader035.vdocuments.site/reader035/viewer/2022071511/612fbaec1ecc51586943a351/html5/thumbnails/73.jpg)
University of Copenhagen Department of Computer Science
Structure of a CompilerProgram text
↓Lexical analysis Binary machine code
↓ ↑Symbol sequence Assembly and linking
↓ ↑Syntax analysis Ditto with named registers
↓ ↑Syntax tree Register allocation
↓ ↑Typecheck Symbolic machine code
↓ ↑Syntax tree Machine code generation
↓ ↑Intermediate code generation −→ Intermediate code
38 / 38