You are on page 1of 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
Erro comum:
ou compilados
X uma linguagem
Compilao Just-in-time
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

Algoritmos gulosos
Inteligncia Artificial
Busca heurstica

Algoritmos Algoritmos de grafos, union-find


Programao dinmica

Teoria DFAs, PDAs, casamento de padro


Algoritmos de ponto fixo
Alocao, nomes, sincronizao,
Sistemas
localidade, concorrncia

Arquitetura 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 Cdigo de
fonte Compilador 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
7

Monday, August 15, 11


Compilador de duas partes

Front Back
Cdigo End IR
End Cdigo de
fonte mquina
Depende Depende
principalmente da principalmente da
linguagem fonte mquina

Erros

Implicaes Princpio clssico de


Eng. de Software:
Uso de uma representao intemerdiria (IR) Separao de
Front end mapeia fonte em IR 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
Front Back
Fortran Mquina 1
end end
Front
Scheme
end
Back
Mquina 2
end
Front
C++
end

Front Back Mquina 3


Python end
end

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
9

Monday, August 15, 11


O Front End

Cdigo tokens IR
Scanner Parser
fonte

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 tokens IR
Scanner Parser
fonte

Erros
Scanner
Mapeia caracteres em palavrasa unidade bsica da sintaxe
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
Tokens tpicos incluem nmeros, identificadores, +, , new, while, if
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 tokens IR
Scanner Parser
fonte

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
S=S
3. | Term
4. Termo num T = { num, id, +, - }
5. | id N = { S, Expr, Termo, Op }
6. Op +
P = { 1, 2, 3, 4, 5, 6, 7 }
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. S Expr
2. Expr Expr Op Termo
3. | Termo
4. Term num
5. | id
6. Op +
7. | -

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. S Expr
2. Expr Expr Op Termo
3. | Termo
4. Term num
5. | id
6. Op +
7. | -

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. S Expr
2. Expr Expr Op Termo
3. | Termo
4. Term num
5. | id
6. Op +
7. | -

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. S Expr
2. Expr Expr Op Termo
1 Expr
3. | Termo
4. Term num
5. | id
6. Op +
7. | -

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. S Expr
2. Expr Expr Op Termo
1 Expr
3. | Termo
2 Expr Op Termo 4. Term num
5. | id
6. Op +
7. | -

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. S Expr
2. Expr Expr Op Termo
1 Expr
3. | Termo
2 Expr Op Termo 4. Term num
5 Expr Op y 5. | id
6. Op +
7. | -

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. S Expr
2. Expr Expr Op Termo
1 Expr
3. | Termo
2 Expr Op Termo 4. Term num
5 Expr Op y 5. | id
6. Op +
7 Expr - y
7. | -

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. S Expr
2. Expr Expr Op Termo
1 Expr
3. | Termo
2 Expr Op Termo 4. Term num
5 Expr Op y 5. | id
6. Op +
7 Expr - y
7. | -
2 Expr Op Termo - y

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. S Expr
2. Expr Expr Op Termo
1 Expr
3. | Termo
2 Expr Op Termo 4. Term num
5 Expr Op y 5. | id
6. Op +
7 Expr - y
7. | -
2 Expr Op Termo - y
4 Expr Op 2 - y

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. S Expr
2. Expr Expr Op Termo
1 Expr
3. | Termo
2 Expr Op Termo 4. Term num
5 Expr Op y 5. | id
6. Op +
7 Expr - y
7. | -
2 Expr Op Termo - y
4 Expr Op 2 - y
6 Expr + 2 - y

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. S Expr
2. Expr Expr Op Termo
1 Expr
3. | Termo
2 Expr Op Termo 4. Term num
5 Expr Op y 5. | id
6. Op +
7 Expr - y
7. | -
2 Expr Op Termo - y
4 Expr Op 2 - y
6 Expr + 2 - y
3 Termo + 2 - y

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. S Expr
2. Expr Expr Op Termo
1 Expr
3. | Termo
2 Expr Op Termo 4. Term num
5 Expr Op y 5. | id
6. Op +
7 Expr - y
7. | -
2 Expr Op Termo - y
4 Expr Op 2 - y
6 Expr + 2 - y
3 Termo + 2 - y
5 x + 2 - y
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. S Expr
2. Expr Expr Op Termo
1 Expr
3. | Termo
2 Expr Op Termo 4. Term num
5 Expr Op y 5. | id
6. Op +
7 Expr - y
7. | -
2 Expr Op Termo - y
4 Expr Op 2 - y
Uma
6 Expr + 2 - y
derivao
3 Termo + 2 - y
5 x + 2 - y
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 Op Termo

Expr Op Termo - <id,y>


1. S Expr
+ <num,2> 2. Expr Expr Op Termo
Termo
3. | Termo
4. Termo num
<id,x> 5. | id
6. Op +
Contm muita informao 7. | -
desnecessria
16

Monday, August 15, 11


O Front End
Compiladores normalmente usam uma rvore sinttica abstrata (AST)
ao invs de uma rvore de sintaxe

+ <id,y> A AST resume a


estrutura gramtica,
sem incluir os detalhes
<id,x> <num,2> da derivao

Muito mais conciso

ASTs so um tipo de representao intermediria (IR)


