Você está na página 1de 52

MAB 471

2011.2

MAB 471 - Compiladores I


Introduo

http://www.dcc.ufrj.br/~fabiom/comp

Monday, August 15, 11

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

C tipicamente compilada, PHP tipicamente interpretada


Java compilado para bytecodes (cdigo para VM Java)
podem ser interpretados
ou compilados
Compilao Just-in-time

Erro comum:
X uma linguagem
interpretada (ou compilada)
2

Monday, August 15, 11

Por que estudar Compiladores?


Compiladores so importantes
Responsveis por vrios aspectos do desempenho de sistemas
Aproveitar o hardware tem ficado mais difcil
In 1980, conseguia-se 85% ou mais do desempenho mximo
Hoje esse nmero est mais para 5 a 10% do mximo
O compilador tem grande influncia no desempenho

Compiladores so interessantes
Incluem muitas aplicaes prticas de aspectos tericos
Expem questes algortmicas e de engenharia

Compiladores esto em todo lugar


Muitas aplicaes tm linguagens embutidas
Comandos, macros, formatao...

Muitos formatos de arquivo parecem linguagens


3

Monday, August 15, 11

Por que estudar Compiladores?


Construo de compiladores usa ideias de muitas reas da
computao
Inteligncia Artificial
Algoritmos
Teoria
Sistemas
Arquitetura

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

Monday, August 15, 11

Por que isso importa hoje?


Todo computador atualmente multiprocessado

A era dos ganhos de clock est acabando


Consumo de energia proibitivo (quadrtico em relao ao clock)
Fios menores -> maior resistncia -> maior consumo

Melhor desempenho vir atravs de mltiplas cpias de um


mesmo processador (ncleo) em um nico chip

Programas em linguagens tradicionais no conseguem aproveitar


bem esse nvel de paralelismo
Linguagens paralelas, alguns sistemas OO concorrentes, linguagens

funcionais

Programas paralelos precisam de compiladores sofisticados

Monday, August 15, 11

Linguagens precisam de compiladores

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

Monday, August 15, 11

Viso de alto nvel de um compilador

Cdigo
fonte

Compilador

Cdigo de
mquina

Erros

Implicaes

Devem reconhecer programas legais (e ilegais)


Deve gerar cdigo correto
Deve gerenciar o armazenamento das variveis (e cdigo)
Deve concordar com o SO e linker sobre o formato de cdigo
objeto

Grande avano em relao linguagem de montagemnotao de


alto nvel

Monday, August 15, 11

Compilador de duas partes


Cdigo
fonte

Front
End

IR

Depende
principalmente da
linguagem fonte

Back
End

Cdigo de
mquina

Depende
principalmente da
mquina

Erros

Implicaes

Uso de uma representao intemerdiria (IR)


Front end mapeia fonte em IR

Princpio clssico de
Eng. de Software:
Separao de
Interesses

Back end mapeia IR em cdigo de mquina


Pode ter mltiplas passadas no front e back ends

Tipicamente o front end O(n) ou O(n log n), e o back end NPC
8

Monday, August 15, 11

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

Podemos fazer n x m compiladores com n+m componentes?

Deve codificar conhecimento especfico de cada linguagem em cada front


end

Deve codificar todas as caractersticas em um nico IR


Deve codificar conhecimento especfico das mquinas em cada back end
Bem sucedido em sistemas com IRs no nvel de assembler
ex: rtl do gcc ou ir llvm

Monday, August 15, 11

O Front End
Cdigo
fonte

Scanner

tokens

IR

Parser

Erros

Responsabilidades

Reconhecer programas legais (e ilegais)


Dar erros teis ao usurio
Produzir IR e mapa preliminar de alocao
Formatar cdigo para o resto do compilador
Muito da construo do front end pode ser automatizada
10

Monday, August 15, 11

O Front End
Cdigo
fonte

Scanner

tokens

IR

Parser

Erros

Scanner

