You are on page 1of 45

MATA61 - Compiladores

Vinicius Petrucci
vpetrucci@ufba.br
Objetivos do curso

1- Teoria: Compreender os conceitos envolvidos na


implementao de linguagens de programao

2- Prtica: Implementar um compilador aplicando


tcnicas de anlise e sntese/gerao de cdigo
Linguagem JS/C (subset) => assembly MIPS
Avaliao do curso
Mdia aritmetica ponderada
Primeira prova: 20%
Segunda prova: 30%
Projeto do compilador: 50%

Entrega fora da data especificada = 0 (zero)

Pode reprovar por falta (em hora aula): >= 17h (~ 9 aulas)
mas no reprova caso nota final >= 70%
Projeto do compilador
Construir um compilador a melhor forma de aprender!
Trabalho feito em dupla ou individualmente
Requisitos
Deve ser implementado na linguagem C/C++
Deve executar no ambiente Linux/Unix
Pode usar ferramentas Lex (Flex) & Yacc (Bison)
Dividido em 3 fases
1) Analisador lxico: 15%
2) Analisador sinttico/semntico: 35%
3) Gerador de cdigo: 50%
Projeto do compilador
Compilador final deve receber 2 argumentos (argv)
./compilador <input> <output>
Exemplo: ./compilador codigo.jsc codigo.asm
Codigo gerado (assembly MIPS) executa no simulador SPIM
.data
_newline: .asciiz
add $a0, $a0, $t1
"\n"
addiu $sp, $sp, 4
.text
function main() li $v0, 1
.globl main
{ print(7+5); } syscall
main:
li $a0, 7
li $v0, 4 12
la $a0, _newline
sw $a0, 0($sp)
syscall
addiu $sp, $sp, -4
li $v0, 10
li $a0, 5
syscall
lw $t1, 4($sp)
Projeto do compilador Plgio
O projeto , em geral, difcil, ento...
execute por partes (filosofia do Jack, o Estripador)
comece por mdulos e construes mais simples
no deixe pra ltima hora!

Respeito ao cdigo de tica!


plgio = nota zero (na matria toda!)
medidas administrativas podem ser tomadas
- Aho, Lam, Sethi, Ullman, Dragon Book
- Cooper & Torczon, Engineering a Compiler.
- Appel, Modern Compiler Implementation in Java
- Fischer, Cytron, LeBlanc, Crafting a Compiler
Eu sei o que vocs fizeram no semestre passado...

2015 / 2
Eu sei o que vocs fizeram no semestre passado...

2016 / 1
Eu sei o que vocs fizeram no semestre passado...

2016 / 2
Disciplina no Google Classroom

https://classroom.google.com

Codigo: 7pdbthu

Mande email se tiver problemas de acesso: vpetrucci@ufba.br


Propsito de um compilador
Como executar um programa como descrito abaixo?
int nPos = 0;
int k = 0;
while (k < length) {
if (a[k] > 0) {
nPos++;
}
}

Lembra que o computador s sabe executar 0s e 1s - i.e.,


codificao de instrues e dados
Larus, James. "Assemblers, linkers, and the SPIM simulator." Appendix of Computer Organization and Design: the hardware/software interface,
book by Hennessy and Patterson (2005).
Foco desta disciplina!
Viso do Compilador em alto-nvel
Structure of a Compiler
At a high level, a compiler has two pieces:
Front end: analysis
Read source program and discover its structure and
meaning
Back end: synthesis
Generate equivalent target language program

Source Front End Back End Target

UW CSE 401 Winter 2015 A-20


Compiler must
Recognize legal programs (& complain about illegal
ones)
Generate correct code
Compiler can attempt to improve (optimize) code, but
must not change behavior
Manage runtime storage of all variables/data
Agree with OS & linker on target format

UW CSE 401 Winter 2015 A-21


Implications
Phases communicate using some sort of
Intermediate Representation(s) (IR)
Front end maps source into IR
Back end maps IR to target machine code
Often multiple IRs higher level at first, lower level in later
phases

Source Front End IR Back End Target

UW CSE 401 Winter 2015 A-22


Front End source Scanner
tokens
Parser
IR

Usually split into two parts


Scanner: Responsible for converting character stream to token stream:
keywords, operators, variables, constants,
Also: strips out white space, comments
Parser: Reads token stream; generates IR
Either here or shortly after, perform semantics analysis to check for
things like type errors, etc.
Both of these can be generated automatically
Use a formal grammar to specify the source language
Tools read the grammar and generate scanner & parser (lex/yacc or
flex/bison for C/C++, JFlex/CUP for Java)
UW CSE 401 Winter 2015 A-23
Scanner Example
Input text
// this statement does very little
if (x >= y) y = 42;
Token Stream
IF LPAREN ID(x) GEQ ID(y)
RPAREN ID(y) ASSIGN INT(42) SCOLON
Notes: tokens are atomic items, not character strings;
comments & whitespace are not tokens (in most languages
counterexamples: Python indenting, Ruby newlines)
Tokens may carry associated data (e.g., int value, variable name)

UW CSE 401 Winter 2015 A-24


Parser Output (IR)
Given token stream from scanner, the parser must
produce output that captures the meaning of the
program
Most common output from a parser is an abstract
syntax tree
Essential meaning of program without syntactic
noise
Nodes are operations, children are operands

