Академический Документы
Профессиональный Документы
Культура Документы
2011.2
http://www.dcc.ufrj.br/~fabiom/comp
Compiladores
O que um compilador?
Um programa que traduz um programa executvel em uma
linguagem em um programa executvel em outra linguagem
O compilador deve melhorar de alguma forma o programa
O que um interpretador?
Um programa que l um programa executvel e produz o
resultado da execuo desse programa
Erro comum:
X uma linguagem
interpretada (ou compilada)
2
Compiladores so interessantes
Incluem muitas aplicaes prticas de aspectos tericos
Expem questes algortmicas e de engenharia
Algoritmos gulosos
Busca heurstica
Algoritmos de grafos, union-find
Programao dinmica
DFAs, PDAs, casamento de padro
Algoritmos de ponto fixo
Alocao, nomes, sincronizao,
localidade, concorrncia
Gerenciamento do pipeline
Uso do conjunto de instrues
funcionais
It was our belief that if FORTRAN, during its first months, were to
translate any reasonable scientific source program into an object
program only half as fast as its hand-coded counterpart, then
acceptance of our system would be in serious danger... I believe that
had we failed to produce efficient programs, the widespread use of
languages like FORTRAN would have been seriously delayed.
John Backus sobre o primeiro compilador FORTRAN
Cdigo
fonte
Compilador
Cdigo de
mquina
Erros
Implicaes
Front
End
IR
Depende
principalmente da
linguagem fonte
Back
End
Cdigo de
mquina
Depende
principalmente da
mquina
Erros
Implicaes
Princpio clssico de
Eng. de Software:
Separao de
Interesses
Tipicamente o front end O(n) ou O(n log n), e o back end NPC
8
O Santo Graal
Fortran
Front
end
Scheme
Front
end
C++
Front
end
Python
Front
end
Back
end
Mquina 1
Back
end
Mquina 2
Back
end
Mquina 3
O Front End
Cdigo
fonte
Scanner
tokens
IR
Parser
Erros
Responsabilidades
O Front End
Cdigo
fonte
Scanner
tokens
IR
Parser
Erros
Scanner
Velocidade importante
Livros texto advogam o uso de geradores de scanners
O Front End
Cdigo
fonte
Scanner
tokens
IR
Parser
Erros
Parser
O Front End
Sintaxe livre de contexto especificada com uma gramtica
E E + E | E - E | E * E | E / E | (E) | num
Essa gramtica define o conjunto de expresses aritmticas
simples
Escrita numa variante da BackusNaur Form (BNF)
Formalmente, em uma gramtica G = (S,N,T,P)
S o smbolo inicial
N um conjunto de smbolos no-terminais
T um conjunto de smbolos terminais (ou palavras)
P um conjunto de produes ou regras de reescrita
(P : N N T )
13
O Front End
Outra gramtica mais complexa
1. S Expr
2. Expr Expr Op Termo
3.
| Term
4. Termo num
5.
6. Op
7.
id
+
|
S=S
T = { num, id, +, - }
N = { S, Expr, Termo, Op }
P = { 1, 2, 3, 4, 5, 6, 7 }
14
O Front End
Dada uma CFG, podemos derivar frases por substituio
1.
2.
3.
4.
5.
6.
7.
S Expr
Expr Expr Op Termo
| Termo
Term num
| id
Op
+
|
O Front End
Dada uma CFG, podemos derivar frases por substituio
Produo
Resultado
1.
2.
3.
4.
5.
6.
7.
S Expr
Expr Expr Op Termo
| Termo
Term num
| id
Op
+
|
O Front End
Dada uma CFG, podemos derivar frases por substituio
Produo
Resultado
S
1.
2.
3.
4.
5.
6.
7.
S Expr
Expr Expr Op Termo
| Termo
Term num
| id
Op
+
|
O Front End
Dada uma CFG, podemos derivar frases por substituio
Produo
1
Resultado
S
Expr
1.
2.
3.
4.
5.
6.
7.
S Expr
Expr Expr Op Termo
| Termo
Term num
| id
Op
+
|
O Front End
Dada uma CFG, podemos derivar frases por substituio
Produo
Resultado
S
Expr
Expr Op Termo
1.
2.
3.
4.
5.
6.
7.
S Expr
Expr Expr Op Termo
| Termo
Term num
| id
Op
+
|
O Front End
Dada uma CFG, podemos derivar frases por substituio
Produo
Resultado
S
Expr
Expr Op Termo
Expr Op y
1.
2.
3.
4.
5.
6.
7.
S Expr
Expr Expr Op Termo
| Termo
Term num
| id
Op
+
|
O Front End
Dada uma CFG, podemos derivar frases por substituio
Produo
Resultado
S
Expr
Expr Op Termo
Expr Op y
Expr - y
1.
2.
3.
4.
5.
6.
7.
S Expr
Expr Expr Op Termo
| Termo
Term num
| id
Op
+
|
O Front End
Dada uma CFG, podemos derivar frases por substituio
Produo
Resultado
S
Expr
Expr Op Termo
Expr Op y
Expr - y
Expr Op Termo - y
1.
2.
3.
4.
5.
6.
7.
S Expr
Expr Expr Op Termo
| Termo
Term num
| id
Op
+
|
O Front End
Dada uma CFG, podemos derivar frases por substituio
Produo
Resultado
S
Expr
Expr Op Termo
Expr Op y
Expr - y
Expr Op Termo - y
Expr Op 2 - y
1.
2.
3.
4.
5.
6.
7.
S Expr
Expr Expr Op Termo
| Termo
Term num
| id
Op
+
|
O Front End
Dada uma CFG, podemos derivar frases por substituio
Produo
Resultado
S
Expr
Expr Op Termo
Expr Op y
Expr - y
Expr Op Termo - y
Expr Op 2 - y
Expr + 2 - y
1.
2.
3.
4.
5.
6.
7.
S Expr
Expr Expr Op Termo
| Termo
Term num
| id
Op
+
|
O Front End
Dada uma CFG, podemos derivar frases por substituio
Produo
Resultado
S
Expr
Expr Op Termo
Expr Op y
Expr - y
Expr Op Termo - y
Expr Op 2 - y
Expr + 2 - y
Termo + 2 - y
1.
2.
3.
4.
5.
6.
7.
S Expr
Expr Expr Op Termo
| Termo
Term num
| id
Op
+
|
O Front End
Dada uma CFG, podemos derivar frases por substituio
Produo
Resultado
S
Expr
Expr Op Termo
Expr Op y
Expr - y
Expr Op Termo - y
Expr Op 2 - y
Expr + 2 - y
Termo + 2 - y
x + 2 - y
1.
2.
3.
4.
5.
6.
7.
S Expr
Expr Expr Op Termo
| Termo
Term num
| id
Op
+
|
O Front End
Dada uma CFG, podemos derivar frases por substituio
Produo
Resultado
S
Expr
Expr Op Termo
Expr Op y
Expr - y
Expr Op Termo - y
Expr Op 2 - y
Expr + 2 - y
Termo + 2 - y
x + 2 - y
1.
2.
3.
4.
5.
6.
S Expr
Expr Expr Op Termo
| Termo
Term num
| id
Op
+
7.
Uma
derivao
O Front End
Um casamento pode ser representado por uma rvore (a rvore
de sintaxe)
S
x + 2 - y
Expr
Expr
Expr
Termo
Op
+
Termo
<num,2>
<id,x>
Op
Termo
<id,y>
1.
2.
3.
4.
5.
6.
7.
S Expr
Expr Expr Op Termo
| Termo
Termo num
| id
Op
+
| 16
O Front End
Compiladores normalmente usam uma rvore sinttica abstrata (AST)
ao invs de uma rvore de sintaxe
-
<id,x>
<id,y>
<num,2>
A AST resume a
estrutura gramtica,
sem incluir os detalhes
da derivao
17
O Front End
Cdigo
fonte
tokens
Scanner
IR
Parser
Erros
abxc+d
Relembre a diferena no uso
dos registradores da aula
passada!
vira
a
x
b
d
c
18
O Front End
Cdigo
fonte
Scanner
tokens
IR
Parser
Erros
ef+bxc+d
Se voc transformar essa AST
em cdigo provavelmente vai ter
duplicao.
x
b
c
b
d
c
19
O Front End
Cdigo
fonte
Scanner
tokens
IR
Parser
Erros
load @d r4
add r3,r4 r5
store r5 @a
load @f r6
add r5,r6 r7
store r7 @e
bxc+d
reusa
bxc+d
20
O Front End
Cdigo
fonte
Scanner
tokens
IR
Parser
Erros
a distinto de b, c, e d ?
load @d r4
add r3,r4 r5
store r5 @a
load @f r6
add r5,r6 r7
store r7 @e
bxc+d
reusa
bxc+d
20
O Back End
IR
Seleo de
Instrues
IR
Alocao
de reg.
IR
Escalon.
de Inst.
Cdigo de
mquina
Erros
Responsabilidades
O Back End
IR
Seleo de
Instrues
IR
Alocao
de reg.
IR
Escalon.
de Inst.
Cdigo de
mquina
Errors
Seleo de Instrues
O Back End
IR
Seleo de
Instrues
IR
Alocao
de reg.
IR
Escalon.
de Inst.
Cdigo de
mquina
Erros
Alocao de Registradores
O Back End
IR
Seleo de
Instrues
IR
Alocao
de reg.
IR
Escalon.
de Inst.
Cdigo de
mquina
Erros
Escalonamento de Instrues
O Front End
Cdigo
fonte
tokens
Scanner
IR
Parser
Erros
abxc+d
ef+bxc+d
load @b r1
vira
load @c r2
mult r1,r2 r3
load @d r4
add r3,r4 r5
store r5 @a
load @f r6
add r5,r6 r7
store r7 @e
calcula
bxc+d
reusa
bxc+d
25
O Back End
IR
Seleo de
Instrues
IR
Alocao
de reg.
IR
Escalon.
de Inst.
Cdigo de
mquina
Erros
Escalonamento de Instrues
unidade 1
load @b r1
unidade2
load @c r2
load @d r4
load @f r6
mult r1,r2 r3
nop
add r3,r4 r5
nop
store r5 @a
nop
add r5,r6 r7
nop
store r7 @e
nop
O Back End
IR
Seleo de
Instrues
IR
Alocao
de reg.
IR
Escalon.
de Inst.
Cdigo de
mquina
Erros
Escalonamento de Instrues
unit 1
load @b r1
unit 2
.
load @c r2
load @d r4
load @f r6
mult r1,r2 r3
nop
add r3,r4 r5
nop
store r5 @a
nop
add r5,r6 r7
nop
store r7 @e
nop
unit 1
load @b r1
unit 2
load @c r2
load @d r4
nop
mult r1,r2 r3
nop
add r3,r4 r5
load @f r6
store r5 @a
nop
add r5,r6 r7
nop
store r7 @e
nop
27
Front
End
IR
Otimizador
IR
(Middle End)
Back
End
Cdigo de
mquina
Erros
28
Ot.
1
IR
Ot.
2
IR
Ot.
3
IR
...
Ot.
n
IR
Erros
Transformaes Tpicas
offline
Interpretador
IR
Base de cdigo
Compilador
JIT
Ambiente de execuo
30
Ambiente de execuo
Servios de gerenciamento de memria
Alocao (no heap ou em um registro de ativao na pilha)
Desalocao
Coleta de lixo
Suporte a paralelismo
Inicializao de threads
Comunicao e sincronizao
Compiladores Clssicos
1957: The FORTRAN Automatic Coding System
Front
End
Front End
Otim. de
ndices
Juno
de Cdigo
Anlise
de Fluxo
Middle End
Alocao
de Reg.
Montagem
Back End
32
Compiladores Clssicos
1969: Compilador FORTRAN H
Scan
&
Parse
CFG
e
DOM
Busy
Vars
Front
End
CSE
LICM
Elim.
Cpia
OSR
Re assoc
(consts)
Aloc.
Reg.
Middle End
Mont.
Back End
Compiladores Clssicos
1975: BLISS-11 (Wulf et al., CMU)
Alocao de reg.
LexSynFlo
Delay
Front
End
Middle
End
TLA
Rank
Pack
Code
Final
Back End
Compiladores Clssicos
1980: Compilador PL.8 da IBM
Front
End
Middle End
Back End
35
Compiladores Clssicos
1980: Compilador PL.8 da IBM
Front
End
Middle End
Back End
Dead code elimination
Global cse
Code motion
Constant folding
Strength reduction
Value numbering
Dead store elimination
Code straightening
Trap elimination
Algebraic reassociation
35
Compiladores Clssicos
1980: Compilador PL.8 da IBM
Front
End
Middle End
Back End
35
Compiladores Clssicos
1980: Compilador PL.8 da IBM
Front
End
Middle End
Back End
Vrias IRs com
diferentes nveis
35
Compiladores Clssicos
1986: Compilador PA-RISC HP
Front
End
Middle End
Back
End
36