You are on page 1of 38

MC6138 - lmplemenLao de

Llnguagens ll
e
MC900A - 1plcos Lspeclals em
Llnguagem de rogramao
rof. Culdo Arau[o
www.lc.unlcamp.br/~guldo
LmenLa
Tcnicas avanadas usadas no projeto de
compiladores modernos. Tais como:
anlise de fluxo de dados,
otimizao de cdigo,
alocao de registradores,
escalonamento de instrues,
gerao de cdigo para arquiteturas paralelas.
8lbllograa
Livro do Drago: Aho, Lam, Sethi and Ullman.
Compilers: Principles, techniques and tools. Second
Edition. Addison-Wesley.
Livro do Muchnick: Steven S. Muchnick.
Advanced Compiler Design and Implementation.
Morgan Kaufmann.
Livro do Wolfe: Michael Wolfe. High Performance
Compilers for Parallel Computing.
Livro do Appel: Andrew Appel. Modern Compiler
Implementation in Java. Second Edition. Cambridge
Avallao
2 Provas: P1 (35%) e P2 (35%)
Atividades extras: 30%
8epresenLao lnLermedlrla (8l)
Anlise lxica
(scanner)
Anlise sinttica
(parser)
Anlise
semntica
Gerao de cdigo
intermedirio (RI)
Otimizaes
independentes de
mquina
Gerao de cdigo
(alvo)
Otimizaes
especficas de
mquina
Front-end
Back-end
!"#$%&'$( / *+,-&'$(
Ex: traduo de uma
sentena (Fig. 1.7
Drago)
8epresenLao lnLermedlrla (8l)
Uma RI independente da linguagem de
programao e da arquitetura alvo facilita o
desenvolvimento de um compilador compile de
M linguagens para N mquinas. Ex:
Java
C
C++
Pascal
MIPS
SPARC
x86
PowerPC
8l
ARM
8epresenLao lnLermedlrla (8l)
Caractersticas desejveis:
Facilmente construda a partir da anlise semntica
e capaz de expressar propriedades da linguagem de
programao pertinentes otimizao.
Adequada para otimizaes de cdigo: Ex:
facilmente alterada (re-escrita) durante as
transformaes do cdigo.
Conveniente para a traduo para linguagem de
mquina.
8epresenLao lnLermedlrla (8l)
Nem sempre possvel satisfazer todas a
caractersticas desejveis com uma nica RI.
Soluo: Mltiplas RIs. Ex: Muchnick Fig 4.1
L1 <= [ + 2
L2 <= l * 20
L3 <= L1 + L2
L4 <= 4 * L3
L3 <= addr a
L6 <= L3 + L4
L7 <= *L6
r1 <= [fp-4]
r2 <= r1 + 2
r3 <= [fp-8]
r4 <= r3 * 20
r3 <= r4 + r2
r6 <= 4 * r3
r7 <= fp - 216
f1 <= [r7+r6]
L1 <= a[l, [+2]
HIR MIR LIR
* float a[20][10]
CaracLerlsucas de uma 8l
!"#$ &'()": acesso a arrays, chamada de procedlmenLos.
1lplcamenLe usada nos esLglos lnlclals da compllao.
Lx: rvores slnLucas absLraLas.
*'()" +,-.$: composLa por descrles de operaes
slmples: busca/armazenamenLo de valores, soma,
movlmenLao, salLos, eLc. Adequada para oumlzaes
lndependenLe de mqulna.
Lx: Ml8 (Llvro do Muchnlck), CCC 81L, LLvM l8.
/0.1$ &'()": prxlma a arqulLeLura alvo. Mals adequada para
as oumlzaes de cdlgo dependenLes de mqulnas.
1lpos de 8l
8epresenLaes grcas:
rvores ou uACs (./"',%'( 0,1,2/, 3"+456)
Manlpulao pode ser felLa aLraves de gramucas
ode ser LanLo de alLo-nlvel como nlvel medlo
8epresenLao llnear:
Cdlgo de Lrs endereos (%5"''&+(("'66 ,#(')
rvores x uACs
Lxpresso: a := b*-c + b*-c;
assign
+
uminus
b
c
a
*
rvore
uminus
b
c
*
rvores x uACs
Lxpresso: a := b*-c + b*-c;
assign
+
uminus
b
c
a
*
rvore
uminus
b
c
*
Sub-expresses comuns
rvores x uACs
Lxpresso: a := b*-c + b*-c;
DAG
rvore
assign
+
uminus
b
c
a
*
uminus
b
c
*
a
assign
+
uminus
b
c
*
CuLro exemplo de rvore
Llvro do Appel: Cap. 7
1lpos de operaes (ns): consL, blnop, mem, call,
eLc
Lxemplo: +7/8
MEM
+
BINOP MEM
MUL i CONST
w
e
MEM(+(MEM(e), BINOP(MUL, i, CONST w)))
a
8epresenLao Llnear
A 8l se assemelha a um pseudo-cdlgo para
alguma mqulna absLraLa.
!ava: 8yLecode (lnLerpreLado ou Lraduzldo)
Cdlgo de Lrs endereos
Cdlgo de Lrs endereos
lorma geral: llsLa de senLenas 1 := 2 #4 34
8epresenLao llnearlzada de uma rvore slnLuca,
ou uAC
a := b * -c + b * - c
Ref.: Aho, et al Cap 8
uminus
assign
+
uminus b
c
a
*
b
*
c
t1 := - c
t2 := b * t1
t3 := -c
t4 := b * t3
t5 := t2 + t4
a := t5
Cdlgo de Lrs endereos
1lpos de senLenas:
aLrlbulo: x := y op z ou x := y ou x:= op y
salLos: goLo L
desvlos condlclonals: lf x relop y goLo L
chamadas a procedlmenLos: param x and call p,n
reLorno: reLurn y
+""+16: x := y[l] ou x[l]:=y
Lxemplo: roduLo lnLerno
{
...
prod = 0;
i = 1;
do {
prod = prod + a[i] * b[i];
i = i +1;
} while (i <= 20);
...
}
(1) prod := 0
(2) i : = 1
(3) t1 := 4 * i
(4) t2 := a [ t1]
(5) t3 := 4 * i
(6) t4 := b [t3]
(7) t5 := t2 * t4
(8) t6 := prod + t5
(9) prod := t6
(10) t7 := i + 1
(11) i := t7
(12) if i <= 20 goto (3)
RI
LsLruLura de uados
qudruplas: (op, arg1, arg2, resulL)
(1) ! (*, b, L1, L2)
(0) t1 := minus c
(1) t2 := b * t1
(2) t3 := minus c
(3) t4 := b * t3
(4) t5 := t2 + t4
(5) a := t5
a := b * -c + b * - c
LsLruLura de uados
qudruplas: (op, arg1, arg2, resulL)
(1) ! (*, b, L1, L2)
Lrlplas: (op, arg1, arg2)
(0) ! (-, c,)
(1) ! (*, b, (0))
(2) ! (-,c,)
(0) t1 := minus c
(1) t2 := b * t1
(2) t3 := minus c
(3) t4 := b * t3
(4) t5 := t2 + t4
(5) a := t5
a := b * -c + b * - c
LsLruLura de uados
qudruplas: (op, arg1, arg2, resulL)
(1) ! (*, b, L1, L2)
Lrlplas: (op, arg1, arg2)
(0) ! (-, c,)
(1) ! (*, b, (0))
(2) ! (-,c,)
(0) t1 := minus c
(1) t2 := b * t1
(2) t3 := minus c
(3) t4 := b * t3
(4) t5 := t2 + t4
(5) a := t5
a := b * -c + b * - c
! Adicionar e/ou remover instrues pode afetar a representao!
LsLruLura de uados
1rlplas .&-.5)#06:
(7) ! (-, c,)
(8) ! (*, b, (7))
(9) ! (-,c,)
Lista de sentenas:
(0) ! (7)
(1) ! (8)
(2) ! (9)
Lista/Vetor de apontadores
determina a ordem das
triplas no programa.
Facilita a adio/remoo de
instrues no cdigo.
Cerao de cdlgo de 3 endereos
A parur da rvore slnLuca
Lmlsso a parur de aes na gramuca com
aLrlbuLos
Cerao de cdlgo de 3 endereos
S! id := E
S.code := E.code || gen(id.place := E.place)
E ! E1 + E2 E.place := newtemp;
E.code := E1.code || E2.code ||
gen((E.place := E1.place + E2.place)
S -> if E then S1
else S2
E. true := newlabel; E.false := S.next;
S1.next := S.next;
S.code := E.code ||
gen(E.true :) || S1.code ||
gen(goto S.next) || gen( E.false :) ||
S2.code
Veja a seo 6.4 do livro do Drago!
8epresenLao Plbrlda
Comblna-se elemenLos LanLo das 8ls grcas
(esLruLura) como das llneares.
usar 8l llnear para blocos de cdlgo sequenclal e
uma represenLao grca (grafo ClC - 9#$%"#2
!2#: 3"+45) para represenLar o uxo de conLrole
enLre esses blocos
Lxemplo - ClC com cdlgo de Lrs endereos
a:= b + c
d:= e + f
if a < b goto B2
f:= a + c
d:= b + a
b:= d + c
d:= e + f
c:=d * 2
Caso 8eal - Cnu Compller Collecuon
vrlas llnguagens: pascal, forLran, C, C++
vrlas arqulLeLuras alvo: MlS, SA8C, lnLel,
MoLorola, owerC, eLc
uullza mals de uma represenLao lnLermedlrla
rvore slnLuca: consLrulda por aes na gramuca
81L: Lraduo de Lrechos da rvore
Caso 8eal - Cnu Compller Collecuon
(insn 8 6 10 (set (reg:SI 2)
(mem:SI (symbol_ref:SI (a)))))
(insn 10 8 12 (set (reg:SI 3)
(mem:SI (symbol_ref:SI (b)))))
(insn 12 10 14 (set (reg:SI 2)
(plus:SI (reg:SI 2) (reg:SI 3))))
(insn 14 12 15 (set (reg:SI 3)
(mem:SI (symbol_ref:SI (c)))))
(insn 15 14 17 (set (reg:SI 2)
(mult:SI (reg:SI 2) (reg:SI 3))))
(insn 17 15 19 (set (mem:SI (symbol_ref:SI (d)))
(reg:SI 2)))
d := (a+b)*c
Human readable GCC IR!
Caso 8eal - LLvM Compller
uesenvolvldo lnlclalmenLe por Chrls Launer e vlkram Adve
(orlenLador).
LLvM: A Compllauon lramework for Llfelong rogram Analysls &
1ransformauon, CCC 2003.
unlverslLy of llllnols Cpen Source Llcense. areclda com a
llcensa 8Su.
Crande varledade de ;"#$%&'$(6< 9= 9>>= Cb[ecuve-C, lorLran,
Ada, Paskell, !ava byLecode, yLhon, 8uby, AcuonScrlpL, CLSL,
Clang e ouLros.
ConLrlbules felLas da academla e da lndusLrla (e.g. Apple,
Coogle CSoC).
Caso 8eal - LLvM Compller
LLvM: L na verdade uma coleo de blblloLecas que podem
ser comblnadas para formar complladores. C prlnclpal
mdulo e a represenLao lnLermedlrla: LLvM l8
Caso 8eal - LLvM Compller
LLvM l8
lndependenLe da llnguagem de programao e da
arqulLeLura alvo.
ulferenLe de ouLros complladores (p.e. CCC), a
represenLao lnLermedlrla do LLvM (LLvM l8) e auLo
conuda, o que permlLe que ela se[a converuda para LexLo,
processada de forma #?&2/$', e carregada novamenLe.
8lblloLecas modulares permlLem que componenLes
(oumlzadores) que operam sobre a LLvM l8 possam ser
comblnados em um 4/4'2/$', por exemplo, para apllcar
muluplos passos de oumlzao.
Caso 8eal - LLvM Compller
#include "stdio.h
int i;
int main(void)
{
int j;
j = i + 1;
return j;
}
test.c
Lxemplo:
Cerar a LLvM l8 para o programa LesL.c" no arqulvo LesL.s
llvm-gcc -C3 -S --emlL-llvm LesL.c
Caso 8eal - LLvM Compller
; ModuleID = 'test.c'
target datalayout = e-p:64:64:64-i1:8:8-i8:8:8-
i16:...
target triple = "x86_64-apple-darwin10.8"
@i = common global i32 0
define i32 @main() nounwind readonly ssp {
entry:
%0 = load i32* @i, align 4
%1 = add nsw i32 %0, 1
ret i32 %1
}
#include "stdio.h
int i;
int main(void)
{
int j;
j = i + 1;
return j;
}
Caso 8eal - xlng
8epresenLao llnear (xl8)
uullza operaes que se aproxlmam das
dlsponlvels na llnguagem C
osslblllLa a gerao de cdlgo fonLe a parur
da 8l
Caso 8eal - xlng
int fat (int n) {
if(n==0) return 1;
else return n*fat(n-1);}
MOVE .t3 n
MOVEI .t4 0
JNE .L2 .t3 .t4
MOVEI .t5 1
RET .t5
JUMP .L1
LABEL .L2
MOVE .t7 n
MOVEI .t8 1
SUB .t9 .t7 .t8
t3 = n;
t4 = 0;
if(t3!=t4) goto L2;
t5 = 1;
return t5;
goto L1;
L2:
t7 = n;
t8 = 1;
t9 = t7 t8;
Caso 8eal - xlng
t10 = fat(t9);
//argumento
l1 = t10;
t13 = n;
t15 = l1;
t16 = t13 * t15
l2 = t16;
t19 = l2;
return t19;
L1;
CALL [.t10] fat
ARG .t9
MOVE .l1 .t10
MOVE .t13 n
MOVE .t15 .l1
MUL .t16 .t13 .t15
MOVE .l2 .t16
MOVE .t19 .l2
RET .t19
LABEL .L1
XIR Linguagem C
LelLura ComplemenLar
Llvro do urago: Cap. 6
Llvro do Appel: Cap. 7
Llvro do Muchnlck: Cap. 4

You might also like