A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

Geração de Código Fase final do compilador

Apresentações semelhantes


Apresentação em tema: "Geração de Código Fase final do compilador"— Transcrição da apresentação:

1 Geração de Código Fase final do compilador
Transforma o código da representação intermediária no código final Independente de otimizações Código deve estar correto e ser de alta qualidade, fazendo uso eficiente dos recursos da máquina-destino.

2 Geração de Código otimizador de código gerador de código front-end
tabela de símbolos

3 Geração de código geração de código ótimo é um problema indecidível.
Usa-se hurísticas para gerar código bom, mas não ótimo. Qualidade do gerador de código afeta significativamente a performance de um programa.

4 Geração de código – aspectos relevantes
entrada para o gerador de código – sem erros, na notação intermediária Programas gerados: código objeto relocável/não relocável, assembler, C. Gerenciamento de memória Seleção de instruções – uniformidade de instruções, completude, velocidade, tamanho

5 Seleção de instruções - exemplo
para este tipo de instrução: x := y + z usar este template: MOV y, R0 ADD z, R0 MOV R0,x

6 Seleção de instruções – exemplo (cont.)
compilar: a := b + c d := a + e MOV b, R0 ADD c, R0 MOV R0,a MOV a,R0 ADD e,R0 MOV R0,d

7 Geração de código – aspectos relevantes (cont.)
Alocação de registradores – problema NP-completo. Escolha da ordem de avaliação – problema NP-completo Técnicas de geração de código.

8 Conjunto de instruções da máquina-destino
n registradores R0, R1, …, Rn-1 instruções do tipo op source, destination por exemplo MOV, ADD, SUB modos de endereçamento: absoluto, registrador, indexado, indeireto por registrador, indireto indexado

9 Modos de endereçamento
Forma Endereço Custo absoluto M 1 registrador R indexado c(R) c + contents(R) registrador indexado *R contents(R) indireto indexado *c(R) contents(c + contents(R)) literal #c c

10 Modos de endereçamento - exemplos
MOV R0, M MOV 4(R0),M contents(4 + contents(R0)) MOV *4(R0),M contents(contents(4 + contents(R0))) MOV #1,R0 SUB 4(R0), *12(R1) contents(contents(12 + contents(R1))) – contents(contents(4 + R0))

11 Custo de instruções 1 + custo do modo de endereçamento do operando de origem + custo do modo de endereçamento do operando de destino Comprimento da instrução.

12 Custo de instruções - exemplo
a := b + c MOV b,R0 ADD c,R0 MOV R0,a MOV b,a ADD c,a se R0, R1 e R2 contém o endereço de a, b e c: MOV *R1, *R0 ADD *R2, *R0

13 Gerenciamento do ambiente de tempo de execução
Registro de ativação de p (88 bytes) Registro de ativação de c (64 bytes) /* código de c */ action1 call p action2 halt /* código de p */ action3 return 0: 8: 56: 60: return address arr i j 0: 4: 84: return address buf n

14 Código para chamada de função – alocação estática
chamada de procedimento: 300: MOV #here+20, callee.static_area 315: GOTO callee.code_area 320: … retorno de procedimento: GOTO *callee.static_area

15 alocação estática - exemplo
100: ACTION código de c 120: MOV #140, guarda end. de retorno 132: GOTO chama p 140: ACTION2 140: HALT … 200: ACTION código de p 220: GOTO * retorna para quem chamou p … 300: … activation record for c … 364: … activation record for p

16 Código para chamada de função – alocação em pilha
procedimento principal: MOV #stackstart, SP código do primeiro procedimento HALT chamada de procedimento: ADD #caller.recordsize, SP MOV #here+16, *SP GOTO callee.code_area retorno de procedimento (callee): GOTO *0(SP) retorno de procedimento(caller) SUB #caller.recordsize,SP

17 Grafo de Fluxo um grafo representando comandos de três endereços é chamado de grafo de fluxo (flow graph) é usado para entender algorítmos de geração de código, mesmo que não seja efetivamente construido. Nós representam computações, e arestas representam o fluxo de controle.

18 Blocos Básicos Sequência de comandos consecutivos em que o fluxo de controle entra no início e sai no final, sem possibilidade de desvio exceto no final. x := y + z define x e usa (ou referencia) y e z um nome em um bloco básico está vivo em um determinado ponto, se ele é usado depois daquele ponto do programa, possivelmente em outro bloco básico.

19 Blocos Básicos - exemplo
begin prod := 0; i := 1; do begin prod := prod + a[i] * b[i]; I := i + 1; end while i <= 20 end

20 Blocos Básicos - exemplo
(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)

21 Transformações em blocos básicos
transformações têm que preservar a semântica do bloco básico: os blocos antes e depois da transformação tem que ser equivalentes, i.e. computar o mesmo conjunto de expressões para os nomes vivos na saída do bloco. Transformações locais x transformações globais

22 Transformações locais
transformações que preservam a estrutura: eliminação de subexpressão comum eliminação de código morto renomeação de variáveis temporárias troca de dois comandos adjacentes independentes transformações algébricas x := x + 0 x := x * 1 de x := y ** 2 para x := y * y

23 Eliminação de subexpressão comum
a := b + c b := a – d c := b + c d := a – d a := b + c b := a – d c := b + c d := b

24 Eliminação de código morto
suponha que a variável x está morta no ponto em que ocorre a atribuição x := y + z Este comando pode ser removido sem mudar o resultado do bloco básico.

25 Renomeação de variáveis
se temos o comando t := b + c onde t é uma variável temporária, podemos substitui-lo por u := b + c onde u é uma nova variável temporária, e substituir todas as referências a t por referências a u.

26 Troca de comandos t1 := b + c t2 := x + y t2 := x + y t1 := b + c

27 Grafo de Fluxo prod := 0 i := 1 B1
t1 := 4 * i t2 := a [t1] t3 := 4 * i t4 := b [t3] t5 := t2 * t4 t6 := prod + t5 prod := t6 t7 := i + 1 i := t7 if i <= 20 goto B2 B2

28 Informações sobre próximo uso
Coleta informações para cada variável em um bloco básico: se ela está viva ao final do bloco onde ela é usada (onde é seu próximo uso) dentro do bloco. Permite reuso de variáveis temporárias, e facilita geração de código.


Carregar ppt "Geração de Código Fase final do compilador"

Apresentações semelhantes


Anúncios Google