• Nenhum resultado encontrado

Compiladores. Geração de Código Intermediário

N/A
N/A
Protected

Academic year: 2021

Share "Compiladores. Geração de Código Intermediário"

Copied!
17
0
0

Texto

(1)

Compiladores

Compiladores

Geração de Código Intermediário

Geração de Código Intermediário

(2)

Geração de Código Intermediário Compiladores

Atividades do Compilador

Atividades do Compilador

Arquivo

de origem

Arquivo

de destino

Compilador

Síntese

Gramáticas

Estruturas

Internas

Análise

Geração de Código

Intermediário

Otimização

Geração de

Código Final

(3)

Introdução

Introdução

A geração de código intermediário é a transformação da árvore

de derivação em um segmento de código.

Esse código pode, eventualmente, ser o código objeto final,

mas, na maioria das vezes, constitui-se num código

intermediário.

A grande diferença entre o código intermediário e o código

objeto final é que o intermediário não especifica detalhes da

máquina alvo, tais como quais registradores serão usados, quais

endereços de memória serão referenciados, entre outros

detalhes físicos da máquina alvo.

(4)

Geração de Código Intermediário Compiladores

Vantagens e Desvantagens

Vantagens e Desvantagens

Vantagens da geração de código intermediário:

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

obter-se o código objeto final mais eficiente.

Simplifica

a

implementação

do

compilador,

resolvendo,

gradativamente, as dificuldades da passagem de código fonte para

objeto (alto nível para baixo nível), já que o código fonte pode ser

visto como um texto condensado que explode em inúmeras

instruções elementares de baixo nível.

Possibilita a tradução do código intermediário para diversas

máquinas.

Desvantagens da geração de código intermediário:

O compilador requer um passo a mais, pois a tradução direta do

código fonte para objeto leva a uma compilação mais rápida.

(5)

Linguagens Intermediárias

Linguagens Intermediárias

Os vários tipos de código intermediário fazem parte de uma das

seguintes categorias:

Representações gráficas:

Árvore e grafo de sintaxe.

Notação pós-fixada ou pré-fixada.

Código de três endereços:

(6)

Geração de Código Intermediário Compiladores

Árvore e Grafo de Sintaxe (1/4)

Árvore e Grafo de Sintaxe (1/4)

Uma árvore de sintaxe é uma forma condensada de árvore de

derivação na qual somente os operandos da linguagem

aparecem como folhas:

Os operandos constituem nós interiores da árvore.

Outra simplificação da árvore de sintaxe é que cadeias de

produções simples (por exemplo, A → B, B → C) são eliminadas.

Um grafo de sintaxe, além de incluir as simplificações da árvore

de sintaxe, faz a fatoração das subexpressões comuns,

eliminando-as.

(7)

Árvore e Grafo de Sintaxe (2/4)

Árvore e Grafo de Sintaxe (2/4)

G = ({S, A, B, C},

{a, b, c, +, *, =}, P, S)

P = { < S >

< C > = < A >

< A >

< A > + < B >

| < B >

< B >

< B > * < C >

| < C >

< C >

a

| b

| c }

< S >

< C >

=

< A >

a

< A >

+

< B >

< B >

< B >

*

< C >

< B >

*

< C >

< C >

b

c

< C >

b

c

Árvore de derivação

a = b * c + b * c

(8)

Geração de Código Intermediário Compiladores

Árvore e Grafo de Sintaxe (3/4)

Árvore e Grafo de Sintaxe (3/4)

Árvore de derivação

a = b * c + b * c

Árvore de sintaxe

a = b * c + b * c

< S >

< C >

=

< A >

a

< A >

+

< B >

< B >

< B >

*

< C >

< B >

*

< C >

< C >

b

c

< C >

b

c

b

c

b

c

*

*

+

=

a

(9)

Árvore e Grafo de Sintaxe (4/4)

Árvore e Grafo de Sintaxe (4/4)

Árvore de sintaxe

a = b * c + b * c

b

c

b

c

*

*

+

=

a

Grafo de sintaxe

a = b * c + b * c

b

c

*

+

=

a

(10)

Geração de Código Intermediário Compiladores

Notações Pós-fixada e Pré-fixada (1/4)

Notações Pós-fixada e Pré-fixada (1/4)

Se E

1

e E

2

são expressões pós-fixadas e q é um operador

binário, então, E

1

E

2

q é a representação pós-fixada para a

expressão E

1

q E

2

.

Se E

1

e E

2

são expressões pré-fixadas e

q

é um operador

binário, então, q E

1

E

2

é a representação pré-fixada para a

