27
Disciplina: Compiladores Professor: André Moreira Jefferson Ferreira Torres Bessa P5 Ciência da Computação

Geração de código linguagem c

Embed Size (px)

Citation preview

Page 1: Geração de código   linguagem c

Disciplina: Compiladores

Professor: André Moreira

Jefferson Ferreira Torres BessaP5 – Ciência da Computação

Page 2: Geração de código   linguagem c

Sumário Geração de código

-Geração de código intermediário

*Vantagens e Desvantagens

-Otimização

*Tipos

-Geração de código objeto(Final)-Geração de código objeto–Convenção com a Linguagem C

-Referências.

2

Page 3: Geração de código   linguagem c

Geração de código A geração de código é uma das tarefas mais complexas

do compilador.

-Depende da linguagem-fonte, da máquina-alvo e seu ambiente de execução e sistema operacional.

É conveniente dividi-la em etapas menores.

-Geração de código intermediário, otimização e geração de código objeto.

3

Page 4: Geração de código   linguagem c

ETAPAS DE GERAÇÃO DE CÓDIGO

4

Page 5: Geração de código   linguagem c

Geração de código intermediário Até o momento, utilizamos a árvore sintática e a tabela

de símbolos. Entretanto, ela não corresponde em nada com o código-objeto.

Pode ser interessante gerar um código mais próximo do objeto antes de fazer a tradução final:

Código intermediário

5

Page 6: Geração de código   linguagem c

Geração de código intermediário

Esta fase utiliza a representação interna produzidapelo analisador sintático e gera como saída umasequência de código.

Esse código pode, eventualmente, ser o código objetofinal mas, na maioria das vezes, se constitui em umcódigo intermediário, pois a tradução do código fontepara objeto em mais de um passo apresenta algumasvantagens.

6

Page 7: Geração de código   linguagem c

Vantagens Possibilita a otimização de código intermediário, de

modo a se obter o código objeto oficial mais eficiente;

Resolve, gradualmente, as dificuldades de passagem decódigo objeto(alto nível para baixo nível), já que ocódigo fonte pode ser visto como um texto condensadoque explore em inúmeras instruções elementares debaixo nível;

Simplifica a implementação do compilador.

7

Page 8: Geração de código   linguagem c

Desvantagens

O compilador precisa fazer um passo a mais, dessaforma, a tradução do código fonte para o objetoleva a uma compilação mais lenta.

O intermediário não especifica detalhes damaquina alvo.

8

Page 9: Geração de código   linguagem c

Exemplo de Código Intermediário while I < 100 do I := J + I ;

9

Para o comando while apresentado anteriormente, o gerador de códigointermediário, recebendo a árvore de derivação mostrada na figura, poderia produzira seguinte sequência de instruções.

Page 10: Geração de código   linguagem c

While I < 100 do I := J+I;

L0 If I < 100 goto L

Goto L2

L1 Temp := J+I

I:=Temp

Goto L0

L2 ...

A linguagem intermediária do exemplo acima échamada "código de três endereços", pois cadainstrução tem no máximo três operandos.

10

Page 11: Geração de código   linguagem c

Código de três endereços Instrução mais básica: x = y op z

Exemplo:

2*a+(b-3) -> t1 = 2 * a

t2 = b - 3

t3 = t1 + t2

11

Page 12: Geração de código   linguagem c

Árvore de Sintaxe

12

Page 13: Geração de código   linguagem c

Otimização

Processo que visa melhorar a qualidade do código geradopelo compilador.

A Otimização de código é a estratégia de examinar o códigointermediário, produzido durante a fase de geração decódigo com objetivo de produzir, através de algumastécnicas, um código que execute com bastante eficiência

Qualidade de código pode ser medida por vários ângulos Velocidade

Tamanho do código

Memória utilizada para temporários

13

Page 14: Geração de código   linguagem c

14

Page 15: Geração de código   linguagem c

Otimização

Apesar do termo otimização, não há garantia que o códigoobtido durante o processo seja o melhor possível.

A otimização de código faz com que o compilador gastemuito tempo de compilação, e deve ser implementada se ouso do compilador realmente necessite de um códigoobjeto eficiente.

Entre as melhorias, podemos ter a escolha de modos deendereçamento para melhorar o desempenho, asubstituição de instruções lentas por outras mais rápidas ea eliminação de operações redundantes ou desnecessárias.

15

Page 16: Geração de código   linguagem c

Otimização Eliminação de subexpressões comuns.

16

Page 17: Geração de código   linguagem c

Otimização Eliminação de código redundante.

17

Page 18: Geração de código   linguagem c

Otimização Propagação de cópias.

18

Page 19: Geração de código   linguagem c

Otimização Eliminação de desvios desnecessários.

19

Page 20: Geração de código   linguagem c

Otimização Uso de propriedades algébricas.

20

Page 21: Geração de código   linguagem c

Geração de código objeto

Os principais requisitos impostos a geradores de códigoobjeto são os seguintes:

-O código gerado deve ser correto e de alta qualidade.

-O código deve fazer uso efetivo dos recursos da máquina.

-O código gerado deve executar eficientemente.

-O problema de gerar código ótimo é insolúvel(indecidível) como tantos outros.

Na prática, devemos contentar-nos com técnicasheurísticas que geram bom código (não necessariamenteótimo).

21

Page 22: Geração de código   linguagem c

Geração de código objeto O gerador de código recebe como entrada uma

representação intermediária do programa fonte e o mapeiaem um linguagem objeto.

Se a linguagem objeto for código de máquina de algumaarquitetura, devem-se selecionar os registradores oulocalizações de memória para cada das variáveis usadaspelo programa.

Depois, os códigos intermediários são traduzidos emsequencias de instruções e máquina que realizam a mesmatarefa.

Um aspecto crítico da geração de código está relacionado àcuidadosa atribuição dos registradores às variáveis doprograma.

22

Page 23: Geração de código   linguagem c

Geração de código objeto –Convenção com a Linguagem C Por exemplo, uma sequência de código possível para a

expressão dada poderia ser (em uma linguagem demontagem hipotética):

MOV R0, index ;; valor de index -> R0

MUL R0, 2 ;; dobra valor em R0

MOV R1, &a ;; endereço de a -> R1

ADD R1, R0 ;; adiciona R0 a R1

MOV *R1, 6 ;;constante 6 -> endereço em R1

23

Page 24: Geração de código   linguagem c

Geração de código objeto –Convenção com a Linguagem C Nesse código, usamos uma convenção de C para os

modos de endereçamento, assim, &a é o endereço de a(ou seja, o endereço inicial da matriz) e *R1 significa oendereçamento indireto de registro (ou seja, a últimainstrução armazena o valor 6 no endereço contido emR1).

Nesse código, também assumimos que a máquinaefetua endereçamento de bytes e que inteiros ocupamdois bytes de memória (daí o uso de 2 como fator demultiplicação na segunda instrução).

24

Page 25: Geração de código   linguagem c

Geração de código objeto –Convenção com a Linguagem C

25

Page 26: Geração de código   linguagem c

REFERÊNCIAS

AHO, Alfredo V et al. COMPILADORES:PRINCÍPIOS, TÉCNICAS E FERRAMENTAS. 2ª Ed,São Paulo: 2008.

Disponível em: http://www.ybadoo.com.br/ead/cmp/09/CMP_slides.pdf. Acesso em 30 de Nov 2012.

26

Page 27: Geração de código   linguagem c

FIM!

OBRIGADO PELA ATENÇÃO!!!

27