34
MO615B Implementação de Linguagens II e MC900A Tópicos Especiais em Linguagem de Programação Prof. Edson Borin www.ic.unicamp.br/~edson 2o Semestre 2011

!MO615B!(!Implementação!de! Linguagens!II e! !!!!!!MC900A ... · Ementa Técnicas avançadas usadas no projeto de compiladores modernos. Tais como: • análise de fluxo de dados,

Embed Size (px)

Citation preview

Page 1: !MO615B!(!Implementação!de! Linguagens!II e! !!!!!!MC900A ... · Ementa Técnicas avançadas usadas no projeto de compiladores modernos. Tais como: • análise de fluxo de dados,

 MO615B  -­‐  Implementação  de  Linguagens  II  

e                MC900A  -­‐  Tópicos  Especiais  em  

Linguagem  de  Programação  

Prof.  Edson  Borin  www.ic.unicamp.br/~edson  

2o  Semestre  -­‐  2011  

Page 2: !MO615B!(!Implementação!de! Linguagens!II e! !!!!!!MC900A ... · Ementa Técnicas avançadas usadas no projeto de compiladores modernos. Tais como: • análise de fluxo de dados,

Ementa  

Técnicas avançadas usadas no projeto de compiladores modernos. Tais como:

•  análise de fluxo de dados,

•  otimização de código,

•  alocação de registradores,

•  escalonamento de instruções,

•  geração de código para arquiteturas paralelas.

Page 3: !MO615B!(!Implementação!de! Linguagens!II e! !!!!!!MC900A ... · Ementa Técnicas avançadas usadas no projeto de compiladores modernos. Tais como: • análise de fluxo de dados,

Bibliografia  Livro do Dragão: 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

Page 4: !MO615B!(!Implementação!de! Linguagens!II e! !!!!!!MC900A ... · Ementa Técnicas avançadas usadas no projeto de compiladores modernos. Tais como: • análise de fluxo de dados,

Avaliação  

2 Provas: P1 (35%) e P2 (40%)

Atividades extras: 25%

Page 5: !MO615B!(!Implementação!de! Linguagens!II e! !!!!!!MC900A ... · Ementa Técnicas avançadas usadas no projeto de compiladores modernos. Tais como: • análise de fluxo de dados,

Front-­‐end  /  Back-­‐end  

Ex: tradução de uma sentença (Fig. 1.7 – Dragão)

Page 6: !MO615B!(!Implementação!de! Linguagens!II e! !!!!!!MC900A ... · Ementa Técnicas avançadas usadas no projeto de compiladores modernos. Tais como: • análise de fluxo de dados,

Representação  Intermediária  (RI)  

•  Uma RI independente da linguagem de programação e da arquitetura alvo facilita o desenvolvimento de um compilador compile de M linguagens para N máquinas. Ex:

Java

C

C++

Pascal

MIPS

SPARC

x86

PowerPC

RI  

ARM

Page 7: !MO615B!(!Implementação!de! Linguagens!II e! !!!!!!MC900A ... · Ementa Técnicas avançadas usadas no projeto de compiladores modernos. Tais como: • análise de fluxo de dados,

Representação  Intermediária  (RI)  

•  Características desejáveis:

•  Facilmente construída a partir da análise semântica e capaz de expressar propriedades da linguagem de programação pertinentes à otimização.

•  Adequada para otimizações de código: Ex: facilmente alterada (re-escrita) durante as transformações do código.

•  Conveniente para a tradução para linguagem de máquina.

Page 8: !MO615B!(!Implementação!de! Linguagens!II e! !!!!!!MC900A ... · Ementa Técnicas avançadas usadas no projeto de compiladores modernos. Tais como: • análise de fluxo de dados,

Representação  Intermediária  (RI)  

•  Nem sempre é possível satisfazer todas a características desejáveis com uma única RI.

•  Solução: Múltiplas RIs. Ex: Muchnick Fig 4.1

t1  <=  j  +  2  t2  <=  i  *  20  t3  <=  t1  +  t2  t4  <=  4  *  t3  t5  <=  addr  a  t6  <=  t5  +  t4  t7  <=  *t6  

r1  <=  [fp-­‐4]  r2  <=  r1  +  2  r3  <=  [fp-­‐8]  r4  <=  r3  *  20  r5  <=  r4  +  r2  r6  <=  4  *  r5  r7  <=  fp  –  216  f1  <=  [r7+r6]  

t1  <=  a[i,  j+2]  

HIR MIR LIR

* float a[20][10]

Page 9: !MO615B!(!Implementação!de! Linguagens!II e! !!!!!!MC900A ... · Ementa Técnicas avançadas usadas no projeto de compiladores modernos. Tais como: • análise de fluxo de dados,

Caracterís`cas  de  uma  RI  

•  Alto  nível:  acesso  a  arrays,  chamada  de  procedimentos.  Tipicamente  usada  nos  estágios  iniciais  da  compilação.    –  Ex:  árvores  sintá`cas  abstratas.  

•  Nível  médio:  composta  por  descrições  de  operações  simples:  busca/armazenamento  de  valores,  soma,  movimentação,  saltos,  etc.  Adequada  para  o`mizações  independente  de  máquina.  –  Ex:  MIR  (Livro  do  Muchnick),  GCC  RTL,  LLVM  IR.  

•  Baixo  nível:  próxima  à  arquitetura  alvo.  Mais  adequada  para  as  o`mizações  de  código  dependentes  de  máquinas.  

Page 10: !MO615B!(!Implementação!de! Linguagens!II e! !!!!!!MC900A ... · Ementa Técnicas avançadas usadas no projeto de compiladores modernos. Tais como: • análise de fluxo de dados,

Tipos  de  RI  

Representações  gráficas:  

•  Árvores  ou  DAGs  (Directed  Acyclic  Graphs)  

•  Manipulação  pode  ser  feita  através  de  gramá`cas  

•  Pode  ser  tanto  de  alto-­‐nível  como  nível  médio  

Representação  linear:  

•  Código  de  três  endereços  (three-­‐address  code)  

Page 11: !MO615B!(!Implementação!de! Linguagens!II e! !!!!!!MC900A ... · Ementa Técnicas avançadas usadas no projeto de compiladores modernos. Tais como: • análise de fluxo de dados,

Árvores  x  DAGs  

Expressão:    a := b*-c + b*-c;  

assign

+

uminus b

c

a

*

Árvore

uminus b

c

*

Page 12: !MO615B!(!Implementação!de! Linguagens!II e! !!!!!!MC900A ... · Ementa Técnicas avançadas usadas no projeto de compiladores modernos. Tais como: • análise de fluxo de dados,

Árvores  x  DAGs  

Expressão:    a := b*-c + b*-c;  

assign

+

uminus b

c

a

*

Árvore

uminus b

c

*

Sub-expressões comuns

Page 13: !MO615B!(!Implementação!de! Linguagens!II e! !!!!!!MC900A ... · Ementa Técnicas avançadas usadas no projeto de compiladores modernos. Tais como: • análise de fluxo de dados,

Árvores  x  DAGs  

Expressão:    a := b*-c + b*-c;  

DAG Árvore

assign

+

uminus b

c

a

*

uminus b

c

*

a

assign

+

uminus b

c

*

Page 14: !MO615B!(!Implementação!de! Linguagens!II e! !!!!!!MC900A ... · Ementa Técnicas avançadas usadas no projeto de compiladores modernos. Tais como: • análise de fluxo de dados,

Outro  exemplo  de  Árvore  

•  Livro  do  Appel:  Cap.  7  •  Tipos  de  operações  (nós):  const,  binop,  mem,  call,  etc  

•  Exemplo:  a[i]   MEM

+

BINOP MEM

MUL i CONST

w

e

MEM(+(MEM(e), BINOP(MUL, i, CONST w)))

a

Page 15: !MO615B!(!Implementação!de! Linguagens!II e! !!!!!!MC900A ... · Ementa Técnicas avançadas usadas no projeto de compiladores modernos. Tais como: • análise de fluxo de dados,

Representação  Linear  

•  A  RI  se  assemelha  a  um  pseudo-­‐código  para  alguma  máquina  abstrata.  

–  Java:  Bytecode  (interpretado  ou  traduzido)  

– Código  de  três  endereços  

Page 16: !MO615B!(!Implementação!de! Linguagens!II e! !!!!!!MC900A ... · Ementa Técnicas avançadas usadas no projeto de compiladores modernos. Tais como: • análise de fluxo de dados,

Código  de  três  endereços  

•  Forma  geral:  lista  de  sentenças  “x  :=  y  op  z”  •  Representação  linearizada  de  uma  árvore  sintá`ca,  ou  DAG  

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

Page 17: !MO615B!(!Implementação!de! Linguagens!II e! !!!!!!MC900A ... · Ementa Técnicas avançadas usadas no projeto de compiladores modernos. Tais como: • análise de fluxo de dados,

Código  de  três  endereços  

•  Tipos  de  sentenças:  –  atribuição:  x  :=  y  op  z    ou  x  :=  y  ou  x:=  op  y  –  saltos:    goto  L  –  desvios  condicionais:  if  x  relop  y  goto  L  –  chamadas  a  procedimentos:  param  x  and  call  p,n  –  retorno:  return  y  –  arrays:  x  :=  y[i]  ou  x[i]:=y  

Page 18: !MO615B!(!Implementação!de! Linguagens!II e! !!!!!!MC900A ... · Ementa Técnicas avançadas usadas no projeto de compiladores modernos. Tais como: • análise de fluxo de dados,

Exemplo:  Produto  Interno  {

...

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

Page 19: !MO615B!(!Implementação!de! Linguagens!II e! !!!!!!MC900A ... · Ementa Técnicas avançadas usadas no projeto de compiladores modernos. Tais como: • análise de fluxo de dados,

Estrutura  de  Dados  

•  quádruplas:  (op,  arg1,  arg2,  result)  (1)   (*,  b,  t1,  t2)  

 (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

Page 20: !MO615B!(!Implementação!de! Linguagens!II e! !!!!!!MC900A ... · Ementa Técnicas avançadas usadas no projeto de compiladores modernos. Tais como: • análise de fluxo de dados,

Estrutura  de  Dados  

•  quádruplas:  (op,  arg1,  arg2,  result)  (1)      (*,  b,  t1,  t2)  

•  triplas:  (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

Page 21: !MO615B!(!Implementação!de! Linguagens!II e! !!!!!!MC900A ... · Ementa Técnicas avançadas usadas no projeto de compiladores modernos. Tais como: • análise de fluxo de dados,

Estrutura  de  Dados  

•  quádruplas:  (op,  arg1,  arg2,  result)  (1)      (*,  b,  t1,  t2)  

•  triplas:  (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 instruções pode afetar a representação!

Page 22: !MO615B!(!Implementação!de! Linguagens!II e! !!!!!!MC900A ... · Ementa Técnicas avançadas usadas no projeto de compiladores modernos. Tais como: • análise de fluxo de dados,

Estrutura  de  Dados  

Triplas  indiretas:  (7)    (-­‐,  c,)  (8)    (*,  b,  (7))  (9)    (-­‐,c,)  

Lista de sentenças: (0) (7) (1) (8) (2) (9) •  Lista/Vetor de apontadores

determina a ordem das triplas no programa.

•  Facilita a adição/remoção de instruções no código.

Page 23: !MO615B!(!Implementação!de! Linguagens!II e! !!!!!!MC900A ... · Ementa Técnicas avançadas usadas no projeto de compiladores modernos. Tais como: • análise de fluxo de dados,

Geração  de  código  de  3  endereços  

•  A  par`r  da  árvore  sintá`ca  

•  Emissão  a  par`r  de  ações  na  gramá`ca  com  

atributos  

Page 24: !MO615B!(!Implementação!de! Linguagens!II e! !!!!!!MC900A ... · Ementa Técnicas avançadas usadas no projeto de compiladores modernos. Tais como: • análise de fluxo de dados,

Geração  de  código  de  3  endereços  

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 seção 6.4 do livro do Dragão!

Page 25: !MO615B!(!Implementação!de! Linguagens!II e! !!!!!!MC900A ... · Ementa Técnicas avançadas usadas no projeto de compiladores modernos. Tais como: • análise de fluxo de dados,

Representação  Híbrida  

•  Combina-­‐se  elementos  tanto  das  RIs  gráficas  (estrutura)  como  das  lineares.  

– Usar  RI  linear  para  blocos  de  código  sequencial  e  uma  representação  gráfica  (grafo  CFG  –  Control  Flow  Graph)  para  representar  o  fluxo  de  controle  entre  esses  blocos  

Page 26: !MO615B!(!Implementação!de! Linguagens!II e! !!!!!!MC900A ... · Ementa Técnicas avançadas usadas no projeto de compiladores modernos. Tais como: • análise de fluxo de dados,

Exemplo  –  CFG  com  código  de  três  endereços  

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

Page 27: !MO615B!(!Implementação!de! Linguagens!II e! !!!!!!MC900A ... · Ementa Técnicas avançadas usadas no projeto de compiladores modernos. Tais como: • análise de fluxo de dados,

Caso  Real  –  Gnu  Compiler  Collec`on  

•  Várias  linguagens:  pascal,  fortran,  C,  C++  •  Várias  arquiteturas  alvo:  MIPS,  SPARC,  Intel,  Motorola,  PowerPC,  etc  

•  U`liza  mais  de  uma  representação  intermediária  

–  árvore  sintá`ca:  construída  por  ações  na  gramá`ca  

–  RTL:  tradução  de  trechos  da  árvore  

Page 28: !MO615B!(!Implementação!de! Linguagens!II e! !!!!!!MC900A ... · Ementa Técnicas avançadas usadas no projeto de compiladores modernos. Tais como: • análise de fluxo de dados,

Caso  Real  –  Gnu  Compiler  Collec`on  

(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!”

Page 29: !MO615B!(!Implementação!de! Linguagens!II e! !!!!!!MC900A ... · Ementa Técnicas avançadas usadas no projeto de compiladores modernos. Tais como: • análise de fluxo de dados,

Caso  Real  –  LLVM  Compiler  

•  Desenvolvido  inicialmente  por  Chris  Lavner  e  Vikram  Adve  (orientador).  –  LLVM:  A  Compila`on  Framework  for  Lifelong  Program  Analysis  &  

Transforma`on,  CGO  2003.  

•  University  of  Illinois  Open  Source  License.  Parecida  com  a  licensa  BSD.  

•  Grande  variedade  de  front-­‐ends:  C,  C++,  Objec`ve-­‐C,  Fortran,  Ada,  Haskell,  Java  bytecode,  Python,  Ruby,  Ac`onScript,  GLSL,  Clang  e  outros.  

•  Contribuições  feitas  da  academia  e  da  indústria  (e.g.  Apple,  Google  GSoC).  

Page 30: !MO615B!(!Implementação!de! Linguagens!II e! !!!!!!MC900A ... · Ementa Técnicas avançadas usadas no projeto de compiladores modernos. Tais como: • análise de fluxo de dados,

Caso  Real  –  LLVM  Compiler  

•  LLVM:  É  na  verdade  uma  coleção  de  bibliotecas  que  podem  ser  combinadas  para  formar  compiladores.  O  principal  módulo  é  a  representação  intermediária:  LLVM  IR  

Page 31: !MO615B!(!Implementação!de! Linguagens!II e! !!!!!!MC900A ... · Ementa Técnicas avançadas usadas no projeto de compiladores modernos. Tais como: • análise de fluxo de dados,

Caso  Real  –  LLVM  Compiler  

•  LLVM  IR  –  Independente  da  linguagem  de  programação  e  da  arquitetura  alvo.  

–  Diferente  de  outros  compiladores  (p.e.  GCC),  a  representação  intermediária  do  LLVM  (LLVM  IR)  é  auto  con`da,  o  que  permite  que  ela  seja  conver`da  para  texto,  processada  de  forma  off-­‐line,  e  carregada  novamente.  

–  Bibliotecas  modulares  permitem  que  componentes  (o`mizadores)  que  operam  sobre  a  LLVM  IR  possam  ser  combinados  em  um  pipeline,  por  exemplo,  para  aplicar  múl`plos  passos  de  o`mização.  

Page 32: !MO615B!(!Implementação!de! Linguagens!II e! !!!!!!MC900A ... · Ementa Técnicas avançadas usadas no projeto de compiladores modernos. Tais como: • análise de fluxo de dados,

Caso  Real  –  LLVM  Compiler  

#include "stdio.h”!int i;!int main(void)!{! int j;! j = i + 1;! return j;!}!

“test.c”

•  Exemplo:  –  Gerar  a  LLVM  IR  para  o  programa  “test.c”  no  arquivo  test.s  –  llvm-­‐gcc  -­‐O3  -­‐S  -­‐-­‐emit-­‐llvm  test.c  

Page 33: !MO615B!(!Implementação!de! Linguagens!II e! !!!!!!MC900A ... · Ementa Técnicas avançadas usadas no projeto de compiladores modernos. Tais como: • análise de fluxo de dados,

Caso  Real  –  LLVM  Compiler  

; 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;!}!

Page 34: !MO615B!(!Implementação!de! Linguagens!II e! !!!!!!MC900A ... · Ementa Técnicas avançadas usadas no projeto de compiladores modernos. Tais como: • análise de fluxo de dados,

Leitura  Complementar  

•  Livro  do  Dragão:  Cap.  6  •  Livro  do  Appel:  Cap.  7  •  Livro  do  Muchnick:  Cap.  4