Mapeia caracteres em palavrasa unidade bsica da sintaxe

Tokens tpicos incluem nmeros, identificadores, +, , new, while, if

Produz pares uma palavra e sua categoria sinttica


x = x + y ; vira <id,x> = <id,x> + <id,y> ;

palavra lexeme, categoria sinttica tipo do token, par um token

Velocidade importante
Livros texto advogam o uso de geradores de scanners

Vrios compiladores reais usam scanners escritos mo para maior desempenho


e controle
11

Monday, August 15, 11

O Front End
Cdigo
fonte

Scanner

tokens

IR

Parser

Erros

Parser

Reconhece sintaxe livre de contexto e reporta erros


Guia anlise sensvel ao contexto (anlise semntica/checagem
de tipos)

Constri IR para programa fonte


Relativamente fcil de escrever mo (mais que o scanner)
A maioria dos livros advoga o uso de um gerador
12

Monday, August 15, 11

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

Monday, August 15, 11

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 }

Expresses aditivas simples sobre num e id


Essa gramtica, como as outras que veremos nesse curso,
parte da classe das CFGs (gramticas livres de contexto)

14

Monday, August 15, 11

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
+
|

Para reconhecer uma frase vlida em alguma CFG revertemos esse


processo para construir um casamento
15

Monday, August 15, 11

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
+
|

Para reconhecer uma frase vlida em alguma CFG revertemos esse


processo para construir um casamento
15

Monday, August 15, 11

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
+
|

Para reconhecer uma frase vlida em alguma CFG revertemos esse


processo para construir um casamento
15

Monday, August 15, 11

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
+
|

Para reconhecer uma frase vlida em alguma CFG revertemos esse


processo para construir um casamento
15

Monday, August 15, 11

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
+
|

Para reconhecer uma frase vlida em alguma CFG revertemos esse


processo para construir um casamento
15

Monday, August 15, 11

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
+
|

Para reconhecer uma frase vlida em alguma CFG revertemos esse


processo para construir um casamento
15

Monday, August 15, 11

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
+
|

Para reconhecer uma frase vlida em alguma CFG revertemos esse


processo para construir um casamento
15

Monday, August 15, 11

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
+
|

Para reconhecer uma frase vlida em alguma CFG revertemos esse


processo para construir um casamento
15

Monday, August 15, 11

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
+
|

Para reconhecer uma frase vlida em alguma CFG revertemos esse


processo para construir um casamento
15

Monday, August 15, 11

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
+
|

Para reconhecer uma frase vlida em alguma CFG revertemos esse


processo para construir um casamento
15

Monday, August 15, 11

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
+
|

Para reconhecer uma frase vlida em alguma CFG revertemos esse


processo para construir um casamento
15

Monday, August 15, 11

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
+
|

Para reconhecer uma frase vlida em alguma CFG revertemos esse


processo para construir um casamento
15

Monday, August 15, 11

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

Para reconhecer uma frase vlida em alguma CFG revertemos esse


processo para construir um casamento
15

Monday, August 15, 11

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>

Contm muita informao


desnecessria

Op

Termo

<id,y>
1.
2.
3.
4.
5.
6.
7.

S Expr
Expr Expr Op Termo
| Termo
Termo num
| id
Op
+
| 16

Monday, August 15, 11

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

Muito mais conciso


ASTs so um tipo de representao intermediria (IR)
Alguns acham AST a IR
natural.

Monday, August 15, 11

17

O Front End
Cdigo
fonte

tokens

Scanner

IR

Parser

Erros

O Formato do Cdigo determina muitas propriedades do


programa resultante

abxc+d
Relembre a diferena no uso
dos registradores da aula
passada!

vira

a
x
b

d
c
18

Monday, August 15, 11

O Front End
Cdigo
fonte

Scanner

tokens

IR

Parser

Erros

O Formato do Cdigo determina muitas propriedades do


programa resultante
seq
abxc+d
vira