UW CSE 401 Winter 2015 A-25


Parser Example
Original source program:
// this statement does very little
if (x >= y) y = 42;

Token Stream Abstract Syntax Tree


ifStmt
IF LPAREN ID(x)
GEQ ID(y) RPAREN >= assign
ID(y) ASSIGN
INT(42) SCOLON ID(x) ID(y) ID(y) INT(42)

UW CSE 401 Winter 2015 A-26


Static Semantic Analysis
During or after parsing, check that the program is legal and
collect info for the back end
Type checking
Check language requirements like proper declarations, etc.
Preliminary resource allocation
Collect other information needed by back end analysis and
code generation
Key data structure: Symbol Table(s)
Maps names -> meaning/types/details

UW CSE 401 Winter 2015 A-27


Back End
Responsibilities
Translate IR into target machine code
Should produce good code
good = fast, compact, low power (pick some)
Optimization phase translates correct code into
semantically equivalent better code
Should use machine resources effectively
Registers, Instructions, Memory hierarchy

UW CSE 401 Winter 2015 A-28


Back End Structure
Typically split into two major parts
Optimization code improvements
Examples: common subexpression elimination, constant
folding, code motion (move invariant computations outside of
loops)
Target Code Generation (machine specific)
Instruction selection & scheduling, register allocation
Usually walk the AST to generate lower-level intermediate code
before optimization

UW CSE 401 Winter 2015 A-29


Back-end: The Result
Input Output
if (x >= y) y = 42;
mov eax,[ebp+16]
ifStmt cmp eax,[ebp-8]
jl L17
>= assign
mov [ebp-8],42
ID(x) ID(y) ID(y) INT(42) L17:

UW CSE 401 Winter 2015 A-30


Interpreters & Compilers
Programs can be compiled or interpreted (or both)
Compiler
A program that translates a program from one language
(the source) to another (the target)
Languages are sometimes even the same(!)
Interpreter
A program that reads a source program and produces
the results of executing that program on some input
UW CSE 401 Winter 2015 A-31
Common Issues
Compilers and interpreters both must read
the input a stream of characters and
understand it: front-end analysis phase

w h i l e ( k < l e n g t h ) { <nl> <tab> i f ( a [ k ] > 0 ) <nl> <tab> <tab>{ n P o s + + ; }


<nl> <tab> }

UW CSE 401 Winter 2015 A-32


Compiler
Read and analyze entire program
Translate to semantically equivalent program
in another language
Presumably easier or more efficient to execute
Offline process
Tradeoff: compile-time overhead
(preprocessing) vs execution performance
UW CSE 401 Winter 2015 A-33
Typically implemented with Compilers
FORTRAN, C, C++, COBOL, many other
programming languages, (La)TeX, SQL
(databases), VHDL, many others

Particularly appropriate if significant


optimization wanted/needed
UW CSE 401 Winter 2015 A-34
Interpreter
Typically implemented as an execution engine
Program analysis interleaved with execution:
running = true;
while (running) {
analyze next statement;
execute that statement;
}
Usually requires repeated analysis of individual statements
(particularly in loops, functions)
But hybrid approaches can avoid some of this overhead
But: immediate execution, good debugging/interaction, etc.

UW CSE 401 Winter 2015 A-35


Often implemented with interpreters
Javascript, PERL, Python, Ruby, awk, sed, shells
(bash), Scheme/Lisp/ML/OCaml, postscript/pdf,
machine simulators
Particularly efficient if interpreter overhead is low
relative to execution cost of individual statements
But even if not (machine simulators), flexibility,
immediacy, or portability may be worth it

UW CSE 401 Winter 2015 A-36


Hybrid approaches
Compiler generates byte code intermediate language, e.g.
compile Java source to Java Virtual Machine .class files, then
Interpret byte codes directly, or
Compile some or all byte codes to native code
Variation: Just-In-Time compiler (JIT) detect hot spots &
compile on the fly to native code
Also wide use for Javascript, many functional and other
languages (Haskell, ML, Ruby), C# and Microsoft Common
Language Runtime, others

UW CSE 401 Winter 2015 A-37


Why Study Compilers? (1)
Become a better programmer(!)
Insight into interaction between languages, compilers, and hardware
Understanding of implementation techniques, how code maps to
hardware
Better intuition about what your code does
Understanding how compilers optimize code helps you write code that
is easier to optimize
And avoid wasting time doing optimizations that the compiler will
do as well or better particularly if you dont try to get too clever

UW CSE 401 Winter 2015 A-38


Why Study Compilers? (2)
Compiler techniques are everywhere
Parsing (little languages, interpreters, XML)
Software tools (verifiers, checkers, )
Database engines, query languages
AI, etc.: domain-specific languages
Text processing
Tex/LaTex -> dvi -> Postscript -> pdf
Hardware: VHDL; model-checking tools
Mathematics (Mathematica, Matlab, SAGE)

UW CSE 401 Winter 2015 A-39


Alguma dvida? Perguntas?

Faam sempre perguntas para terem certeza de que


realmente esto sabendo o que est acontecendo

Ausncia de perguntas significa que est indo tudo


bem... (ou no...)

You might also like