geração de código linguagem c

Post on 09-Jul-2015

1.470 Views

Category:

Technology

1 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Disciplina: Compiladores

Professor: André Moreira

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

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

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

ETAPAS DE GERAÇÃO DE CÓDIGO

4

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

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

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

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

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.

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

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

Árvore de Sintaxe

12

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

14

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

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

16

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

17

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

18

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

19

Otimização Uso de propriedades algébricas.

20

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

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

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

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

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

25

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

FIM!

OBRIGADO PELA ATENÇÃO!!!

27

top related