ef+bxc+d
Se voc transformar essa AST
em cdigo provavelmente vai ter
duplicao.

x
b

c
b

Monday, August 15, 11

d
c

19

O Front End
Cdigo
fonte

Scanner

tokens

IR

Parser

Erros

O Formato do Cdigo determina muitas propriedades do


programa resultante
load @b r1
abxc+d
load @c r2
vira
calcula
ef+bxc+d
mult r ,r r
1

Gostaramos de produzir esse


cdigo, mas fazer isso
corretamente requer bastante
esforo!

load @d r4
add r3,r4 r5
store r5 @a
load @f r6
add r5,r6 r7
store r7 @e

Monday, August 15, 11

bxc+d

reusa
bxc+d
20

O Front End
Cdigo
fonte

Scanner

tokens

IR

Parser

Erros

a distinto de b, c, e d ?

O Formato do Cdigo determina muitas propriedades do


programa resultante
load @b r1
abxc+d
load @c r2
vira
calcula
ef+bxc+d
mult r ,r r
1

Gostaramos de produzir esse


cdigo, mas fazer isso
corretamente requer bastante
esforo!

load @d r4
add r3,r4 r5
store r5 @a
load @f r6
add r5,r6 r7
store r7 @e

Monday, August 15, 11

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

Traduz IR em cdigo de mquina


Escolhe instrues para implementar cada operao da IR
Decide quais valores manter em registradores
Garante conformidade com interfaces do SO

Alguma automao, mas bem menos que no front-end


21

Monday, August 15, 11

O Back End
IR

Seleo de
Instrues

IR

Alocao
de reg.

IR

Escalon.
de Inst.

Cdigo de
mquina

Errors

Seleo de Instrues

Produz cdigo rpido e compacto


Aproveita recursos da mquina como modos de endereamento
Normalmente visto como um problema de casamento de padres
mtodos ad hoc, casamento de padres, programao dinmica
Forma da IR influencia escolha da tnica

Perdeu importncia com arquiteturas modernas


Processadores eram mais complicados
Ortogonalidade dos processadores RISC simplificou esse problema
22

Monday, August 15, 11

O Back End
IR

Seleo de
Instrues

IR

Alocao
de reg.

IR

Escalon.
de Inst.

Cdigo de
mquina

Erros

Alocao de Registradores

Ter cada valor em um registrador quando for usado


Gerenciar um conjunto limitado de recursos
Pode mudar a escolha de instrues e inserir LOADs e STOREs
(afeta seleo e escalonamento)

Alocao tima NP-completa na maioria dos casos


Compiladores usam solues aproximadas
23

Monday, August 15, 11

O Back End
IR

Seleo de
Instrues

IR

Alocao
de reg.

IR

Escalon.
de Inst.

Cdigo de
mquina

Erros

Escalonamento de Instrues

Evita paradas no pipeline do processador


Usa todas as unidades do processador produtivamente
Pode aumentar o tempo de vida de variveis, afetando a alocao
de registradores

Escalonamento timo NP-Completo em quase todos os casos


Algumas heursticas bem desenvolvidas
24

Monday, August 15, 11

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

Lembram desse exemplo de


alguns slides atrs?

add r3,r4 r5
store r5 @a
load @f r6
add r5,r6 r7
store r7 @e

Monday, August 15, 11

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

Monday, August 15, 11

Esse escalonamento carrega


agressivamente valores em
registradores pra esconder a
latncia da memria.
Termina a computao o mais cedo
possvel, assumindo 2 ciclos para
load e store, e 1 ciclo pro resto.
26

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

Monday, August 15, 11

Mesmo tempo, usa menos


registradores

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

Compilador de trs partes


Cdigo
fonte

Front
End

IR

Otimizador

IR

(Middle End)

Back
End

Cdigo de
mquina

Erros

Melhoria de Cdigo (ou Otimizao)

Analisa IR e reescreve (ou transforma) IR