expressão E

1

q E

2

.

Notações pós e pré-fixadas podem ser generalizadas para

(11)

Notações Pós-fixada e Pré-fixada (2/4)

Notações Pós-fixada e Pré-fixada (2/4)

Notação

Infixada

Pós-fixada

Pré-fixada

(a + b) * c

ab+c*

*+abc

a * (b + c)

abc+*

a + b * c

abc*+

*a+bc

+a*bc

*

a

b

+

c

(a + b) * c

Pós­ordem

*

5

a

1

b

2

+

3

c

4

Pré­ordem

*

1

a

3

b

4

+

2

c

5

(12)

Geração de Código Intermediário Compiladores

Notações Pós-fixada e Pré-fixada (3/4)

Notações Pós-fixada e Pré-fixada (3/4)

Para a avaliação de expressões pós-fixadas, pode-se utilizar

uma pilha e um processo que age do seguinte modo:

Lê a expressão da esquerda para a direita, empilhando cada

operando até encontrar um operador.

Encontrando um operador n-ário, aplica o operador aos n

operandos do topo da pilha.

Processamento semelhante pode ser aplicado para a avaliação

de expressões pré-fixadas:

(13)

Notações Pós-fixada e Pré-fixada (4/4)

Notações Pós-fixada e Pré-fixada (4/4)

ab+c*

b+c*

a

+c*

b

a

c*

x

*

c

x

y

Execução de expressões pós-fixadas

*+abc

Execução de expressões pré-fixadas

c

*+ab

b

c

*+a

a

b

c

*+

x

c

*

y

(14)

Geração de Código Intermediário Compiladores

Código de Três Endereços (1/4)

Código de Três Endereços (1/4)

No código intermediário de três endereços, cada instrução faz

referência, no máximo, a três variáveis (endereços de memória).

As instruções dessa linguagem são as seguintes:

A := B op C

A := op B

A := B

goto L

if A oprel B goto L

Onde A, B e C representam endereços de variáveis.

op representa operador (binário ou unário).

oprel representa operador relacional.

(15)

Código de Três Endereços (2/4)

Código de Três Endereços (2/4)

Exemplo A := X + Y * Z

T1 := Y * Z

T2 := X + T1

A := T2

onde T1 e T2 são variáveis temporárias.

Um código de três endereços pode ser implementado através de

(16)

Geração de Código Intermediário Compiladores

Código de Três Endereços (3/4)

Código de Três Endereços (3/4)

As quádruplas são constituídas de quatro campos:

Um operador, dois operandos e um resultado.

Exemplo A := B * (-C + D)

arg1

arg2

(0)

-u

C

T1

(1)

+

T1

D

T2

(2)

*

B

T2

T3

(3)

:=

T3

A

oper

result

(17)

Código de Três Endereços (4/4)

Código de Três Endereços (4/4)

As triplas são formadas por:

Um operador e dois operandos.

Essa representação utiliza ponteiros para a própria estrutura,

evitando a nomeação explícita de temporários.

Exemplo A := B * (-C + D)

arg1

arg2

(0)

-u

C

(1)

+

(0)

D

(2)

*

B

(1)

(3)

:=

A

(2)

oper

Referências

Documentos relacionados

O modelo de trajetória é usado para extrapolar o último ponto extraído um passo adiante (por exemplo, dois ou três pixels). A tolerância é maior, para que o perfil medido seja maior

Os valores originados pelo cálculo de perdas estimadas de créditos de liquidação duvidosa de curto e longo prazo estão registrados nas variações patrimoniais diminutivas. 4

A pesquisa será realizada na turma de primeiro ano do Ensino Médio, turma 103 e primeiramente será realizada uma pesquisa teórica sobre o que é Síndrome de Down e quais

Para entender isso, temos que entender a história de cada língua e, portanto,neste artigo, nós estudaremos como o inglês se expandiu pelo mundo, observaremos quais são as variantes

Diante de tamanha problemática os Estados Unidos incorporaram a colaboração premiada em seu ordenamento jurídico, porém, optou por aprimorar o meio de obtenção de

Dessa forma, para cada comentário, uma nova seção de respostas pode ser iniciada (tudo na mesma tela). Para diferenciar as respostas dos comentários, as respostas são deslocadas um

Contudo, ainda que a disponibilidade de indicadores sociais para uso no diagnóstico da realidade social empírica ou na análise da mudança social esteja condicionada à oferta e

Posteriormente, o mesmo autor, Viveiros de Castro, pro- pôs o termo perspectiva, para estabelecer que, muito resumidamente, tudo depende da posição singular de onde o