Computer Languages - Translation to intermediate code
Computer Languages - Translation to intermediate code
Computer Languages - Translation to intermediate code
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
<strong>Computer</strong> <strong>Languages</strong><br />
<strong>Translation</strong> <strong>to</strong> <strong>intermediate</strong> <strong>code</strong><br />
Verónica Gaspes<br />
School of Information Science, <strong>Computer</strong> and Electrical Engineering<br />
April 27<br />
www.hh.se/staff/vero/languages<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Structure of a compiler<br />
A compiler translates a program written in some programming<br />
language <strong>to</strong> <strong>code</strong> that can be executed on some machine.<br />
Source −→<br />
program<br />
Our compiler<br />
IR<br />
Front End Back End<br />
Compiler<br />
−→ Target<br />
program<br />
In this project we will concentrate ourselves on the programming<br />
language minijava, a target architecture called MIPS (a RISC<br />
architecture) and a suitable <strong>intermediate</strong> representation.<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Structure of a compiler<br />
A compiler translates a program written in some programming<br />
language <strong>to</strong> <strong>code</strong> that can be executed on some machine.<br />
Source −→<br />
program<br />
Our compiler<br />
IR<br />
Front End Back End<br />
Compiler<br />
−→ Target<br />
program<br />
In this project we will concentrate ourselves on the programming<br />
language minijava, a target architecture called MIPS (a RISC<br />
architecture) and a suitable <strong>intermediate</strong> representation.<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Structure of a compiler<br />
A compiler translates a program written in some programming<br />
language <strong>to</strong> <strong>code</strong> that can be executed on some machine.<br />
Source −→<br />
program<br />
Our compiler<br />
IR<br />
Front End Back End<br />
Compiler<br />
−→ Target<br />
program<br />
In this project we will concentrate ourselves on the programming<br />
language minijava, a target architecture called MIPS (a RISC<br />
architecture) and a suitable <strong>intermediate</strong> representation.<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Structure of a compiler<br />
A compiler translates a program written in some programming<br />
language <strong>to</strong> <strong>code</strong> that can be executed on some machine.<br />
Source −→<br />
program<br />
Our compiler<br />
IR<br />
Front End Back End<br />
Compiler<br />
−→ Target<br />
program<br />
In this project we will concentrate ourselves on the programming<br />
language minijava, a target architecture called MIPS (a RISC<br />
architecture) and a suitable <strong>intermediate</strong> representation.<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Structure of a compiler<br />
A compiler translates a program written in some programming<br />
language <strong>to</strong> <strong>code</strong> that can be executed on some machine.<br />
Source −→<br />
program<br />
Our compiler<br />
IR<br />
Front End Back End<br />
Compiler<br />
−→ Target<br />
program<br />
In this project we will concentrate ourselves on the programming<br />
language minijava, a target architecture called MIPS (a RISC<br />
architecture) and a suitable <strong>intermediate</strong> representation.<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Structure of a compiler<br />
A compiler translates a program written in some programming<br />
language <strong>to</strong> <strong>code</strong> that can be executed on some machine.<br />
Source −→<br />
program<br />
Our compiler<br />
IR<br />
Front End Back End<br />
Compiler<br />
−→ Target<br />
program<br />
In this project we will concentrate ourselves on the programming<br />
language minijava, a target architecture called MIPS (a RISC<br />
architecture) and a suitable <strong>intermediate</strong> representation.<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Structure of a compiler<br />
A compiler translates a program written in some programming<br />
language <strong>to</strong> <strong>code</strong> that can be executed on some machine.<br />
Source −→<br />
program<br />
Our compiler<br />
IR<br />
Front End Back End<br />
Compiler<br />
−→ Target<br />
program<br />
In this project we will concentrate ourselves on the programming<br />
language minijava, a target architecture called MIPS (a RISC<br />
architecture) and a suitable <strong>intermediate</strong> representation.<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Structure of a compiler<br />
A compiler translates a program written in some programming<br />
language <strong>to</strong> <strong>code</strong> that can be executed on some machine.<br />
Source −→<br />
program<br />
Our compiler<br />
IR<br />
Front End Back End<br />
Compiler<br />
−→ Target<br />
program<br />
In this project we will concentrate ourselves on the programming<br />
language minijava, a target architecture called MIPS (a RISC<br />
architecture) and a suitable <strong>intermediate</strong> representation.<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Structure of a compiler<br />
A compiler translates a program written in some programming<br />
language <strong>to</strong> <strong>code</strong> that can be executed on some machine.<br />
Source −→<br />
program<br />
Our compiler<br />
IR<br />
Front End Back End<br />
Compiler<br />
−→ Target<br />
program<br />
In this project we will concentrate ourselves on the programming<br />
language minijava, a target architecture called MIPS (a RISC<br />
architecture) and a suitable <strong>intermediate</strong> representation.<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Structure of a compiler<br />
A compiler translates a program written in some programming<br />
language <strong>to</strong> <strong>code</strong> that can be executed on some machine.<br />
Source −→<br />
program<br />
Our compiler<br />
IR<br />
Front End Back End<br />
Compiler<br />
−→ Target<br />
program<br />
In this project we will concentrate ourselves on the programming<br />
language minijava, a target architecture called MIPS (a RISC<br />
architecture) and a suitable <strong>intermediate</strong> representation.<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
The front end<br />
Source program<br />
Lexicalanalyser<br />
Token stream<br />
Abstract syntax<br />
Parser<br />
<strong>Translation</strong><br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong><br />
Abstract syntax<br />
IR trees<br />
Static<br />
semantics
The front end<br />
Source program<br />
Lexicalanalyser<br />
Token stream<br />
Abstract syntax<br />
Parser<br />
<strong>Translation</strong><br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong><br />
Abstract syntax<br />
IR trees<br />
Static<br />
semantics
The front end<br />
Source program<br />
Lexicalanalyser<br />
Token stream<br />
Abstract syntax<br />
Parser<br />
<strong>Translation</strong><br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong><br />
Abstract syntax<br />
IR trees<br />
Static<br />
semantics
The front end<br />
Source program<br />
Lexicalanalyser<br />
Token stream<br />
Abstract syntax<br />
Parser<br />
<strong>Translation</strong><br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong><br />
Abstract syntax<br />
IR trees<br />
Static<br />
semantics
The front end<br />
Source program<br />
Lexicalanalyser<br />
Token stream<br />
Abstract syntax<br />
Parser<br />
<strong>Translation</strong><br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong><br />
Abstract syntax<br />
IR trees<br />
Static<br />
semantics
The front end<br />
Source program<br />
Lexicalanalyser<br />
Token stream<br />
Abstract syntax<br />
Parser<br />
<strong>Translation</strong><br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong><br />
Abstract syntax<br />
IR trees<br />
Static<br />
semantics
The front end<br />
Source program<br />
Lexicalanalyser<br />
Token stream<br />
Abstract syntax<br />
Parser<br />
<strong>Translation</strong><br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong><br />
Abstract syntax<br />
IR trees<br />
Static<br />
semantics
The front end<br />
Source program<br />
Lexicalanalyser<br />
Token stream<br />
Abstract syntax<br />
Parser<br />
<strong>Translation</strong><br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong><br />
Abstract syntax<br />
IR trees<br />
Static<br />
semantics
The front end<br />
Source program<br />
Lexicalanalyser<br />
Token stream<br />
Abstract syntax<br />
Parser<br />
<strong>Translation</strong><br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong><br />
Abstract syntax<br />
IR trees<br />
Static<br />
semantics
The front end<br />
Source program<br />
Lexicalanalyser<br />
Token stream<br />
Abstract syntax<br />
Parser<br />
<strong>Translation</strong><br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong><br />
Abstract syntax<br />
IR trees<br />
Static<br />
semantics
The translation phase<br />
Lexical, syntactical and contextual analysis are phases of all<br />
language processors of all computer languages (which we have<br />
exemplified with minijava).<br />
The translation phase is more dependent on the kind of<br />
computer language being processed.<br />
For programming languages it is taking a step <strong>to</strong>wards<br />
executable <strong>code</strong>.<br />
We will present some general techniques and abstractions for<br />
doing so.<br />
Note<br />
We will exemplify with minijava when possible. If minijava doesn’t<br />
have the feature we want <strong>to</strong> illustrate we will refer <strong>to</strong> some other<br />
programming language.<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
The translation phase<br />
Lexical, syntactical and contextual analysis are phases of all<br />
language processors of all computer languages (which we have<br />
exemplified with minijava).<br />
The translation phase is more dependent on the kind of<br />
computer language being processed.<br />
For programming languages it is taking a step <strong>to</strong>wards<br />
executable <strong>code</strong>.<br />
We will present some general techniques and abstractions for<br />
doing so.<br />
Note<br />
We will exemplify with minijava when possible. If minijava doesn’t<br />
have the feature we want <strong>to</strong> illustrate we will refer <strong>to</strong> some other<br />
programming language.<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
The translation phase<br />
Lexical, syntactical and contextual analysis are phases of all<br />
language processors of all computer languages (which we have<br />
exemplified with minijava).<br />
The translation phase is more dependent on the kind of<br />
computer language being processed.<br />
For programming languages it is taking a step <strong>to</strong>wards<br />
executable <strong>code</strong>.<br />
We will present some general techniques and abstractions for<br />
doing so.<br />
Note<br />
We will exemplify with minijava when possible. If minijava doesn’t<br />
have the feature we want <strong>to</strong> illustrate we will refer <strong>to</strong> some other<br />
programming language.<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
The translation phase<br />
Lexical, syntactical and contextual analysis are phases of all<br />
language processors of all computer languages (which we have<br />
exemplified with minijava).<br />
The translation phase is more dependent on the kind of<br />
computer language being processed.<br />
For programming languages it is taking a step <strong>to</strong>wards<br />
executable <strong>code</strong>.<br />
We will present some general techniques and abstractions for<br />
doing so.<br />
Note<br />
We will exemplify with minijava when possible. If minijava doesn’t<br />
have the feature we want <strong>to</strong> illustrate we will refer <strong>to</strong> some other<br />
programming language.<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
The translation phase<br />
Lexical, syntactical and contextual analysis are phases of all<br />
language processors of all computer languages (which we have<br />
exemplified with minijava).<br />
The translation phase is more dependent on the kind of<br />
computer language being processed.<br />
For programming languages it is taking a step <strong>to</strong>wards<br />
executable <strong>code</strong>.<br />
We will present some general techniques and abstractions for<br />
doing so.<br />
Note<br />
We will exemplify with minijava when possible. If minijava doesn’t<br />
have the feature we want <strong>to</strong> illustrate we will refer <strong>to</strong> some other<br />
programming language.<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
The translation phase<br />
Lexical, syntactical and contextual analysis are phases of all<br />
language processors of all computer languages (which we have<br />
exemplified with minijava).<br />
The translation phase is more dependent on the kind of<br />
computer language being processed.<br />
For programming languages it is taking a step <strong>to</strong>wards<br />
executable <strong>code</strong>.<br />
We will present some general techniques and abstractions for<br />
doing so.<br />
Note<br />
We will exemplify with minijava when possible. If minijava doesn’t<br />
have the feature we want <strong>to</strong> illustrate we will refer <strong>to</strong> some other<br />
programming language.<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
The translation phase<br />
We will present<br />
The abstract machine <strong>to</strong> be used.<br />
We present it as a language <strong>to</strong> write programs in (the<br />
instructions of the abstract machine).<br />
Because no person needs <strong>to</strong> program in it, we just present the<br />
abstract syntax!<br />
How <strong>to</strong> organize a translation <strong>to</strong> it.<br />
Some hints as <strong>to</strong> how <strong>to</strong> translate (some) the constructs of<br />
minijava <strong>to</strong> it.<br />
For the project<br />
you will get most of the material described here and will have <strong>to</strong><br />
complete the translation of the minijava constructs.<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
The translation phase<br />
We will present<br />
The abstract machine <strong>to</strong> be used.<br />
We present it as a language <strong>to</strong> write programs in (the<br />
instructions of the abstract machine).<br />
Because no person needs <strong>to</strong> program in it, we just present the<br />
abstract syntax!<br />
How <strong>to</strong> organize a translation <strong>to</strong> it.<br />
Some hints as <strong>to</strong> how <strong>to</strong> translate (some) the constructs of<br />
minijava <strong>to</strong> it.<br />
For the project<br />
you will get most of the material described here and will have <strong>to</strong><br />
complete the translation of the minijava constructs.<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
The translation phase<br />
We will present<br />
The abstract machine <strong>to</strong> be used.<br />
We present it as a language <strong>to</strong> write programs in (the<br />
instructions of the abstract machine).<br />
Because no person needs <strong>to</strong> program in it, we just present the<br />
abstract syntax!<br />
How <strong>to</strong> organize a translation <strong>to</strong> it.<br />
Some hints as <strong>to</strong> how <strong>to</strong> translate (some) the constructs of<br />
minijava <strong>to</strong> it.<br />
For the project<br />
you will get most of the material described here and will have <strong>to</strong><br />
complete the translation of the minijava constructs.<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
The translation phase<br />
We will present<br />
The abstract machine <strong>to</strong> be used.<br />
We present it as a language <strong>to</strong> write programs in (the<br />
instructions of the abstract machine).<br />
Because no person needs <strong>to</strong> program in it, we just present the<br />
abstract syntax!<br />
How <strong>to</strong> organize a translation <strong>to</strong> it.<br />
Some hints as <strong>to</strong> how <strong>to</strong> translate (some) the constructs of<br />
minijava <strong>to</strong> it.<br />
For the project<br />
you will get most of the material described here and will have <strong>to</strong><br />
complete the translation of the minijava constructs.<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
The translation phase<br />
We will present<br />
The abstract machine <strong>to</strong> be used.<br />
We present it as a language <strong>to</strong> write programs in (the<br />
instructions of the abstract machine).<br />
Because no person needs <strong>to</strong> program in it, we just present the<br />
abstract syntax!<br />
How <strong>to</strong> organize a translation <strong>to</strong> it.<br />
Some hints as <strong>to</strong> how <strong>to</strong> translate (some) the constructs of<br />
minijava <strong>to</strong> it.<br />
For the project<br />
you will get most of the material described here and will have <strong>to</strong><br />
complete the translation of the minijava constructs.<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
The translation phase<br />
We will present<br />
The abstract machine <strong>to</strong> be used.<br />
We present it as a language <strong>to</strong> write programs in (the<br />
instructions of the abstract machine).<br />
Because no person needs <strong>to</strong> program in it, we just present the<br />
abstract syntax!<br />
How <strong>to</strong> organize a translation <strong>to</strong> it.<br />
Some hints as <strong>to</strong> how <strong>to</strong> translate (some) the constructs of<br />
minijava <strong>to</strong> it.<br />
For the project<br />
you will get most of the material described here and will have <strong>to</strong><br />
complete the translation of the minijava constructs.<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
The translation phase<br />
We will present<br />
The abstract machine <strong>to</strong> be used.<br />
We present it as a language <strong>to</strong> write programs in (the<br />
instructions of the abstract machine).<br />
Because no person needs <strong>to</strong> program in it, we just present the<br />
abstract syntax!<br />
How <strong>to</strong> organize a translation <strong>to</strong> it.<br />
Some hints as <strong>to</strong> how <strong>to</strong> translate (some) the constructs of<br />
minijava <strong>to</strong> it.<br />
For the project<br />
you will get most of the material described here and will have <strong>to</strong><br />
complete the translation of the minijava constructs.<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Intermediate Representation<br />
The abstract syntax of the Abstract Machine language<br />
Must be convenient for the translation phase <strong>to</strong> produce.<br />
Must be convenient <strong>to</strong> translate in<strong>to</strong> machine language for the<br />
desired target machines.<br />
Each construct must have a clear and simple meaning so that<br />
optimizations that rewrite the <strong>intermediate</strong> representation can<br />
easily be specified and implemented.<br />
Notice<br />
Not always complicated pieces of abstract syntax correspond <strong>to</strong> the<br />
complex instructions that a target machine can execute!<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Intermediate Representation<br />
The abstract syntax of the Abstract Machine language<br />
Must be convenient for the translation phase <strong>to</strong> produce.<br />
Must be convenient <strong>to</strong> translate in<strong>to</strong> machine language for the<br />
desired target machines.<br />
Each construct must have a clear and simple meaning so that<br />
optimizations that rewrite the <strong>intermediate</strong> representation can<br />
easily be specified and implemented.<br />
Notice<br />
Not always complicated pieces of abstract syntax correspond <strong>to</strong> the<br />
complex instructions that a target machine can execute!<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Intermediate Representation<br />
The abstract syntax of the Abstract Machine language<br />
Must be convenient for the translation phase <strong>to</strong> produce.<br />
Must be convenient <strong>to</strong> translate in<strong>to</strong> machine language for the<br />
desired target machines.<br />
Each construct must have a clear and simple meaning so that<br />
optimizations that rewrite the <strong>intermediate</strong> representation can<br />
easily be specified and implemented.<br />
Notice<br />
Not always complicated pieces of abstract syntax correspond <strong>to</strong> the<br />
complex instructions that a target machine can execute!<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Intermediate Representation<br />
The abstract syntax of the Abstract Machine language<br />
Must be convenient for the translation phase <strong>to</strong> produce.<br />
Must be convenient <strong>to</strong> translate in<strong>to</strong> machine language for the<br />
desired target machines.<br />
Each construct must have a clear and simple meaning so that<br />
optimizations that rewrite the <strong>intermediate</strong> representation can<br />
easily be specified and implemented.<br />
Notice<br />
Not always complicated pieces of abstract syntax correspond <strong>to</strong> the<br />
complex instructions that a target machine can execute!<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Intermediate Representation<br />
The abstract syntax of the Abstract Machine language<br />
Must be convenient for the translation phase <strong>to</strong> produce.<br />
Must be convenient <strong>to</strong> translate in<strong>to</strong> machine language for the<br />
desired target machines.<br />
Each construct must have a clear and simple meaning so that<br />
optimizations that rewrite the <strong>intermediate</strong> representation can<br />
easily be specified and implemented.<br />
Notice<br />
Not always complicated pieces of abstract syntax correspond <strong>to</strong> the<br />
complex instructions that a target machine can execute!<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Intermediate Representation - Expressions<br />
constants<br />
const(i)<br />
labels<br />
name(n)<br />
registers<br />
temp(t)<br />
operations<br />
binop(o,e1,e2)<br />
The integer constant (i)<br />
The symbolic constant n corresponding <strong>to</strong><br />
an assembly label<br />
Temporary t, similar <strong>to</strong> a register, there is<br />
an infinite number of these<br />
Binary opera<strong>to</strong>r. e1 is evaluated before e2.<br />
o can be one of<br />
plus,minus,mul,div,and,or,xor,<br />
lshift,rshift,arshift<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Intermediate Representation - Expressions<br />
constants<br />
const(i)<br />
labels<br />
name(n)<br />
registers<br />
temp(t)<br />
operations<br />
binop(o,e1,e2)<br />
The integer constant (i)<br />
The symbolic constant n corresponding <strong>to</strong><br />
an assembly label<br />
Temporary t, similar <strong>to</strong> a register, there is<br />
an infinite number of these<br />
Binary opera<strong>to</strong>r. e1 is evaluated before e2.<br />
o can be one of<br />
plus,minus,mul,div,and,or,xor,<br />
lshift,rshift,arshift<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Intermediate Representation - Expressions<br />
constants<br />
const(i)<br />
labels<br />
name(n)<br />
registers<br />
temp(t)<br />
operations<br />
binop(o,e1,e2)<br />
The integer constant (i)<br />
The symbolic constant n corresponding <strong>to</strong><br />
an assembly label<br />
Temporary t, similar <strong>to</strong> a register, there is<br />
an infinite number of these<br />
Binary opera<strong>to</strong>r. e1 is evaluated before e2.<br />
o can be one of<br />
plus,minus,mul,div,and,or,xor,<br />
lshift,rshift,arshift<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Intermediate Representation - Expressions<br />
constants<br />
const(i)<br />
labels<br />
name(n)<br />
registers<br />
temp(t)<br />
operations<br />
binop(o,e1,e2)<br />
The integer constant (i)<br />
The symbolic constant n corresponding <strong>to</strong><br />
an assembly label<br />
Temporary t, similar <strong>to</strong> a register, there is<br />
an infinite number of these<br />
Binary opera<strong>to</strong>r. e1 is evaluated before e2.<br />
o can be one of<br />
plus,minus,mul,div,and,or,xor,<br />
lshift,rshift,arshift<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Intermediate Representation - Expressions<br />
constants<br />
const(i)<br />
labels<br />
name(n)<br />
registers<br />
temp(t)<br />
operations<br />
binop(o,e1,e2)<br />
The integer constant (i)<br />
The symbolic constant n corresponding <strong>to</strong><br />
an assembly label<br />
Temporary t, similar <strong>to</strong> a register, there is<br />
an infinite number of these<br />
Binary opera<strong>to</strong>r. e1 is evaluated before e2.<br />
o can be one of<br />
plus,minus,mul,div,and,or,xor,<br />
lshift,rshift,arshift<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Intermediate Representation - Expressions<br />
constants<br />
const(i)<br />
labels<br />
name(n)<br />
registers<br />
temp(t)<br />
operations<br />
binop(o,e1,e2)<br />
The integer constant (i)<br />
The symbolic constant n corresponding <strong>to</strong><br />
an assembly label<br />
Temporary t, similar <strong>to</strong> a register, there is<br />
an infinite number of these<br />
Binary opera<strong>to</strong>r. e1 is evaluated before e2.<br />
o can be one of<br />
plus,minus,mul,div,and,or,xor,<br />
lshift,rshift,arshift<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Intermediate Representation - Expressions<br />
constants<br />
const(i)<br />
labels<br />
name(n)<br />
registers<br />
temp(t)<br />
operations<br />
binop(o,e1,e2)<br />
The integer constant (i)<br />
The symbolic constant n corresponding <strong>to</strong><br />
an assembly label<br />
Temporary t, similar <strong>to</strong> a register, there is<br />
an infinite number of these<br />
Binary opera<strong>to</strong>r. e1 is evaluated before e2.<br />
o can be one of<br />
plus,minus,mul,div,and,or,xor,<br />
lshift,rshift,arshift<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Intermediate Representation - Expressions<br />
constants<br />
const(i)<br />
labels<br />
name(n)<br />
registers<br />
temp(t)<br />
operations<br />
binop(o,e1,e2)<br />
The integer constant (i)<br />
The symbolic constant n corresponding <strong>to</strong><br />
an assembly label<br />
Temporary t, similar <strong>to</strong> a register, there is<br />
an infinite number of these<br />
Binary opera<strong>to</strong>r. e1 is evaluated before e2.<br />
o can be one of<br />
plus,minus,mul,div,and,or,xor,<br />
lshift,rshift,arshift<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Intermediate Representation - Expressions<br />
constants<br />
const(i)<br />
labels<br />
name(n)<br />
registers<br />
temp(t)<br />
operations<br />
binop(o,e1,e2)<br />
The integer constant (i)<br />
The symbolic constant n corresponding <strong>to</strong><br />
an assembly label<br />
Temporary t, similar <strong>to</strong> a register, there is<br />
an infinite number of these<br />
Binary opera<strong>to</strong>r. e1 is evaluated before e2.<br />
o can be one of<br />
plus,minus,mul,div,and,or,xor,<br />
lshift,rshift,arshift<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Intermediate Representation - Expressions<br />
constants<br />
const(i)<br />
labels<br />
name(n)<br />
registers<br />
temp(t)<br />
operations<br />
binop(o,e1,e2)<br />
The integer constant (i)<br />
The symbolic constant n corresponding <strong>to</strong><br />
an assembly label<br />
Temporary t, similar <strong>to</strong> a register, there is<br />
an infinite number of these<br />
Binary opera<strong>to</strong>r. e1 is evaluated before e2.<br />
o can be one of<br />
plus,minus,mul,div,and,or,xor,<br />
lshift,rshift,arshift<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Intermediate Representation - Expressions<br />
constants<br />
const(i)<br />
labels<br />
name(n)<br />
registers<br />
temp(t)<br />
operations<br />
binop(o,e1,e2)<br />
The integer constant (i)<br />
The symbolic constant n corresponding <strong>to</strong><br />
an assembly label<br />
Temporary t, similar <strong>to</strong> a register, there is<br />
an infinite number of these<br />
Binary opera<strong>to</strong>r. e1 is evaluated before e2.<br />
o can be one of<br />
plus,minus,mul,div,and,or,xor,<br />
lshift,rshift,arshift<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Intermediate Representation - Expressions<br />
constants<br />
const(i)<br />
labels<br />
name(n)<br />
registers<br />
temp(t)<br />
operations<br />
binop(o,e1,e2)<br />
The integer constant (i)<br />
The symbolic constant n corresponding <strong>to</strong><br />
an assembly label<br />
Temporary t, similar <strong>to</strong> a register, there is<br />
an infinite number of these<br />
Binary opera<strong>to</strong>r. e1 is evaluated before e2.<br />
o can be one of<br />
plus,minus,mul,div,and,or,xor,<br />
lshift,rshift,arshift<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Intermediate Representation - Expressions<br />
constants<br />
const(i)<br />
labels<br />
name(n)<br />
registers<br />
temp(t)<br />
operations<br />
binop(o,e1,e2)<br />
The integer constant (i)<br />
The symbolic constant n corresponding <strong>to</strong><br />
an assembly label<br />
Temporary t, similar <strong>to</strong> a register, there is<br />
an infinite number of these<br />
Binary opera<strong>to</strong>r. e1 is evaluated before e2.<br />
o can be one of<br />
plus,minus,mul,div,and,or,xor,<br />
lshift,rshift,arshift<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Intermediate Representation - Expressions<br />
constants<br />
const(i)<br />
labels<br />
name(n)<br />
registers<br />
temp(t)<br />
operations<br />
binop(o,e1,e2)<br />
The integer constant (i)<br />
The symbolic constant n corresponding <strong>to</strong><br />
an assembly label<br />
Temporary t, similar <strong>to</strong> a register, there is<br />
an infinite number of these<br />
Binary opera<strong>to</strong>r. e1 is evaluated before e2.<br />
o can be one of<br />
plus,minus,mul,div,and,or,xor,<br />
lshift,rshift,arshift<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Intermediate Representation - Expressions<br />
constants<br />
const(i)<br />
labels<br />
name(n)<br />
registers<br />
temp(t)<br />
operations<br />
binop(o,e1,e2)<br />
The integer constant (i)<br />
The symbolic constant n corresponding <strong>to</strong><br />
an assembly label<br />
Temporary t, similar <strong>to</strong> a register, there is<br />
an infinite number of these<br />
Binary opera<strong>to</strong>r. e1 is evaluated before e2.<br />
o can be one of<br />
plus,minus,mul,div,and,or,xor,<br />
lshift,rshift,arshift<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Intermediate Representation - Expressions<br />
constants<br />
const(i)<br />
labels<br />
name(n)<br />
registers<br />
temp(t)<br />
operations<br />
binop(o,e1,e2)<br />
The integer constant (i)<br />
The symbolic constant n corresponding <strong>to</strong><br />
an assembly label<br />
Temporary t, similar <strong>to</strong> a register, there is<br />
an infinite number of these<br />
Binary opera<strong>to</strong>r. e1 is evaluated before e2.<br />
o can be one of<br />
plus,minus,mul,div,and,or,xor,<br />
lshift,rshift,arshift<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Intermediate Representation - Expressions<br />
constants<br />
const(i)<br />
labels<br />
name(n)<br />
registers<br />
temp(t)<br />
operations<br />
binop(o,e1,e2)<br />
The integer constant (i)<br />
The symbolic constant n corresponding <strong>to</strong><br />
an assembly label<br />
Temporary t, similar <strong>to</strong> a register, there is<br />
an infinite number of these<br />
Binary opera<strong>to</strong>r. e1 is evaluated before e2.<br />
o can be one of<br />
plus,minus,mul,div,and,or,xor,<br />
lshift,rshift,arshift<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Intermediate Representation - Expressions<br />
constants<br />
const(i)<br />
labels<br />
name(n)<br />
registers<br />
temp(t)<br />
operations<br />
binop(o,e1,e2)<br />
The integer constant (i)<br />
The symbolic constant n corresponding <strong>to</strong><br />
an assembly label<br />
Temporary t, similar <strong>to</strong> a register, there is<br />
an infinite number of these<br />
Binary opera<strong>to</strong>r. e1 is evaluated before e2.<br />
o can be one of<br />
plus,minus,mul,div,and,or,xor,<br />
lshift,rshift,arshift<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Intermediate Representation - Expressions<br />
constants<br />
const(i)<br />
labels<br />
name(n)<br />
registers<br />
temp(t)<br />
operations<br />
binop(o,e1,e2)<br />
The integer constant (i)<br />
The symbolic constant n corresponding <strong>to</strong><br />
an assembly label<br />
Temporary t, similar <strong>to</strong> a register, there is<br />
an infinite number of these<br />
Binary opera<strong>to</strong>r. e1 is evaluated before e2.<br />
o can be one of<br />
plus,minus,mul,div,and,or,xor,<br />
lshift,rshift,arshift<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Intermediate Representation - Expressions<br />
constants<br />
const(i)<br />
labels<br />
name(n)<br />
registers<br />
temp(t)<br />
operations<br />
binop(o,e1,e2)<br />
The integer constant (i)<br />
The symbolic constant n corresponding <strong>to</strong><br />
an assembly label<br />
Temporary t, similar <strong>to</strong> a register, there is<br />
an infinite number of these<br />
Binary opera<strong>to</strong>r. e1 is evaluated before e2.<br />
o can be one of<br />
plus,minus,mul,div,and,or,xor,<br />
lshift,rshift,arshift<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Intermediate Representation - Expressions<br />
memory<br />
mem(e)<br />
function call<br />
call(f,l)<br />
statement/value<br />
eseq(s,e)<br />
The content of wordSize bytes of memory<br />
starting at address e<br />
f is evaluated before l which is evaluated<br />
from left <strong>to</strong> right<br />
The statement s is evaluated for side<br />
effects, then e is evaluated for the result<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Intermediate Representation - Expressions<br />
memory<br />
mem(e)<br />
function call<br />
call(f,l)<br />
statement/value<br />
eseq(s,e)<br />
The content of wordSize bytes of memory<br />
starting at address e<br />
f is evaluated before l which is evaluated<br />
from left <strong>to</strong> right<br />
The statement s is evaluated for side<br />
effects, then e is evaluated for the result<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Intermediate Representation - Expressions<br />
memory<br />
mem(e)<br />
function call<br />
call(f,l)<br />
statement/value<br />
eseq(s,e)<br />
The content of wordSize bytes of memory<br />
starting at address e<br />
f is evaluated before l which is evaluated<br />
from left <strong>to</strong> right<br />
The statement s is evaluated for side<br />
effects, then e is evaluated for the result<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Intermediate Representation - Expressions<br />
memory<br />
mem(e)<br />
function call<br />
call(f,l)<br />
statement/value<br />
eseq(s,e)<br />
The content of wordSize bytes of memory<br />
starting at address e<br />
f is evaluated before l which is evaluated<br />
from left <strong>to</strong> right<br />
The statement s is evaluated for side<br />
effects, then e is evaluated for the result<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Intermediate Representation - Expressions<br />
memory<br />
mem(e)<br />
function call<br />
call(f,l)<br />
statement/value<br />
eseq(s,e)<br />
The content of wordSize bytes of memory<br />
starting at address e<br />
f is evaluated before l which is evaluated<br />
from left <strong>to</strong> right<br />
The statement s is evaluated for side<br />
effects, then e is evaluated for the result<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Intermediate Representation - Expressions<br />
memory<br />
mem(e)<br />
function call<br />
call(f,l)<br />
statement/value<br />
eseq(s,e)<br />
The content of wordSize bytes of memory<br />
starting at address e<br />
f is evaluated before l which is evaluated<br />
from left <strong>to</strong> right<br />
The statement s is evaluated for side<br />
effects, then e is evaluated for the result<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Intermediate Representation - Expressions<br />
memory<br />
mem(e)<br />
function call<br />
call(f,l)<br />
statement/value<br />
eseq(s,e)<br />
The content of wordSize bytes of memory<br />
starting at address e<br />
f is evaluated before l which is evaluated<br />
from left <strong>to</strong> right<br />
The statement s is evaluated for side<br />
effects, then e is evaluated for the result<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Intermediate Representation - Expressions<br />
memory<br />
mem(e)<br />
function call<br />
call(f,l)<br />
statement/value<br />
eseq(s,e)<br />
The content of wordSize bytes of memory<br />
starting at address e<br />
f is evaluated before l which is evaluated<br />
from left <strong>to</strong> right<br />
The statement s is evaluated for side<br />
effects, then e is evaluated for the result<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Intermediate Representation - Expressions<br />
memory<br />
mem(e)<br />
function call<br />
call(f,l)<br />
statement/value<br />
eseq(s,e)<br />
The content of wordSize bytes of memory<br />
starting at address e<br />
f is evaluated before l which is evaluated<br />
from left <strong>to</strong> right<br />
The statement s is evaluated for side<br />
effects, then e is evaluated for the result<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Intermediate Representation - Expressions<br />
memory<br />
mem(e)<br />
function call<br />
call(f,l)<br />
statement/value<br />
eseq(s,e)<br />
The content of wordSize bytes of memory<br />
starting at address e<br />
f is evaluated before l which is evaluated<br />
from left <strong>to</strong> right<br />
The statement s is evaluated for side<br />
effects, then e is evaluated for the result<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Intermediate Representation - Expressions<br />
memory<br />
mem(e)<br />
function call<br />
call(f,l)<br />
statement/value<br />
eseq(s,e)<br />
The content of wordSize bytes of memory<br />
starting at address e<br />
f is evaluated before l which is evaluated<br />
from left <strong>to</strong> right<br />
The statement s is evaluated for side<br />
effects, then e is evaluated for the result<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Intermediate Representation - Expressions<br />
memory<br />
mem(e)<br />
function call<br />
call(f,l)<br />
statement/value<br />
eseq(s,e)<br />
The content of wordSize bytes of memory<br />
starting at address e<br />
f is evaluated before l which is evaluated<br />
from left <strong>to</strong> right<br />
The statement s is evaluated for side<br />
effects, then e is evaluated for the result<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Intermediate Representation - Expressions<br />
memory<br />
mem(e)<br />
function call<br />
call(f,l)<br />
statement/value<br />
eseq(s,e)<br />
The content of wordSize bytes of memory<br />
starting at address e<br />
f is evaluated before l which is evaluated<br />
from left <strong>to</strong> right<br />
The statement s is evaluated for side<br />
effects, then e is evaluated for the result<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Intermediate Representation - Expressions<br />
memory<br />
mem(e)<br />
function call<br />
call(f,l)<br />
statement/value<br />
eseq(s,e)<br />
The content of wordSize bytes of memory<br />
starting at address e<br />
f is evaluated before l which is evaluated<br />
from left <strong>to</strong> right<br />
The statement s is evaluated for side<br />
effects, then e is evaluated for the result<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Intermediate Representation - Expressions<br />
memory<br />
mem(e)<br />
function call<br />
call(f,l)<br />
statement/value<br />
eseq(s,e)<br />
The content of wordSize bytes of memory<br />
starting at address e<br />
f is evaluated before l which is evaluated<br />
from left <strong>to</strong> right<br />
The statement s is evaluated for side<br />
effects, then e is evaluated for the result<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Intermediate Representation - Statements<br />
move<br />
move(temp(t),e)<br />
move<br />
move(mem(e1),e2)<br />
discard<br />
exp(e)<br />
labeling<br />
label(n)<br />
Evaluate e and move the value <strong>to</strong> t<br />
Evaluate e1 <strong>to</strong> memory address a, then<br />
evaluate e2 and s<strong>to</strong>re its value in wordSize<br />
bytes after a<br />
Evaluate e and discard the result<br />
mark the current machine <strong>code</strong> address<br />
with name n<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Intermediate Representation - Statements<br />
move<br />
move(temp(t),e)<br />
move<br />
move(mem(e1),e2)<br />
discard<br />
exp(e)<br />
labeling<br />
label(n)<br />
Evaluate e and move the value <strong>to</strong> t<br />
Evaluate e1 <strong>to</strong> memory address a, then<br />
evaluate e2 and s<strong>to</strong>re its value in wordSize<br />
bytes after a<br />
Evaluate e and discard the result<br />
mark the current machine <strong>code</strong> address<br />
with name n<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Intermediate Representation - Statements<br />
move<br />
move(temp(t),e)<br />
move<br />
move(mem(e1),e2)<br />
discard<br />
exp(e)<br />
labeling<br />
label(n)<br />
Evaluate e and move the value <strong>to</strong> t<br />
Evaluate e1 <strong>to</strong> memory address a, then<br />
evaluate e2 and s<strong>to</strong>re its value in wordSize<br />
bytes after a<br />
Evaluate e and discard the result<br />
mark the current machine <strong>code</strong> address<br />
with name n<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Intermediate Representation - Statements<br />
move<br />
move(temp(t),e)<br />
move<br />
move(mem(e1),e2)<br />
discard<br />
exp(e)<br />
labeling<br />
label(n)<br />
Evaluate e and move the value <strong>to</strong> t<br />
Evaluate e1 <strong>to</strong> memory address a, then<br />
evaluate e2 and s<strong>to</strong>re its value in wordSize<br />
bytes after a<br />
Evaluate e and discard the result<br />
mark the current machine <strong>code</strong> address<br />
with name n<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Intermediate Representation - Statements<br />
move<br />
move(temp(t),e)<br />
move<br />
move(mem(e1),e2)<br />
discard<br />
exp(e)<br />
labeling<br />
label(n)<br />
Evaluate e and move the value <strong>to</strong> t<br />
Evaluate e1 <strong>to</strong> memory address a, then<br />
evaluate e2 and s<strong>to</strong>re its value in wordSize<br />
bytes after a<br />
Evaluate e and discard the result<br />
mark the current machine <strong>code</strong> address<br />
with name n<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Intermediate Representation - Statements<br />
move<br />
move(temp(t),e)<br />
move<br />
move(mem(e1),e2)<br />
discard<br />
exp(e)<br />
labeling<br />
label(n)<br />
Evaluate e and move the value <strong>to</strong> t<br />
Evaluate e1 <strong>to</strong> memory address a, then<br />
evaluate e2 and s<strong>to</strong>re its value in wordSize<br />
bytes after a<br />
Evaluate e and discard the result<br />
mark the current machine <strong>code</strong> address<br />
with name n<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Intermediate Representation - Statements<br />
move<br />
move(temp(t),e)<br />
move<br />
move(mem(e1),e2)<br />
discard<br />
exp(e)<br />
labeling<br />
label(n)<br />
Evaluate e and move the value <strong>to</strong> t<br />
Evaluate e1 <strong>to</strong> memory address a, then<br />
evaluate e2 and s<strong>to</strong>re its value in wordSize<br />
bytes after a<br />
Evaluate e and discard the result<br />
mark the current machine <strong>code</strong> address<br />
with name n<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Intermediate Representation - Statements<br />
move<br />
move(temp(t),e)<br />
move<br />
move(mem(e1),e2)<br />
discard<br />
exp(e)<br />
labeling<br />
label(n)<br />
Evaluate e and move the value <strong>to</strong> t<br />
Evaluate e1 <strong>to</strong> memory address a, then<br />
evaluate e2 and s<strong>to</strong>re its value in wordSize<br />
bytes after a<br />
Evaluate e and discard the result<br />
mark the current machine <strong>code</strong> address<br />
with name n<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Intermediate Representation - Statements<br />
move<br />
move(temp(t),e)<br />
move<br />
move(mem(e1),e2)<br />
discard<br />
exp(e)<br />
labeling<br />
label(n)<br />
Evaluate e and move the value <strong>to</strong> t<br />
Evaluate e1 <strong>to</strong> memory address a, then<br />
evaluate e2 and s<strong>to</strong>re its value in wordSize<br />
bytes after a<br />
Evaluate e and discard the result<br />
mark the current machine <strong>code</strong> address<br />
with name n<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Intermediate Representation - Statements<br />
move<br />
move(temp(t),e)<br />
move<br />
move(mem(e1),e2)<br />
discard<br />
exp(e)<br />
labeling<br />
label(n)<br />
Evaluate e and move the value <strong>to</strong> t<br />
Evaluate e1 <strong>to</strong> memory address a, then<br />
evaluate e2 and s<strong>to</strong>re its value in wordSize<br />
bytes after a<br />
Evaluate e and discard the result<br />
mark the current machine <strong>code</strong> address<br />
with name n<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Intermediate Representation - Statements<br />
move<br />
move(temp(t),e)<br />
move<br />
move(mem(e1),e2)<br />
discard<br />
exp(e)<br />
labeling<br />
label(n)<br />
Evaluate e and move the value <strong>to</strong> t<br />
Evaluate e1 <strong>to</strong> memory address a, then<br />
evaluate e2 and s<strong>to</strong>re its value in wordSize<br />
bytes after a<br />
Evaluate e and discard the result<br />
mark the current machine <strong>code</strong> address<br />
with name n<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Intermediate Representation - Statements<br />
move<br />
move(temp(t),e)<br />
move<br />
move(mem(e1),e2)<br />
discard<br />
exp(e)<br />
labeling<br />
label(n)<br />
Evaluate e and move the value <strong>to</strong> t<br />
Evaluate e1 <strong>to</strong> memory address a, then<br />
evaluate e2 and s<strong>to</strong>re its value in wordSize<br />
bytes after a<br />
Evaluate e and discard the result<br />
mark the current machine <strong>code</strong> address<br />
with name n<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Intermediate Representation - Statements<br />
move<br />
move(temp(t),e)<br />
move<br />
move(mem(e1),e2)<br />
discard<br />
exp(e)<br />
labeling<br />
label(n)<br />
Evaluate e and move the value <strong>to</strong> t<br />
Evaluate e1 <strong>to</strong> memory address a, then<br />
evaluate e2 and s<strong>to</strong>re its value in wordSize<br />
bytes after a<br />
Evaluate e and discard the result<br />
mark the current machine <strong>code</strong> address<br />
with name n<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Intermediate Representation - Statements<br />
move<br />
move(temp(t),e)<br />
move<br />
move(mem(e1),e2)<br />
discard<br />
exp(e)<br />
labeling<br />
label(n)<br />
Evaluate e and move the value <strong>to</strong> t<br />
Evaluate e1 <strong>to</strong> memory address a, then<br />
evaluate e2 and s<strong>to</strong>re its value in wordSize<br />
bytes after a<br />
Evaluate e and discard the result<br />
mark the current machine <strong>code</strong> address<br />
with name n<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Intermediate Representation - Statements<br />
move<br />
move(temp(t),e)<br />
move<br />
move(mem(e1),e2)<br />
discard<br />
exp(e)<br />
labeling<br />
label(n)<br />
Evaluate e and move the value <strong>to</strong> t<br />
Evaluate e1 <strong>to</strong> memory address a, then<br />
evaluate e2 and s<strong>to</strong>re its value in wordSize<br />
bytes after a<br />
Evaluate e and discard the result<br />
mark the current machine <strong>code</strong> address<br />
with name n<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Intermediate Representation - Statements<br />
move<br />
move(temp(t),e)<br />
move<br />
move(mem(e1),e2)<br />
discard<br />
exp(e)<br />
labeling<br />
label(n)<br />
Evaluate e and move the value <strong>to</strong> t<br />
Evaluate e1 <strong>to</strong> memory address a, then<br />
evaluate e2 and s<strong>to</strong>re its value in wordSize<br />
bytes after a<br />
Evaluate e and discard the result<br />
mark the current machine <strong>code</strong> address<br />
with name n<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Intermediate Representation - Statements<br />
move<br />
move(temp(t),e)<br />
move<br />
move(mem(e1),e2)<br />
discard<br />
exp(e)<br />
labeling<br />
label(n)<br />
Evaluate e and move the value <strong>to</strong> t<br />
Evaluate e1 <strong>to</strong> memory address a, then<br />
evaluate e2 and s<strong>to</strong>re its value in wordSize<br />
bytes after a<br />
Evaluate e and discard the result<br />
mark the current machine <strong>code</strong> address<br />
with name n<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Intermediate Representation - Statements<br />
move<br />
move(temp(t),e)<br />
move<br />
move(mem(e1),e2)<br />
discard<br />
exp(e)<br />
labeling<br />
label(n)<br />
Evaluate e and move the value <strong>to</strong> t<br />
Evaluate e1 <strong>to</strong> memory address a, then<br />
evaluate e2 and s<strong>to</strong>re its value in wordSize<br />
bytes after a<br />
Evaluate e and discard the result<br />
mark the current machine <strong>code</strong> address<br />
with name n<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Intermediate Representation - Statements<br />
move<br />
move(temp(t),e)<br />
move<br />
move(mem(e1),e2)<br />
discard<br />
exp(e)<br />
labeling<br />
label(n)<br />
Evaluate e and move the value <strong>to</strong> t<br />
Evaluate e1 <strong>to</strong> memory address a, then<br />
evaluate e2 and s<strong>to</strong>re its value in wordSize<br />
bytes after a<br />
Evaluate e and discard the result<br />
mark the current machine <strong>code</strong> address<br />
with name n<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Intermediate Representation - Statements<br />
move<br />
move(temp(t),e)<br />
move<br />
move(mem(e1),e2)<br />
discard<br />
exp(e)<br />
labeling<br />
label(n)<br />
Evaluate e and move the value <strong>to</strong> t<br />
Evaluate e1 <strong>to</strong> memory address a, then<br />
evaluate e2 and s<strong>to</strong>re its value in wordSize<br />
bytes after a<br />
Evaluate e and discard the result<br />
mark the current machine <strong>code</strong> address<br />
with name n<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Intermediate Representation - Statements<br />
jump<br />
jump(e,labs)<br />
conditional jump<br />
cjump(o,e1,e2,t,f)<br />
sequence<br />
seq(s1,s2)<br />
Transfer control <strong>to</strong> address e. labs specifies<br />
all the locations e can evaluate <strong>to</strong> (needed<br />
later in the compiler)<br />
Evaluate e1 then e2 and then apply the<br />
binop o. If true jump <strong>to</strong> t else jump <strong>to</strong> f<br />
s1 followed by s2<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Intermediate Representation - Statements<br />
jump<br />
jump(e,labs)<br />
conditional jump<br />
cjump(o,e1,e2,t,f)<br />
sequence<br />
seq(s1,s2)<br />
Transfer control <strong>to</strong> address e. labs specifies<br />
all the locations e can evaluate <strong>to</strong> (needed<br />
later in the compiler)<br />
Evaluate e1 then e2 and then apply the<br />
binop o. If true jump <strong>to</strong> t else jump <strong>to</strong> f<br />
s1 followed by s2<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Intermediate Representation - Statements<br />
jump<br />
jump(e,labs)<br />
conditional jump<br />
cjump(o,e1,e2,t,f)<br />
sequence<br />
seq(s1,s2)<br />
Transfer control <strong>to</strong> address e. labs specifies<br />
all the locations e can evaluate <strong>to</strong> (needed<br />
later in the compiler)<br />
Evaluate e1 then e2 and then apply the<br />
binop o. If true jump <strong>to</strong> t else jump <strong>to</strong> f<br />
s1 followed by s2<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Intermediate Representation - Statements<br />
jump<br />
jump(e,labs)<br />
conditional jump<br />
cjump(o,e1,e2,t,f)<br />
sequence<br />
seq(s1,s2)<br />
Transfer control <strong>to</strong> address e. labs specifies<br />
all the locations e can evaluate <strong>to</strong> (needed<br />
later in the compiler)<br />
Evaluate e1 then e2 and then apply the<br />
binop o. If true jump <strong>to</strong> t else jump <strong>to</strong> f<br />
s1 followed by s2<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Intermediate Representation - Statements<br />
jump<br />
jump(e,labs)<br />
conditional jump<br />
cjump(o,e1,e2,t,f)<br />
sequence<br />
seq(s1,s2)<br />
Transfer control <strong>to</strong> address e. labs specifies<br />
all the locations e can evaluate <strong>to</strong> (needed<br />
later in the compiler)<br />
Evaluate e1 then e2 and then apply the<br />
binop o. If true jump <strong>to</strong> t else jump <strong>to</strong> f<br />
s1 followed by s2<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Intermediate Representation - Statements<br />
jump<br />
jump(e,labs)<br />
conditional jump<br />
cjump(o,e1,e2,t,f)<br />
sequence<br />
seq(s1,s2)<br />
Transfer control <strong>to</strong> address e. labs specifies<br />
all the locations e can evaluate <strong>to</strong> (needed<br />
later in the compiler)<br />
Evaluate e1 then e2 and then apply the<br />
binop o. If true jump <strong>to</strong> t else jump <strong>to</strong> f<br />
s1 followed by s2<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Intermediate Representation - Statements<br />
jump<br />
jump(e,labs)<br />
conditional jump<br />
cjump(o,e1,e2,t,f)<br />
sequence<br />
seq(s1,s2)<br />
Transfer control <strong>to</strong> address e. labs specifies<br />
all the locations e can evaluate <strong>to</strong> (needed<br />
later in the compiler)<br />
Evaluate e1 then e2 and then apply the<br />
binop o. If true jump <strong>to</strong> t else jump <strong>to</strong> f<br />
s1 followed by s2<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Intermediate Representation - Statements<br />
jump<br />
jump(e,labs)<br />
conditional jump<br />
cjump(o,e1,e2,t,f)<br />
sequence<br />
seq(s1,s2)<br />
Transfer control <strong>to</strong> address e. labs specifies<br />
all the locations e can evaluate <strong>to</strong> (needed<br />
later in the compiler)<br />
Evaluate e1 then e2 and then apply the<br />
binop o. If true jump <strong>to</strong> t else jump <strong>to</strong> f<br />
s1 followed by s2<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Intermediate Representation - Statements<br />
jump<br />
jump(e,labs)<br />
conditional jump<br />
cjump(o,e1,e2,t,f)<br />
sequence<br />
seq(s1,s2)<br />
Transfer control <strong>to</strong> address e. labs specifies<br />
all the locations e can evaluate <strong>to</strong> (needed<br />
later in the compiler)<br />
Evaluate e1 then e2 and then apply the<br />
binop o. If true jump <strong>to</strong> t else jump <strong>to</strong> f<br />
s1 followed by s2<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Intermediate Representation - Statements<br />
jump<br />
jump(e,labs)<br />
conditional jump<br />
cjump(o,e1,e2,t,f)<br />
sequence<br />
seq(s1,s2)<br />
Transfer control <strong>to</strong> address e. labs specifies<br />
all the locations e can evaluate <strong>to</strong> (needed<br />
later in the compiler)<br />
Evaluate e1 then e2 and then apply the<br />
binop o. If true jump <strong>to</strong> t else jump <strong>to</strong> f<br />
s1 followed by s2<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Intermediate Representation - Statements<br />
jump<br />
jump(e,labs)<br />
conditional jump<br />
cjump(o,e1,e2,t,f)<br />
sequence<br />
seq(s1,s2)<br />
Transfer control <strong>to</strong> address e. labs specifies<br />
all the locations e can evaluate <strong>to</strong> (needed<br />
later in the compiler)<br />
Evaluate e1 then e2 and then apply the<br />
binop o. If true jump <strong>to</strong> t else jump <strong>to</strong> f<br />
s1 followed by s2<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Intermediate Representation - Statements<br />
jump<br />
jump(e,labs)<br />
conditional jump<br />
cjump(o,e1,e2,t,f)<br />
sequence<br />
seq(s1,s2)<br />
Transfer control <strong>to</strong> address e. labs specifies<br />
all the locations e can evaluate <strong>to</strong> (needed<br />
later in the compiler)<br />
Evaluate e1 then e2 and then apply the<br />
binop o. If true jump <strong>to</strong> t else jump <strong>to</strong> f<br />
s1 followed by s2<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Intermediate Representation - Statements<br />
jump<br />
jump(e,labs)<br />
conditional jump<br />
cjump(o,e1,e2,t,f)<br />
sequence<br />
seq(s1,s2)<br />
Transfer control <strong>to</strong> address e. labs specifies<br />
all the locations e can evaluate <strong>to</strong> (needed<br />
later in the compiler)<br />
Evaluate e1 then e2 and then apply the<br />
binop o. If true jump <strong>to</strong> t else jump <strong>to</strong> f<br />
s1 followed by s2<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Intermediate Representation - Statements<br />
jump<br />
jump(e,labs)<br />
conditional jump<br />
cjump(o,e1,e2,t,f)<br />
sequence<br />
seq(s1,s2)<br />
Transfer control <strong>to</strong> address e. labs specifies<br />
all the locations e can evaluate <strong>to</strong> (needed<br />
later in the compiler)<br />
Evaluate e1 then e2 and then apply the<br />
binop o. If true jump <strong>to</strong> t else jump <strong>to</strong> f<br />
s1 followed by s2<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Intermediate Representation - Statements<br />
jump<br />
jump(e,labs)<br />
conditional jump<br />
cjump(o,e1,e2,t,f)<br />
sequence<br />
seq(s1,s2)<br />
Transfer control <strong>to</strong> address e. labs specifies<br />
all the locations e can evaluate <strong>to</strong> (needed<br />
later in the compiler)<br />
Evaluate e1 then e2 and then apply the<br />
binop o. If true jump <strong>to</strong> t else jump <strong>to</strong> f<br />
s1 followed by s2<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Organizing the <strong>Translation</strong> - remarks<br />
We will define a visi<strong>to</strong>r class that builds the translation of a<br />
(minijava) program <strong>to</strong> its representation in <strong>intermediate</strong><br />
representation.<br />
Because a program consists of some declarations (in minijava<br />
mainclass classdeclarations) the output will be a collection of<br />
processed declarations.<br />
Because there are no function or class declarations in the<br />
<strong>intermediate</strong> representation, the output will consist of a list of<br />
fragments.<br />
Fragment<br />
the translation of the function’s <strong>code</strong> (a statement) including<br />
placing the returned value in a dedicated register.<br />
frame structure describing the memory needed for a function call.<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Organizing the <strong>Translation</strong> - remarks<br />
We will define a visi<strong>to</strong>r class that builds the translation of a<br />
(minijava) program <strong>to</strong> its representation in <strong>intermediate</strong><br />
representation.<br />
Because a program consists of some declarations (in minijava<br />
mainclass classdeclarations) the output will be a collection of<br />
processed declarations.<br />
Because there are no function or class declarations in the<br />
<strong>intermediate</strong> representation, the output will consist of a list of<br />
fragments.<br />
Fragment<br />
the translation of the function’s <strong>code</strong> (a statement) including<br />
placing the returned value in a dedicated register.<br />
frame structure describing the memory needed for a function call.<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Organizing the <strong>Translation</strong> - remarks<br />
We will define a visi<strong>to</strong>r class that builds the translation of a<br />
(minijava) program <strong>to</strong> its representation in <strong>intermediate</strong><br />
representation.<br />
Because a program consists of some declarations (in minijava<br />
mainclass classdeclarations) the output will be a collection of<br />
processed declarations.<br />
Because there are no function or class declarations in the<br />
<strong>intermediate</strong> representation, the output will consist of a list of<br />
fragments.<br />
Fragment<br />
the translation of the function’s <strong>code</strong> (a statement) including<br />
placing the returned value in a dedicated register.<br />
frame structure describing the memory needed for a function call.<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Organizing the <strong>Translation</strong> - remarks<br />
We will define a visi<strong>to</strong>r class that builds the translation of a<br />
(minijava) program <strong>to</strong> its representation in <strong>intermediate</strong><br />
representation.<br />
Because a program consists of some declarations (in minijava<br />
mainclass classdeclarations) the output will be a collection of<br />
processed declarations.<br />
Because there are no function or class declarations in the<br />
<strong>intermediate</strong> representation, the output will consist of a list of<br />
fragments.<br />
Fragment<br />
the translation of the function’s <strong>code</strong> (a statement) including<br />
placing the returned value in a dedicated register.<br />
frame structure describing the memory needed for a function call.<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Organizing the <strong>Translation</strong> - remarks<br />
We will define a visi<strong>to</strong>r class that builds the translation of a<br />
(minijava) program <strong>to</strong> its representation in <strong>intermediate</strong><br />
representation.<br />
Because a program consists of some declarations (in minijava<br />
mainclass classdeclarations) the output will be a collection of<br />
processed declarations.<br />
Because there are no function or class declarations in the<br />
<strong>intermediate</strong> representation, the output will consist of a list of<br />
fragments.<br />
Fragment<br />
the translation of the function’s <strong>code</strong> (a statement) including<br />
placing the returned value in a dedicated register.<br />
frame structure describing the memory needed for a function call.<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Organizing the <strong>Translation</strong> - remarks<br />
We will define a visi<strong>to</strong>r class that builds the translation of a<br />
(minijava) program <strong>to</strong> its representation in <strong>intermediate</strong><br />
representation.<br />
Because a program consists of some declarations (in minijava<br />
mainclass classdeclarations) the output will be a collection of<br />
processed declarations.<br />
Because there are no function or class declarations in the<br />
<strong>intermediate</strong> representation, the output will consist of a list of<br />
fragments.<br />
Fragment<br />
the translation of the function’s <strong>code</strong> (a statement) including<br />
placing the returned value in a dedicated register.<br />
frame structure describing the memory needed for a function call.<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Typical frame<br />
argument n<br />
.<br />
argument 1<br />
static link<br />
local variables<br />
return address<br />
saved registers<br />
argument m<br />
.<br />
argument 1<br />
static link<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Managing Memory<br />
Runtime logical address space<br />
<strong>code</strong> static heap −→ Free memory ←− stack<br />
Code and some categories of data occupy a fixed space.<br />
Data areas for instances of classes (heap) and for frames<br />
(stack) change during execution!<br />
Garbage collec<strong>to</strong>rs work on the heap freeing unreferenced<br />
objects!<br />
The Operating System is likely <strong>to</strong> spread these through<br />
physical addresses, but this is not under control of the<br />
compiler!<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Managing Memory<br />
Runtime logical address space<br />
<strong>code</strong> static heap −→ Free memory ←− stack<br />
Code and some categories of data occupy a fixed space.<br />
Data areas for instances of classes (heap) and for frames<br />
(stack) change during execution!<br />
Garbage collec<strong>to</strong>rs work on the heap freeing unreferenced<br />
objects!<br />
The Operating System is likely <strong>to</strong> spread these through<br />
physical addresses, but this is not under control of the<br />
compiler!<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Managing Memory<br />
Runtime logical address space<br />
<strong>code</strong> static heap −→ Free memory ←− stack<br />
Code and some categories of data occupy a fixed space.<br />
Data areas for instances of classes (heap) and for frames<br />
(stack) change during execution!<br />
Garbage collec<strong>to</strong>rs work on the heap freeing unreferenced<br />
objects!<br />
The Operating System is likely <strong>to</strong> spread these through<br />
physical addresses, but this is not under control of the<br />
compiler!<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Managing Memory<br />
Runtime logical address space<br />
<strong>code</strong> static heap −→ Free memory ←− stack<br />
Code and some categories of data occupy a fixed space.<br />
Data areas for instances of classes (heap) and for frames<br />
(stack) change during execution!<br />
Garbage collec<strong>to</strong>rs work on the heap freeing unreferenced<br />
objects!<br />
The Operating System is likely <strong>to</strong> spread these through<br />
physical addresses, but this is not under control of the<br />
compiler!<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Managing Memory<br />
Runtime logical address space<br />
<strong>code</strong> static heap −→ Free memory ←− stack<br />
Code and some categories of data occupy a fixed space.<br />
Data areas for instances of classes (heap) and for frames<br />
(stack) change during execution!<br />
Garbage collec<strong>to</strong>rs work on the heap freeing unreferenced<br />
objects!<br />
The Operating System is likely <strong>to</strong> spread these through<br />
physical addresses, but this is not under control of the<br />
compiler!<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Organizing the <strong>Translation</strong> -remarks<br />
In minijava, in java, in C and in many other languages, the role of<br />
an expression or statement depends on the context in which it is<br />
used:<br />
a
Organizing the <strong>Translation</strong> -remarks<br />
In minijava, in java, in C and in many other languages, the role of<br />
an expression or statement depends on the context in which it is<br />
used:<br />
a
Organizing the <strong>Translation</strong> -remarks<br />
In minijava, in java, in C and in many other languages, the role of<br />
an expression or statement depends on the context in which it is<br />
used:<br />
a
Organizing the <strong>Translation</strong> -remarks<br />
In minijava, in java, in C and in many other languages, the role of<br />
an expression or statement depends on the context in which it is<br />
used:<br />
a
Organizing the <strong>Translation</strong> -remarks<br />
In minijava, in java, in C and in many other languages, the role of<br />
an expression or statement depends on the context in which it is<br />
used:<br />
a
Organizing the <strong>Translation</strong> -remarks<br />
In minijava, in java, in C and in many other languages, the role of<br />
an expression or statement depends on the context in which it is<br />
used:<br />
a
Organizing the <strong>Translation</strong> -remarks<br />
In minijava, in java, in C and in many other languages, the role of<br />
an expression or statement depends on the context in which it is<br />
used:<br />
a
Organizing the <strong>Translation</strong> -remarks<br />
Implementation question<br />
How do we translate abstract syntax <strong>to</strong> <strong>intermediate</strong> representation<br />
so that we can use context information?<br />
Exp<br />
Implement classes for the <strong>intermediate</strong> representation<br />
Tree.Exp and Tree.Stm<br />
But, translate <strong>to</strong> something that can be manipulated when<br />
the context is known!<br />
public abstract class Exp {<br />
abstract Tree.Exp unEx();<br />
abstract Tree.Stm unNx();<br />
abstract Tree.Stm unCx(Temp.Label t, Temp.Label f);<br />
}<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Organizing the <strong>Translation</strong> -remarks<br />
Implementation question<br />
How do we translate abstract syntax <strong>to</strong> <strong>intermediate</strong> representation<br />
so that we can use context information?<br />
Exp<br />
Implement classes for the <strong>intermediate</strong> representation<br />
Tree.Exp and Tree.Stm<br />
But, translate <strong>to</strong> something that can be manipulated when<br />
the context is known!<br />
public abstract class Exp {<br />
abstract Tree.Exp unEx();<br />
abstract Tree.Stm unNx();<br />
abstract Tree.Stm unCx(Temp.Label t, Temp.Label f);<br />
}<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Organizing the <strong>Translation</strong> -remarks<br />
Implementation question<br />
How do we translate abstract syntax <strong>to</strong> <strong>intermediate</strong> representation<br />
so that we can use context information?<br />
Exp<br />
Implement classes for the <strong>intermediate</strong> representation<br />
Tree.Exp and Tree.Stm<br />
But, translate <strong>to</strong> something that can be manipulated when<br />
the context is known!<br />
public abstract class Exp {<br />
abstract Tree.Exp unEx();<br />
abstract Tree.Stm unNx();<br />
abstract Tree.Stm unCx(Temp.Label t, Temp.Label f);<br />
}<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Organizing the <strong>Translation</strong> -remarks<br />
Implementation question<br />
How do we translate abstract syntax <strong>to</strong> <strong>intermediate</strong> representation<br />
so that we can use context information?<br />
Exp<br />
Implement classes for the <strong>intermediate</strong> representation<br />
Tree.Exp and Tree.Stm<br />
But, translate <strong>to</strong> something that can be manipulated when<br />
the context is known!<br />
public abstract class Exp {<br />
abstract Tree.Exp unEx();<br />
abstract Tree.Stm unNx();<br />
abstract Tree.Stm unCx(Temp.Label t, Temp.Label f);<br />
}<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Organizing the <strong>Translation</strong> -remarks<br />
Implementation question<br />
How do we translate abstract syntax <strong>to</strong> <strong>intermediate</strong> representation<br />
so that we can use context information?<br />
Exp<br />
Implement classes for the <strong>intermediate</strong> representation<br />
Tree.Exp and Tree.Stm<br />
But, translate <strong>to</strong> something that can be manipulated when<br />
the context is known!<br />
public abstract class Exp {<br />
abstract Tree.Exp unEx();<br />
abstract Tree.Stm unNx();<br />
abstract Tree.Stm unCx(Temp.Label t, Temp.Label f);<br />
}<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Organizing the <strong>Translation</strong> - example<br />
To translate expressions of minijava<br />
public class Ex extends Exp {<br />
Tree.Exp exp;<br />
Ex(Tree.Exp e) { exp = e; }<br />
Tree.Exp unEx(){ return exp; }<br />
Tree.Stm unNx(){ return new Tree.EXP(exp); }<br />
Tree.Stm unCx(Label t, Label f) {<br />
if (exp instanceof Tree.CONST) {<br />
Tree.CONST c = (Tree.CONST)exp;<br />
if (c.value == 0)<br />
return new Tree.JUMP(f);<br />
else<br />
return new Tree.JUMP(t);<br />
}<br />
return new Tree.CJUMP(Tree.CJUMP.NE, exp,<br />
new Tree.CONST(0), t, f);<br />
}<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Organizing the <strong>Translation</strong> - example<br />
To translate expressions of minijava<br />
public class Ex extends Exp {<br />
Tree.Exp exp;<br />
Ex(Tree.Exp e) { exp = e; }<br />
Tree.Exp unEx(){ return exp; }<br />
Tree.Stm unNx(){ return new Tree.EXP(exp); }<br />
Tree.Stm unCx(Label t, Label f) {<br />
if (exp instanceof Tree.CONST) {<br />
Tree.CONST c = (Tree.CONST)exp;<br />
if (c.value == 0)<br />
return new Tree.JUMP(f);<br />
else<br />
return new Tree.JUMP(t);<br />
}<br />
return new Tree.CJUMP(Tree.CJUMP.NE, exp,<br />
new Tree.CONST(0), t, f);<br />
}<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Organizing the <strong>Translation</strong> - example<br />
To translate expressions of minijava<br />
public class Ex extends Exp {<br />
Tree.Exp exp;<br />
Ex(Tree.Exp e) { exp = e; }<br />
Tree.Exp unEx(){ return exp; }<br />
Tree.Stm unNx(){ return new Tree.EXP(exp); }<br />
Tree.Stm unCx(Label t, Label f) {<br />
if (exp instanceof Tree.CONST) {<br />
Tree.CONST c = (Tree.CONST)exp;<br />
if (c.value == 0)<br />
return new Tree.JUMP(f);<br />
else<br />
return new Tree.JUMP(t);<br />
}<br />
return new Tree.CJUMP(Tree.CJUMP.NE, exp,<br />
new Tree.CONST(0), t, f);<br />
}<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Organizing the <strong>Translation</strong> - example<br />
To translate expressions of minijava<br />
public class Ex extends Exp {<br />
Tree.Exp exp;<br />
Ex(Tree.Exp e) { exp = e; }<br />
Tree.Exp unEx(){ return exp; }<br />
Tree.Stm unNx(){ return new Tree.EXP(exp); }<br />
Tree.Stm unCx(Label t, Label f) {<br />
if (exp instanceof Tree.CONST) {<br />
Tree.CONST c = (Tree.CONST)exp;<br />
if (c.value == 0)<br />
return new Tree.JUMP(f);<br />
else<br />
return new Tree.JUMP(t);<br />
}<br />
return new Tree.CJUMP(Tree.CJUMP.NE, exp,<br />
new Tree.CONST(0), t, f);<br />
}<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Organizing the <strong>Translation</strong> - example<br />
To translate expressions of minijava<br />
public class Ex extends Exp {<br />
Tree.Exp exp;<br />
Ex(Tree.Exp e) { exp = e; }<br />
Tree.Exp unEx(){ return exp; }<br />
Tree.Stm unNx(){ return new Tree.EXP(exp); }<br />
Tree.Stm unCx(Label t, Label f) {<br />
if (exp instanceof Tree.CONST) {<br />
Tree.CONST c = (Tree.CONST)exp;<br />
if (c.value == 0)<br />
return new Tree.JUMP(f);<br />
else<br />
return new Tree.JUMP(t);<br />
}<br />
return new Tree.CJUMP(Tree.CJUMP.NE, exp,<br />
new Tree.CONST(0), t, f);<br />
}<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Organizing the <strong>Translation</strong> - example<br />
To translate expressions of minijava<br />
public class Ex extends Exp {<br />
Tree.Exp exp;<br />
Ex(Tree.Exp e) { exp = e; }<br />
Tree.Exp unEx(){ return exp; }<br />
Tree.Stm unNx(){ return new Tree.EXP(exp); }<br />
Tree.Stm unCx(Label t, Label f) {<br />
if (exp instanceof Tree.CONST) {<br />
Tree.CONST c = (Tree.CONST)exp;<br />
if (c.value == 0)<br />
return new Tree.JUMP(f);<br />
else<br />
return new Tree.JUMP(t);<br />
}<br />
return new Tree.CJUMP(Tree.CJUMP.NE, exp,<br />
new Tree.CONST(0), t, f);<br />
}<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Organizing the <strong>Translation</strong> - example<br />
To translate expressions of minijava<br />
public class Ex extends Exp {<br />
Tree.Exp exp;<br />
Ex(Tree.Exp e) { exp = e; }<br />
Tree.Exp unEx(){ return exp; }<br />
Tree.Stm unNx(){ return new Tree.EXP(exp); }<br />
Tree.Stm unCx(Label t, Label f) {<br />
if (exp instanceof Tree.CONST) {<br />
Tree.CONST c = (Tree.CONST)exp;<br />
if (c.value == 0)<br />
return new Tree.JUMP(f);<br />
else<br />
return new Tree.JUMP(t);<br />
}<br />
return new Tree.CJUMP(Tree.CJUMP.NE, exp,<br />
new Tree.CONST(0), t, f);<br />
}<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Translating minijava- Variables<br />
Variables are always in some scope (in our <strong>code</strong> implemented<br />
by a class Level )<br />
Variables in the frame with offset k will be translated as<br />
mem(binop(plus,temp(fp),const(k)))<br />
Variables in a register tnumber will be translated as<br />
temp(tnumber )<br />
Machine dependent features like the frame pointer and the<br />
word size are provided by Frame :<br />
public abstract class Frame {<br />
public abstract Temp.Temp FP();<br />
public abstract int wordSize();<br />
}<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Translating minijava- Variables<br />
Variables are always in some scope (in our <strong>code</strong> implemented<br />
by a class Level )<br />
Variables in the frame with offset k will be translated as<br />
mem(binop(plus,temp(fp),const(k)))<br />
Variables in a register tnumber will be translated as<br />
temp(tnumber )<br />
Machine dependent features like the frame pointer and the<br />
word size are provided by Frame :<br />
public abstract class Frame {<br />
public abstract Temp.Temp FP();<br />
public abstract int wordSize();<br />
}<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Translating minijava- Variables<br />
Variables are always in some scope (in our <strong>code</strong> implemented<br />
by a class Level )<br />
Variables in the frame with offset k will be translated as<br />
mem(binop(plus,temp(fp),const(k)))<br />
Variables in a register tnumber will be translated as<br />
temp(tnumber )<br />
Machine dependent features like the frame pointer and the<br />
word size are provided by Frame :<br />
public abstract class Frame {<br />
public abstract Temp.Temp FP();<br />
public abstract int wordSize();<br />
}<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Translating minijava- Variables<br />
Variables are always in some scope (in our <strong>code</strong> implemented<br />
by a class Level )<br />
Variables in the frame with offset k will be translated as<br />
mem(binop(plus,temp(fp),const(k)))<br />
Variables in a register tnumber will be translated as<br />
temp(tnumber )<br />
Machine dependent features like the frame pointer and the<br />
word size are provided by Frame :<br />
public abstract class Frame {<br />
public abstract Temp.Temp FP();<br />
public abstract int wordSize();<br />
}<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Translating minijava- Variables<br />
Variables are always in some scope (in our <strong>code</strong> implemented<br />
by a class Level )<br />
Variables in the frame with offset k will be translated as<br />
mem(binop(plus,temp(fp),const(k)))<br />
Variables in a register tnumber will be translated as<br />
temp(tnumber )<br />
Machine dependent features like the frame pointer and the<br />
word size are provided by Frame :<br />
public abstract class Frame {<br />
public abstract Temp.Temp FP();<br />
public abstract int wordSize();<br />
}<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Translating minijava- Variables<br />
Variables are always in some scope (in our <strong>code</strong> implemented<br />
by a class Level )<br />
Variables in the frame with offset k will be translated as<br />
mem(binop(plus,temp(fp),const(k)))<br />
Variables in a register tnumber will be translated as<br />
temp(tnumber )<br />
Machine dependent features like the frame pointer and the<br />
word size are provided by Frame :<br />
public abstract class Frame {<br />
public abstract Temp.Temp FP();<br />
public abstract int wordSize();<br />
}<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Translating minijava- Variables<br />
In the frame or in registers?<br />
Elaborating a variable declaration binds the variable <strong>to</strong> an<br />
Access (an abstract class!).<br />
When translating a use of the variable how do we know<br />
whether it has been assigned <strong>to</strong> a register or <strong>to</strong> the frame?<br />
We don’t know!<br />
We let the different implementations of Access <strong>to</strong> resolve<br />
this:<br />
public abstract class Access {<br />
public abstract Tree.Exp exp(Tree.Exp e);<br />
}<br />
We look up the variable in the symbol table and get an<br />
Access a .<br />
We do a.exp(new Tree.TEMP(frame.FP()));<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Translating minijava- Variables<br />
In the frame or in registers?<br />
Elaborating a variable declaration binds the variable <strong>to</strong> an<br />
Access (an abstract class!).<br />
When translating a use of the variable how do we know<br />
whether it has been assigned <strong>to</strong> a register or <strong>to</strong> the frame?<br />
We don’t know!<br />
We let the different implementations of Access <strong>to</strong> resolve<br />
this:<br />
public abstract class Access {<br />
public abstract Tree.Exp exp(Tree.Exp e);<br />
}<br />
We look up the variable in the symbol table and get an<br />
Access a .<br />
We do a.exp(new Tree.TEMP(frame.FP()));<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Translating minijava- Variables<br />
In the frame or in registers?<br />
Elaborating a variable declaration binds the variable <strong>to</strong> an<br />
Access (an abstract class!).<br />
When translating a use of the variable how do we know<br />
whether it has been assigned <strong>to</strong> a register or <strong>to</strong> the frame?<br />
We don’t know!<br />
We let the different implementations of Access <strong>to</strong> resolve<br />
this:<br />
public abstract class Access {<br />
public abstract Tree.Exp exp(Tree.Exp e);<br />
}<br />
We look up the variable in the symbol table and get an<br />
Access a .<br />
We do a.exp(new Tree.TEMP(frame.FP()));<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Translating minijava- Variables<br />
In the frame or in registers?<br />
Elaborating a variable declaration binds the variable <strong>to</strong> an<br />
Access (an abstract class!).<br />
When translating a use of the variable how do we know<br />
whether it has been assigned <strong>to</strong> a register or <strong>to</strong> the frame?<br />
We don’t know!<br />
We let the different implementations of Access <strong>to</strong> resolve<br />
this:<br />
public abstract class Access {<br />
public abstract Tree.Exp exp(Tree.Exp e);<br />
}<br />
We look up the variable in the symbol table and get an<br />
Access a .<br />
We do a.exp(new Tree.TEMP(frame.FP()));<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Translating minijava- Variables<br />
In the frame or in registers?<br />
Elaborating a variable declaration binds the variable <strong>to</strong> an<br />
Access (an abstract class!).<br />
When translating a use of the variable how do we know<br />
whether it has been assigned <strong>to</strong> a register or <strong>to</strong> the frame?<br />
We don’t know!<br />
We let the different implementations of Access <strong>to</strong> resolve<br />
this:<br />
public abstract class Access {<br />
public abstract Tree.Exp exp(Tree.Exp e);<br />
}<br />
We look up the variable in the symbol table and get an<br />
Access a .<br />
We do a.exp(new Tree.TEMP(frame.FP()));<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Translating minijava- Variables<br />
In the frame or in registers?<br />
Elaborating a variable declaration binds the variable <strong>to</strong> an<br />
Access (an abstract class!).<br />
When translating a use of the variable how do we know<br />
whether it has been assigned <strong>to</strong> a register or <strong>to</strong> the frame?<br />
We don’t know!<br />
We let the different implementations of Access <strong>to</strong> resolve<br />
this:<br />
public abstract class Access {<br />
public abstract Tree.Exp exp(Tree.Exp e);<br />
}<br />
We look up the variable in the symbol table and get an<br />
Access a .<br />
We do a.exp(new Tree.TEMP(frame.FP()));<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Translating minijava- Variables<br />
In the frame or in registers?<br />
Elaborating a variable declaration binds the variable <strong>to</strong> an<br />
Access (an abstract class!).<br />
When translating a use of the variable how do we know<br />
whether it has been assigned <strong>to</strong> a register or <strong>to</strong> the frame?<br />
We don’t know!<br />
We let the different implementations of Access <strong>to</strong> resolve<br />
this:<br />
public abstract class Access {<br />
public abstract Tree.Exp exp(Tree.Exp e);<br />
}<br />
We look up the variable in the symbol table and get an<br />
Access a .<br />
We do a.exp(new Tree.TEMP(frame.FP()));<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Translating minijava- structured variables<br />
Different programming languages have different policies!<br />
In Pascal an array variable stands for the content of the array.<br />
assignment will copy content<br />
place for the content has <strong>to</strong> be associated <strong>to</strong> an array variable!<br />
In minijava array variables (and object variables) behave like<br />
pointers<br />
array assignment is pointer assignment<br />
only place for a pointer is associated <strong>to</strong> an array or object<br />
variable.<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Translating minijava- structured variables<br />
Different programming languages have different policies!<br />
In Pascal an array variable stands for the content of the array.<br />
assignment will copy content<br />
place for the content has <strong>to</strong> be associated <strong>to</strong> an array variable!<br />
In minijava array variables (and object variables) behave like<br />
pointers<br />
array assignment is pointer assignment<br />
only place for a pointer is associated <strong>to</strong> an array or object<br />
variable.<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Translating minijava- structured variables<br />
Different programming languages have different policies!<br />
In Pascal an array variable stands for the content of the array.<br />
assignment will copy content<br />
place for the content has <strong>to</strong> be associated <strong>to</strong> an array variable!<br />
In minijava array variables (and object variables) behave like<br />
pointers<br />
array assignment is pointer assignment<br />
only place for a pointer is associated <strong>to</strong> an array or object<br />
variable.<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Translating minijava- structured variables<br />
Different programming languages have different policies!<br />
In Pascal an array variable stands for the content of the array.<br />
assignment will copy content<br />
place for the content has <strong>to</strong> be associated <strong>to</strong> an array variable!<br />
In minijava array variables (and object variables) behave like<br />
pointers<br />
array assignment is pointer assignment<br />
only place for a pointer is associated <strong>to</strong> an array or object<br />
variable.<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Translating minijava- structured variables<br />
Different programming languages have different policies!<br />
In Pascal an array variable stands for the content of the array.<br />
assignment will copy content<br />
place for the content has <strong>to</strong> be associated <strong>to</strong> an array variable!<br />
In minijava array variables (and object variables) behave like<br />
pointers<br />
array assignment is pointer assignment<br />
only place for a pointer is associated <strong>to</strong> an array or object<br />
variable.<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Translating minijava- structured variables<br />
Different programming languages have different policies!<br />
In Pascal an array variable stands for the content of the array.<br />
assignment will copy content<br />
place for the content has <strong>to</strong> be associated <strong>to</strong> an array variable!<br />
In minijava array variables (and object variables) behave like<br />
pointers<br />
array assignment is pointer assignment<br />
only place for a pointer is associated <strong>to</strong> an array or object<br />
variable.<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Translating minijava- structured variables<br />
Different programming languages have different policies!<br />
In Pascal an array variable stands for the content of the array.<br />
assignment will copy content<br />
place for the content has <strong>to</strong> be associated <strong>to</strong> an array variable!<br />
In minijava array variables (and object variables) behave like<br />
pointers<br />
array assignment is pointer assignment<br />
only place for a pointer is associated <strong>to</strong> an array or object<br />
variable.<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Translating minijava- subscripting<br />
With this, the translation of a[i] is immediate also:<br />
mem(plus( mem(e),mul(i,const(w))))<br />
mem(e) is the address where the array a starts,<br />
w is the wordsize<br />
Notice that identifiers can be used both as left-hand-sides of<br />
assignments and as parts of expressions. In some cases<br />
mem(e) nodes will stand for addresses, in other cases for<br />
values. It is only in move(mem(e1),e2) that mem(e) stands<br />
for the address. This will be reflected when generating <strong>code</strong><br />
(we will generate a s<strong>to</strong>re or a fetch)<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Translating minijava- subscripting<br />
With this, the translation of a[i] is immediate also:<br />
mem(plus( mem(e),mul(i,const(w))))<br />
mem(e) is the address where the array a starts,<br />
w is the wordsize<br />
Notice that identifiers can be used both as left-hand-sides of<br />
assignments and as parts of expressions. In some cases<br />
mem(e) nodes will stand for addresses, in other cases for<br />
values. It is only in move(mem(e1),e2) that mem(e) stands<br />
for the address. This will be reflected when generating <strong>code</strong><br />
(we will generate a s<strong>to</strong>re or a fetch)<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Translating minijava- subscripting<br />
With this, the translation of a[i] is immediate also:<br />
mem(plus( mem(e),mul(i,const(w))))<br />
mem(e) is the address where the array a starts,<br />
w is the wordsize<br />
Notice that identifiers can be used both as left-hand-sides of<br />
assignments and as parts of expressions. In some cases<br />
mem(e) nodes will stand for addresses, in other cases for<br />
values. It is only in move(mem(e1),e2) that mem(e) stands<br />
for the address. This will be reflected when generating <strong>code</strong><br />
(we will generate a s<strong>to</strong>re or a fetch)<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Translating minijava- subscripting<br />
With this, the translation of a[i] is immediate also:<br />
mem(plus( mem(e),mul(i,const(w))))<br />
mem(e) is the address where the array a starts,<br />
w is the wordsize<br />
Notice that identifiers can be used both as left-hand-sides of<br />
assignments and as parts of expressions. In some cases<br />
mem(e) nodes will stand for addresses, in other cases for<br />
values. It is only in move(mem(e1),e2) that mem(e) stands<br />
for the address. This will be reflected when generating <strong>code</strong><br />
(we will generate a s<strong>to</strong>re or a fetch)<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Translating minijava- subscripting<br />
With this, the translation of a[i] is immediate also:<br />
mem(plus( mem(e),mul(i,const(w))))<br />
mem(e) is the address where the array a starts,<br />
w is the wordsize<br />
Notice that identifiers can be used both as left-hand-sides of<br />
assignments and as parts of expressions. In some cases<br />
mem(e) nodes will stand for addresses, in other cases for<br />
values. It is only in move(mem(e1),e2) that mem(e) stands<br />
for the address. This will be reflected when generating <strong>code</strong><br />
(we will generate a s<strong>to</strong>re or a fetch)<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Translating minijava- operations<br />
Arithmetic<br />
Each opera<strong>to</strong>r in minijava corresponds <strong>to</strong> an opera<strong>to</strong>r construc<strong>to</strong>r<br />
in the <strong>intermediate</strong> representation. Just notice that<br />
There are no unary negations in the <strong>intermediate</strong><br />
representation<br />
Negate integers by substracting from 0<br />
Negate booleans by using XOR.<br />
Comparisons<br />
e1 < e2 will be translated using<br />
public class RelCx extends Cx {<br />
int op;<br />
Tree.Exp left, right;<br />
Tree.Stm unCx(Label t, Label f) {<br />
return new Tree.CJUMP(op, left, right, t, f);}<br />
}<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Translating minijava- operations<br />
Arithmetic<br />
Each opera<strong>to</strong>r in minijava corresponds <strong>to</strong> an opera<strong>to</strong>r construc<strong>to</strong>r<br />
in the <strong>intermediate</strong> representation. Just notice that<br />
There are no unary negations in the <strong>intermediate</strong><br />
representation<br />
Negate integers by substracting from 0<br />
Negate booleans by using XOR.<br />
Comparisons<br />
e1 < e2 will be translated using<br />
public class RelCx extends Cx {<br />
int op;<br />
Tree.Exp left, right;<br />
Tree.Stm unCx(Label t, Label f) {<br />
return new Tree.CJUMP(op, left, right, t, f);}<br />
}<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Translating minijava- operations<br />
Arithmetic<br />
Each opera<strong>to</strong>r in minijava corresponds <strong>to</strong> an opera<strong>to</strong>r construc<strong>to</strong>r<br />
in the <strong>intermediate</strong> representation. Just notice that<br />
There are no unary negations in the <strong>intermediate</strong><br />
representation<br />
Negate integers by substracting from 0<br />
Negate booleans by using XOR.<br />
Comparisons<br />
e1 < e2 will be translated using<br />
public class RelCx extends Cx {<br />
int op;<br />
Tree.Exp left, right;<br />
Tree.Stm unCx(Label t, Label f) {<br />
return new Tree.CJUMP(op, left, right, t, f);}<br />
}<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Translating minijava- operations<br />
Arithmetic<br />
Each opera<strong>to</strong>r in minijava corresponds <strong>to</strong> an opera<strong>to</strong>r construc<strong>to</strong>r<br />
in the <strong>intermediate</strong> representation. Just notice that<br />
There are no unary negations in the <strong>intermediate</strong><br />
representation<br />
Negate integers by substracting from 0<br />
Negate booleans by using XOR.<br />
Comparisons<br />
e1 < e2 will be translated using<br />
public class RelCx extends Cx {<br />
int op;<br />
Tree.Exp left, right;<br />
Tree.Stm unCx(Label t, Label f) {<br />
return new Tree.CJUMP(op, left, right, t, f);}<br />
}<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Translating minijava- operations<br />
Arithmetic<br />
Each opera<strong>to</strong>r in minijava corresponds <strong>to</strong> an opera<strong>to</strong>r construc<strong>to</strong>r<br />
in the <strong>intermediate</strong> representation. Just notice that<br />
There are no unary negations in the <strong>intermediate</strong><br />
representation<br />
Negate integers by substracting from 0<br />
Negate booleans by using XOR.<br />
Comparisons<br />
e1 < e2 will be translated using<br />
public class RelCx extends Cx {<br />
int op;<br />
Tree.Exp left, right;<br />
Tree.Stm unCx(Label t, Label f) {<br />
return new Tree.CJUMP(op, left, right, t, f);}<br />
}<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Translating minijava- array creation<br />
An array might outlive the method that creates it, thus it<br />
cannot be placed in the stack! It is placed in an unstructured<br />
piece of memory, the heap.<br />
The translation of new int [exp] should create an integer<br />
array of length determined by e and with each value initialized<br />
<strong>to</strong> 0:<br />
Determine the ammount of memory needed:<br />
(length + 1) ∗ size of integer<br />
Call an external function <strong>to</strong> allocate space on the heap,<br />
Generate <strong>code</strong> <strong>to</strong> s<strong>to</strong>re the length of the array at offset 0,<br />
Generate <strong>code</strong> <strong>to</strong> initialize all values <strong>to</strong> 0, starting at offset<br />
size of integer<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Translating minijava- array creation<br />
An array might outlive the method that creates it, thus it<br />
cannot be placed in the stack! It is placed in an unstructured<br />
piece of memory, the heap.<br />
The translation of new int [exp] should create an integer<br />
array of length determined by e and with each value initialized<br />
<strong>to</strong> 0:<br />
Determine the ammount of memory needed:<br />
(length + 1) ∗ size of integer<br />
Call an external function <strong>to</strong> allocate space on the heap,<br />
Generate <strong>code</strong> <strong>to</strong> s<strong>to</strong>re the length of the array at offset 0,<br />
Generate <strong>code</strong> <strong>to</strong> initialize all values <strong>to</strong> 0, starting at offset<br />
size of integer<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Translating minijava- array creation<br />
An array might outlive the method that creates it, thus it<br />
cannot be placed in the stack! It is placed in an unstructured<br />
piece of memory, the heap.<br />
The translation of new int [exp] should create an integer<br />
array of length determined by e and with each value initialized<br />
<strong>to</strong> 0:<br />
Determine the ammount of memory needed:<br />
(length + 1) ∗ size of integer<br />
Call an external function <strong>to</strong> allocate space on the heap,<br />
Generate <strong>code</strong> <strong>to</strong> s<strong>to</strong>re the length of the array at offset 0,<br />
Generate <strong>code</strong> <strong>to</strong> initialize all values <strong>to</strong> 0, starting at offset<br />
size of integer<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Translating minijava- array creation<br />
An array might outlive the method that creates it, thus it<br />
cannot be placed in the stack! It is placed in an unstructured<br />
piece of memory, the heap.<br />
The translation of new int [exp] should create an integer<br />
array of length determined by e and with each value initialized<br />
<strong>to</strong> 0:<br />
Determine the ammount of memory needed:<br />
(length + 1) ∗ size of integer<br />
Call an external function <strong>to</strong> allocate space on the heap,<br />
Generate <strong>code</strong> <strong>to</strong> s<strong>to</strong>re the length of the array at offset 0,<br />
Generate <strong>code</strong> <strong>to</strong> initialize all values <strong>to</strong> 0, starting at offset<br />
size of integer<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Translating minijava- array creation<br />
An array might outlive the method that creates it, thus it<br />
cannot be placed in the stack! It is placed in an unstructured<br />
piece of memory, the heap.<br />
The translation of new int [exp] should create an integer<br />
array of length determined by e and with each value initialized<br />
<strong>to</strong> 0:<br />
Determine the ammount of memory needed:<br />
(length + 1) ∗ size of integer<br />
Call an external function <strong>to</strong> allocate space on the heap,<br />
Generate <strong>code</strong> <strong>to</strong> s<strong>to</strong>re the length of the array at offset 0,<br />
Generate <strong>code</strong> <strong>to</strong> initialize all values <strong>to</strong> 0, starting at offset<br />
size of integer<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Translating minijava- array creation<br />
An array might outlive the method that creates it, thus it<br />
cannot be placed in the stack! It is placed in an unstructured<br />
piece of memory, the heap.<br />
The translation of new int [exp] should create an integer<br />
array of length determined by e and with each value initialized<br />
<strong>to</strong> 0:<br />
Determine the ammount of memory needed:<br />
(length + 1) ∗ size of integer<br />
Call an external function <strong>to</strong> allocate space on the heap,<br />
Generate <strong>code</strong> <strong>to</strong> s<strong>to</strong>re the length of the array at offset 0,<br />
Generate <strong>code</strong> <strong>to</strong> initialize all values <strong>to</strong> 0, starting at offset<br />
size of integer<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Translating minijava- object creation<br />
As with arrays, an object may outlive the method that creates<br />
it, it will be placed in the heap.<br />
To translate new ClassName()<br />
Generate <strong>code</strong> for allocating heap space for all fields<br />
notice difference between local variables (on the stack) and fields (on the<br />
heap)!<br />
Iterate through field memory locations and initialize them.<br />
Both for array creation and object creation we need <strong>to</strong> call<br />
external functions.<br />
in order <strong>to</strong> follow machine dependent conventions, we leave<br />
this <strong>to</strong> the class Frame :<br />
public abstract Tree.Exp externalCall(String func,<br />
List args);<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Translating minijava- object creation<br />
As with arrays, an object may outlive the method that creates<br />
it, it will be placed in the heap.<br />
To translate new ClassName()<br />
Generate <strong>code</strong> for allocating heap space for all fields<br />
notice difference between local variables (on the stack) and fields (on the<br />
heap)!<br />
Iterate through field memory locations and initialize them.<br />
Both for array creation and object creation we need <strong>to</strong> call<br />
external functions.<br />
in order <strong>to</strong> follow machine dependent conventions, we leave<br />
this <strong>to</strong> the class Frame :<br />
public abstract Tree.Exp externalCall(String func,<br />
List args);<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Translating minijava- object creation<br />
As with arrays, an object may outlive the method that creates<br />
it, it will be placed in the heap.<br />
To translate new ClassName()<br />
Generate <strong>code</strong> for allocating heap space for all fields<br />
notice difference between local variables (on the stack) and fields (on the<br />
heap)!<br />
Iterate through field memory locations and initialize them.<br />
Both for array creation and object creation we need <strong>to</strong> call<br />
external functions.<br />
in order <strong>to</strong> follow machine dependent conventions, we leave<br />
this <strong>to</strong> the class Frame :<br />
public abstract Tree.Exp externalCall(String func,<br />
List args);<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Translating minijava- object creation<br />
As with arrays, an object may outlive the method that creates<br />
it, it will be placed in the heap.<br />
To translate new ClassName()<br />
Generate <strong>code</strong> for allocating heap space for all fields<br />
notice difference between local variables (on the stack) and fields (on the<br />
heap)!<br />
Iterate through field memory locations and initialize them.<br />
Both for array creation and object creation we need <strong>to</strong> call<br />
external functions.<br />
in order <strong>to</strong> follow machine dependent conventions, we leave<br />
this <strong>to</strong> the class Frame :<br />
public abstract Tree.Exp externalCall(String func,<br />
List args);<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Translating minijava- object creation<br />
As with arrays, an object may outlive the method that creates<br />
it, it will be placed in the heap.<br />
To translate new ClassName()<br />
Generate <strong>code</strong> for allocating heap space for all fields<br />
notice difference between local variables (on the stack) and fields (on the<br />
heap)!<br />
Iterate through field memory locations and initialize them.<br />
Both for array creation and object creation we need <strong>to</strong> call<br />
external functions.<br />
in order <strong>to</strong> follow machine dependent conventions, we leave<br />
this <strong>to</strong> the class Frame :<br />
public abstract Tree.Exp externalCall(String func,<br />
List args);<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Translating minijava- object creation<br />
As with arrays, an object may outlive the method that creates<br />
it, it will be placed in the heap.<br />
To translate new ClassName()<br />
Generate <strong>code</strong> for allocating heap space for all fields<br />
notice difference between local variables (on the stack) and fields (on the<br />
heap)!<br />
Iterate through field memory locations and initialize them.<br />
Both for array creation and object creation we need <strong>to</strong> call<br />
external functions.<br />
in order <strong>to</strong> follow machine dependent conventions, we leave<br />
this <strong>to</strong> the class Frame :<br />
public abstract Tree.Exp externalCall(String func,<br />
List args);<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Translating minijava- object creation<br />
As with arrays, an object may outlive the method that creates<br />
it, it will be placed in the heap.<br />
To translate new ClassName()<br />
Generate <strong>code</strong> for allocating heap space for all fields<br />
notice difference between local variables (on the stack) and fields (on the<br />
heap)!<br />
Iterate through field memory locations and initialize them.<br />
Both for array creation and object creation we need <strong>to</strong> call<br />
external functions.<br />
in order <strong>to</strong> follow machine dependent conventions, we leave<br />
this <strong>to</strong> the class Frame :<br />
public abstract Tree.Exp externalCall(String func,<br />
List args);<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Translating minijava- while loops<br />
To translate<br />
while (exp) stm<br />
we use its meaning:<br />
test:<br />
if (not exp) go<strong>to</strong> done<br />
stm<br />
go<strong>to</strong> test<br />
done:<br />
Resulting in<br />
seq(seq( seq( label(test),ircjumpEQ,exp.unEx(),const(1),T,F),seq( label(T),body.unNx()),label(f)))<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Translating minijava- while loops<br />
To translate<br />
while (exp) stm<br />
we use its meaning:<br />
test:<br />
if (not exp) go<strong>to</strong> done<br />
stm<br />
go<strong>to</strong> test<br />
done:<br />
Resulting in<br />
seq(seq( seq( label(test),ircjumpEQ,exp.unEx(),const(1),T,F),seq( label(T),body.unNx()),label(f)))<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Translating minijava- while loops<br />
To translate<br />
while (exp) stm<br />
we use its meaning:<br />
test:<br />
if (not exp) go<strong>to</strong> done<br />
stm<br />
go<strong>to</strong> test<br />
done:<br />
Resulting in<br />
seq(seq( seq( label(test),ircjumpEQ,exp.unEx(),const(1),T,F),seq( label(T),body.unNx()),label(f)))<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Translating minijava- function calls<br />
To translate<br />
obj.f(a1, . . . a2)<br />
Use a call() node<br />
call(name(lf ),obj,e1,. . . en)<br />
Where:<br />
lf is the label generated for f when translating its declaration.<br />
obj is the translation of obj that must be added as an<br />
argument <strong>to</strong> the method.<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Translating minijava- function calls<br />
To translate<br />
obj.f(a1, . . . a2)<br />
Use a call() node<br />
call(name(lf ),obj,e1,. . . en)<br />
Where:<br />
lf is the label generated for f when translating its declaration.<br />
obj is the translation of obj that must be added as an<br />
argument <strong>to</strong> the method.<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Translating minijava- function calls<br />
To translate<br />
obj.f(a1, . . . a2)<br />
Use a call() node<br />
call(name(lf ),obj,e1,. . . en)<br />
Where:<br />
lf is the label generated for f when translating its declaration.<br />
obj is the translation of obj that must be added as an<br />
argument <strong>to</strong> the method.<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Translating minijava- function calls<br />
To translate<br />
obj.f(a1, . . . a2)<br />
Use a call() node<br />
call(name(lf ),obj,e1,. . . en)<br />
Where:<br />
lf is the label generated for f when translating its declaration.<br />
obj is the translation of obj that must be added as an<br />
argument <strong>to</strong> the method.<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Translating minijava- function calls<br />
To translate<br />
obj.f(a1, . . . a2)<br />
Use a call() node<br />
call(name(lf ),obj,e1,. . . en)<br />
Where:<br />
lf is the label generated for f when translating its declaration.<br />
obj is the translation of obj that must be added as an<br />
argument <strong>to</strong> the method.<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Translating minijava- declarations<br />
For each variable declaration in a method body, additional<br />
space will be reserved (in the frame or in a register) and this<br />
must be recorded in the environment <strong>to</strong> be used later!<br />
We get an Access (the abstraction for inFrame or inRegister)<br />
by using<br />
frame.allocLocal(false); where frame is the Frame<br />
that has been created during the elaboration of the current<br />
method declaration.<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Translating minijava- declarations<br />
For each variable declaration in a method body, additional<br />
space will be reserved (in the frame or in a register) and this<br />
must be recorded in the environment <strong>to</strong> be used later!<br />
We get an Access (the abstraction for inFrame or inRegister)<br />
by using<br />
frame.allocLocal(false); where frame is the Frame<br />
that has been created during the elaboration of the current<br />
method declaration.<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Translating minijava- declarations<br />
For each method declaration<br />
An instance of Frame is created<br />
The body is translated <strong>to</strong> a statement tree<br />
These two are put <strong>to</strong>gether in<strong>to</strong> a fragment<br />
At this stage we do not consider the machine dependent<br />
prologue and epilogue of assembler instructions <strong>to</strong> allocate the<br />
frame <strong>to</strong> the stack and, jump <strong>to</strong> the proper address, etc.<br />
To translate method<br />
B f(A1a1 . . . Anan){decls stms return exp}<br />
build an eseq(stms,exp) and (if necessary) s<strong>to</strong>re the result in<br />
a dedicated register (Frame.RV() ) You will get the part of the translation that<br />
elaborates declarations!<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Translating minijava- declarations<br />
For each method declaration<br />
An instance of Frame is created<br />
The body is translated <strong>to</strong> a statement tree<br />
These two are put <strong>to</strong>gether in<strong>to</strong> a fragment<br />
At this stage we do not consider the machine dependent<br />
prologue and epilogue of assembler instructions <strong>to</strong> allocate the<br />
frame <strong>to</strong> the stack and, jump <strong>to</strong> the proper address, etc.<br />
To translate method<br />
B f(A1a1 . . . Anan){decls stms return exp}<br />
build an eseq(stms,exp) and (if necessary) s<strong>to</strong>re the result in<br />
a dedicated register (Frame.RV() ) You will get the part of the translation that<br />
elaborates declarations!<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Translating minijava- declarations<br />
For each method declaration<br />
An instance of Frame is created<br />
The body is translated <strong>to</strong> a statement tree<br />
These two are put <strong>to</strong>gether in<strong>to</strong> a fragment<br />
At this stage we do not consider the machine dependent<br />
prologue and epilogue of assembler instructions <strong>to</strong> allocate the<br />
frame <strong>to</strong> the stack and, jump <strong>to</strong> the proper address, etc.<br />
To translate method<br />
B f(A1a1 . . . Anan){decls stms return exp}<br />
build an eseq(stms,exp) and (if necessary) s<strong>to</strong>re the result in<br />
a dedicated register (Frame.RV() ) You will get the part of the translation that<br />
elaborates declarations!<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Translating minijava- declarations<br />
For each method declaration<br />
An instance of Frame is created<br />
The body is translated <strong>to</strong> a statement tree<br />
These two are put <strong>to</strong>gether in<strong>to</strong> a fragment<br />
At this stage we do not consider the machine dependent<br />
prologue and epilogue of assembler instructions <strong>to</strong> allocate the<br />
frame <strong>to</strong> the stack and, jump <strong>to</strong> the proper address, etc.<br />
To translate method<br />
B f(A1a1 . . . Anan){decls stms return exp}<br />
build an eseq(stms,exp) and (if necessary) s<strong>to</strong>re the result in<br />
a dedicated register (Frame.RV() ) You will get the part of the translation that<br />
elaborates declarations!<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Translating minijava- declarations<br />
For each method declaration<br />
An instance of Frame is created<br />
The body is translated <strong>to</strong> a statement tree<br />
These two are put <strong>to</strong>gether in<strong>to</strong> a fragment<br />
At this stage we do not consider the machine dependent<br />
prologue and epilogue of assembler instructions <strong>to</strong> allocate the<br />
frame <strong>to</strong> the stack and, jump <strong>to</strong> the proper address, etc.<br />
To translate method<br />
B f(A1a1 . . . Anan){decls stms return exp}<br />
build an eseq(stms,exp) and (if necessary) s<strong>to</strong>re the result in<br />
a dedicated register (Frame.RV() ) You will get the part of the translation that<br />
elaborates declarations!<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Translating minijava- declarations<br />
For each method declaration<br />
An instance of Frame is created<br />
The body is translated <strong>to</strong> a statement tree<br />
These two are put <strong>to</strong>gether in<strong>to</strong> a fragment<br />
At this stage we do not consider the machine dependent<br />
prologue and epilogue of assembler instructions <strong>to</strong> allocate the<br />
frame <strong>to</strong> the stack and, jump <strong>to</strong> the proper address, etc.<br />
To translate method<br />
B f(A1a1 . . . Anan){decls stms return exp}<br />
build an eseq(stms,exp) and (if necessary) s<strong>to</strong>re the result in<br />
a dedicated register (Frame.RV() ) You will get the part of the translation that<br />
elaborates declarations!<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Translating minijava- fragments<br />
When elaborating a method declaration, the fragment<br />
including the frame and the ir-tree is added <strong>to</strong> a list.<br />
The visi<strong>to</strong>r class doing the translation includes a method <strong>to</strong><br />
retrieve the list of fragments (the result of translating the<br />
whole program)<br />
private LinkedList frags = new LinkedList();<br />
public Itera<strong>to</strong>r getResults() {<br />
return frags.itera<strong>to</strong>r();}<br />
This list is further used as input <strong>to</strong> the back-end of the<br />
compiler.<br />
In part 4 of the project we will just print out the list of<br />
fragments!<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Translating minijava- fragments<br />
When elaborating a method declaration, the fragment<br />
including the frame and the ir-tree is added <strong>to</strong> a list.<br />
The visi<strong>to</strong>r class doing the translation includes a method <strong>to</strong><br />
retrieve the list of fragments (the result of translating the<br />
whole program)<br />
private LinkedList frags = new LinkedList();<br />
public Itera<strong>to</strong>r getResults() {<br />
return frags.itera<strong>to</strong>r();}<br />
This list is further used as input <strong>to</strong> the back-end of the<br />
compiler.<br />
In part 4 of the project we will just print out the list of<br />
fragments!<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Translating minijava- fragments<br />
When elaborating a method declaration, the fragment<br />
including the frame and the ir-tree is added <strong>to</strong> a list.<br />
The visi<strong>to</strong>r class doing the translation includes a method <strong>to</strong><br />
retrieve the list of fragments (the result of translating the<br />
whole program)<br />
private LinkedList frags = new LinkedList();<br />
public Itera<strong>to</strong>r getResults() {<br />
return frags.itera<strong>to</strong>r();}<br />
This list is further used as input <strong>to</strong> the back-end of the<br />
compiler.<br />
In part 4 of the project we will just print out the list of<br />
fragments!<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>
Translating minijava- fragments<br />
When elaborating a method declaration, the fragment<br />
including the frame and the ir-tree is added <strong>to</strong> a list.<br />
The visi<strong>to</strong>r class doing the translation includes a method <strong>to</strong><br />
retrieve the list of fragments (the result of translating the<br />
whole program)<br />
private LinkedList frags = new LinkedList();<br />
public Itera<strong>to</strong>r getResults() {<br />
return frags.itera<strong>to</strong>r();}<br />
This list is further used as input <strong>to</strong> the back-end of the<br />
compiler.<br />
In part 4 of the project we will just print out the list of<br />
fragments!<br />
<strong>Computer</strong> <strong>Languages</strong> <strong>Translation</strong>