Meta principal reduzir tempo de execuo do cdigo
compilado

Mas tambm pode melhorar tamanho, consumo de energia,

Deve preservar semntica do cdigo


Medido pelos valores das variveis

28

Monday, August 15, 11

O Otimizador (ou Middle End)


IR

Ot.
1

IR

Ot.
2

IR

Ot.
3

IR
...

Ot.
n

IR

Erros

Otimizadores modernos estruturados como uma srie de passadas

Transformaes Tpicas

Descobrir e propagar algum valor constante


Mover uma computao para um lugar menos executado
Especializar alguma computao baseada no contexto
Descobrir e eliminar computao redundante
Remover cdigo intil ou inalcanvel
Codificar um idioma em alguma forma particularmente
eficiente
29

Monday, August 15, 11

Compilao em tempo de execuo


Sistemas como HotSpot (Java) e V8 (JavaScript) usam
de compilao e otimizao em tempo de execuo
Cdigo Compilador
fonte

offline

Interpretador

IR

Base de cdigo

Poltica escolhe entre


interpretador e compilador

Compilador
JIT

Ambiente de execuo

30

Monday, August 15, 11

Ambiente de execuo
Servios de gerenciamento de memria
Alocao (no heap ou em um registro de ativao na pilha)
Desalocao
Coleta de lixo

Checagem de tipo em tempo de execuo


Processamento de erros (ex. excees)
Interface com sistema operacional
Entrada e sada

Suporte a paralelismo
Inicializao de threads
Comunicao e sincronizao

Instrospeco Reflexo (Invoke de Java, RTTI de C++)


31

Monday, August 15, 11

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

Seis passadas numa ordem fixa


Gerava bom cdigo
Assumia um nmero ilimitado de registradores pra ndices
Extraa cdigo pra fora de loops, incluindo ifs e gotos
Fazia anlise de fluxo e alocao de registradores

32

Monday, August 15, 11

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

Usava IR de baixo nvel, identificava loops usando


dominadores

Foco em otimizao de loops


Front end simples, back end simples para IBM 370
33

Monday, August 15, 11

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

Compilador para o PDP-11


Sete passadas em uma ordem fixa
Foco em formato do cdigo e seleo de instrues
LexSynFlo fazia uma anlise preliminar de fluxo
Final inclua vrias otimizaes peephole
34

Monday, August 15, 11

Compiladores Clssicos
1980: Compilador PL.8 da IBM

Front
End

Middle End

Back End

Um front end, vrios back ends


Coleo de 10 ou mais passadas
Repetia algumas passadas e anlises
Representava ops complexas em 2 nvels
IR abaixo do nvel da mquina

Monday, August 15, 11

35

Compiladores Clssicos
1980: Compilador PL.8 da IBM

Front
End

Middle End

Um front end, vrios back ends


Coleo de 10 ou mais passadas
Repetia algumas passadas e anlises
Representava ops complexas em 2 nvels
IR abaixo do nvel da mquina

Monday, August 15, 11

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

Um front end, vrios back ends


Coleo de 10 ou mais passadas
Repetia algumas passadas e anlises
Representava ops complexas em 2 nvels
IR abaixo do nvel da mquina

Monday, August 15, 11

35

Compiladores Clssicos
1980: Compilador PL.8 da IBM

Front
End

Middle End

Back End
Vrias IRs com
diferentes nveis

Um front end, vrios back ends


Coleo de 10 ou mais passadas
Repetia algumas passadas e anlises
Representava ops complexas em 2 nvels
IR abaixo do nvel da mquina

Monday, August 15, 11

35

Compiladores Clssicos
1986: Compilador PA-RISC HP

Front
End

Middle End

Back
End

Vrios front ends, um optimizador, e um back end


Quatro possveis nveis de otimizao, envolvendo 9 passadas
Alocador por colorao de grafos, escalonador de instrues,
otimizador peephole

36

Monday, August 15, 11