Alguns acham AST a IR
natural.
17

Monday, August 15, 11


O Front End

Cdigo tokens IR
Scanner Parser
fonte

Erros

O Formato do Cdigo determina muitas propriedades do


programa resultante
abxc+d vira
+
a

Relembre a diferena no uso x d


dos registradores da aula
passada!
b c

18

Monday, August 15, 11


O Front End

Cdigo tokens IR
Scanner Parser
fonte

Erros

O Formato do Cdigo determina muitas propriedades do


programa resultante
seq
abxc+d
vira
ef+bxc+d

+ e +
a
Se voc transformar essa AST
em cdigo provavelmente vai ter f +
x d
duplicao.
x d
b c
19
b c
Monday, August 15, 11
O Front End

Cdigo tokens IR
Scanner Parser
fonte

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 2 3 bxc+d
Gostaramos de produzir esse load @d r4

cdigo, mas fazer isso add r3,r4 r5


reusa
corretamente requer bastante store r5 @a
bxc+d
esforo! load @f r6
add r5,r6 r7
20
store r7 @e
Monday, August 15, 11
O Front End

Cdigo tokens IR
Scanner Parser
fonte

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 2 3 bxc+d
Gostaramos de produzir esse load @d r4

cdigo, mas fazer isso add r3,r4 r5


reusa
corretamente requer bastante store r5 @a
bxc+d
esforo! load @f r6
add r5,r6 r7
20
store r7 @e
Monday, August 15, 11
O Back End

IR Seleo de IR Alocao IR Escalon. Cdigo de


Instrues de reg. de Inst. 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 IR IR Cdigo de
Alocao Escalon.
Instrues de reg. de Inst. 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 IR Alocao IR Escalon. Cdigo de


Instrues de reg. de Inst. 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 IR Alocao IR Escalon. Cdigo de


Instrues de reg. de Inst. 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 tokens IR
Scanner Parser
fonte

Erros

load @b r1
abxc+d load @c r2
vira calcula
ef+bxc+d mult r1,r2 r3 bxc+d
load @d r4
add r3,r4 r5
Lembram desse exemplo de reusa
store r5 @a
alguns slides atrs? bxc+d
load @f r6
add r5,r6 r7
25
store r7 @e
Monday, August 15, 11
O Back End

IR Seleo de IR Alocao IR Escalon. Cdigo de


Instrues de reg. de Inst. mquina

Erros

Escalonamento de Instrues

unidade 1 unidade2 Esse escalonamento carrega


load @b r1 load @c r2 agressivamente valores em
load @d r4 load @f r6 registradores pra esconder a
mult r1,r2 r3 nop latncia da memria.
add r3,r4 r5 nop
Termina a computao o mais cedo
store r5 @a nop possvel, assumindo 2 ciclos para
add r5,r6 r7 nop load e store, e 1 ciclo pro resto.
store r7 @e nop
26

Monday, August 15, 11


O Back End

IR Seleo de IR Alocao IR Escalon. Cdigo de


Instrues de reg. de Inst. mquina

Erros

Escalonamento de Instrues Mesmo tempo, usa menos


registradores

unit 1 unit 2 . unit 1 unit 2


load @b r1 load @c r2 load @b r1 load @c r2
load @d r4 load @f r6 load @d r4 nop
mult r1,r2 r3 nop mult r1,r2 r3 nop
add r3,r4 r5 nop add r3,r4 r5 load @f r6
store r5 @a nop store r5 @a nop
add r5,r6 r7 nop add r5,r6 r7 nop
store r7 @e nop store r7 @e nop 27

Monday, August 15, 11


Compilador de trs partes

Cdigo Front IR Otimizador IR Back Cdigo de


fonte End (Middle End) End 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. IR Ot. IR Ot. IR


... Ot. IR
1 2 3 n

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

Compilador
Base de cdigo JIT
Poltica escolhe entre Ambiente de execuo
interpretador e compilador

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
Juno
Front Otim. de Anlise Alocao
de Cdigo Montagem
End ndices de Fluxo de Reg.

Front End Middle End 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 CFG Re -
Busy Elim. assoc Aloc.
& e CSE LICM OSR Mont.
Vars Cpia Reg.
Parse DOM (consts)

Front Middle End Back End


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.

Lex-
Syn- Delay TLA Rank Pack Code Final
Flo

Front Middle Back End


End 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 Middle End Back End


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
35

Monday, August 15, 11


Compiladores Clssicos
1980: Compilador PL.8 da IBM

Front Middle End Back End


End
Dead code elimination
Global cse
Code motion
Um front end, vrios back ends Constant folding
Strength reduction
Coleo de 10 ou mais passadas Value numbering
Dead store elimination
Repetia algumas passadas e anlises Code straightening
Representava ops complexas em 2 nvels Trap elimination
Algebraic reassociation
IR abaixo do nvel da mquina
35

Monday, August 15, 11


Compiladores Clssicos
1980: Compilador PL.8 da IBM

Front Middle End Back End


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
35

Monday, August 15, 11


Compiladores Clssicos
1980: Compilador PL.8 da IBM

Front Middle End Back End


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
35

Monday, August 15, 11


Compiladores Clssicos
1986: Compilador PA-RISC HP

Front Middle End Back


End 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

You might also like