• Nenhum resultado encontrado

Rayol de Mendonça Neto

N/A
N/A
Protected

Academic year: 2019

Share "Rayol de Mendonça Neto"

Copied!
33
0
0

Texto

(1)

Compiladores

Síntese

(2)

Analise

Síntese

Estrutura geral de um compilador

programa-fonte

analisador léxico

analisador sintático

analisador semântico

gerador de código intermediário

otimizador de código

gerador de código

programa-alvo

dados de

entrada saída

(3)

Código intermediário

A partir da árvore de derivação pode ser gerado o código objeto final

Resolução de muita abstração em um passo Complexidade

Normalmente é feito um passo intermediário

Geração de uma representação intermediária do código

Código fonte Código objeto

nível de abstração

+

(4)

Código intermediário

O gerador de código intermediário usa as estruturas produzidas pelo analisador sintático e verificadas pelo analisador semântico para criar uma sequência de instruções simples, denominada código intermediário

está entre a linguagem de alto nível e a linguagem de baixo nível

O código intermediário é o que mais se aproxima do programa

(5)

Código intermediário

Vantagens

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

• Código objeto final mais eficiente

Simplifica a implementação do compilador

• Resolução gradativa da abstração das operações

– O código intermediário abstrai detalhes da máquina alvo

(6)

Código intermediário

Desvantagem

O compilador precisa realizar um passo a mais,

logo a tradução do código fonte para o objeto leva

a uma compilação mais lenta.

Intermediário X objeto final

O intermediário não especifica detalhes da

maquina alvo, tais como

quais registradores serão usados,

(7)

Código intermediário

Representações intermediárias

representação gráfica: árvore sintática ou grafo

Notação pós-fixada e pré-fixada

Código de três endereços

A representação intermediária pode ser

construída paralelamente à análise sintática

Tradução dirigida pela sintaxe

(8)

Código de três endereços

O código de três endereços é formado por uma seqüência de comandos com o seguinte formato geral:

A := B op C A := op B A := B goto L

if A oprel B goto L onde:

• A, B e C são nomes, constantes ou objetos de dados temporários criados pelo compilador

• op está no lugar de qualquer operador aritmético de ponto fixo ou flutuante

• oprel é um operador relacional

(9)

Código de três endereços

Outros enunciados que serão usados para chamadas de procedimentos

param X call P, N return Y

onde:

• X é um parâmetro do procedimento

• P é o nome do procedimento

• N é número de parâmetros do procedimento

(10)

Exemplo

Código de três endereços para o comando de atribuição

A := X + Y * Z

t1 := Y * Z t2 := X + t1 A := t2

É chamado assim porque utiliza no máximo três posições de memória, duas para os operandos e uma para o resultado.

(11)

Exercício

(12)

Exercício

Escreva o código de três endereços para o comando de atribuição a := b + c * b

(13)

Exercício

Escreva o código de três endereços para o comando de atribuição a := b + c * b

(14)

Exercício

Escreva o código de três endereços para o comando de atribuição a := b + c * b

(15)

Exercício

(16)

Exercício

Escreva o código de três endereços para o comando de atribuição a := b * (- c) + b * (- c)

(17)

Exercício

Escreva o código de três endereços para o comando de atribuição a := b * (- c) + b * (- c)

(18)

Exercício

Escreva o código de três endereços para o comando de atribuição a := b * (- c) + b * (- c)

(19)

Exercício

Escreva o código de três endereços para o comando de atribuição a := b * (- c) + b * (- c)

(20)

Exercício

Escreva o código de três endereços para o comando de atribuição a := b * (- c) + b * (- c)

(21)

Exercício

Escreva o código de três endereços para o comando de atribuição a := b * (- c) + b * (- c)

(22)

Código intermediário

Revendo....

Código de três endereços

• Cada instrução faz referência, no máximo, a três variáveis (endereços de memória)

– A := B + C

A representação intermediária pode ser construída paralelamente à análise sintática

• Tradução dirigida pela sintaxe

(23)

Analise

Síntese

Estrutura geral de um compilador

programa-fonte

analisador léxico

analisador sintático

analisador semântico

gerador de código intermediário

otimizador de código

gerador de código

programa-alvo

dados de

(24)

Otimizador de Código

A otimização do código é a inferência de um conjunto de mudanças que melhoram a seqüência de instruções de máquina (tempo de execução, memória ocupada, etc) sem que seja modificada a semântica.

Apesar do termo otimização, são poucas às vezes que se pode garantir que o código obtido seja o melhor possível.

A otimização de código faz com que o compilador gaste muito tempo de compilação

Deve ser implementada se o uso do compilador

(25)

Otimizador de Código

O difícil na otimização é não modificar em nenhum caso o

funcionamento do programa.

Por exemplo, considere um trecho de programa em que

aparece um comando x=a+b; Este programa pode ser

melhorado (torna-se mais rápido e menor) se este comando

for retirado.

Mas para que o funcionamento do programa não seja alterado

deve-se verificar algumas propriedades, por ex.:

o comando é inútil, porque nenhum dos comandos executados posteriormente, usa o valor da variável x

o comando x=a+b; nunca é executado. Por exemplo, está em seguida a um if cuja condição nunca é satisfeita:

(26)

Otimizador de Código

Oportunidades de otimização

Suponha que a mesma expressão ocorre mais de uma vez em um trecho de programa. Se as variáveis que ocorrem na expressão não tem seus valores alterados entre as duas ocorrências, é possível calcular seu valor apenas uma vez. Exemplo:

x=a+b; ...

y=a+b; ...

Se os valores de a e de b não são alterados, é possível guardar o valor da expressão a+b em uma temporária (t1) e usá-lo posteriormente.

(27)
(28)
(29)
(30)
(31)
(32)

Otimizador de Código

Outro exemplo de otimização é a retirada de comandos de laço de

repetição (um

loop

). Por exemplo:

for (i=0; i<N; i++) { a=j+5;

f(a*i); }

poderia ser melhorado retirando-se o comando a=j+5; do for.

a=j+5;

for (i=0; i<N; i++) f(a*i);

Por outro lado, se N=0, o programa foi “piorado”, porque o comando

a=j+5; que era executado 0 vezes, passou a ser executado 1 vez.

Pode haver um problema maior: se a variável a é usada após o

(33)

Otimizador de Código

Um outro problema é a quantidade de informação que se

deseja manipular:

examinar otimizações locais (em trechos pequenos de programas, por exemplo trechos sem desvios, ou seja, trechos em linha reta),

otimizações em um nível intermediário (as otimizações são consideradas apenas em funções, módulos, ou classes, dependendo da linguagem) e

otimizações globais (que consideram as inter-relações de todas as partes de um programa).

Referências

Documentos relacionados

A assistência da equipe de enfermagem para a pessoa portadora de Diabetes Mellitus deve ser desenvolvida para um processo de educação em saúde que contribua para que a

Uma sociedade capaz de suprir as necessidades especiais de uma pessoa com esse perfil deve basear-se no conhecimento dos diversos fatores que envolvem esse indivíduo,

Numa polinização de devires, houve um devir-clandestino da pesquisadora, um devir do objeto de pesquisa, um devir dessa própria escrita viii (ou seria um bloco de

Na hipótese da não contratação de Microempresa ou Empresa de Pequeno Porte nos termos previstos neste item, o objeto deste pregão poderá ser adjudicado à

Os métodos classificadores Support Vector Machine (SVM) e Análise de Componentes Principais (ACP), foram avaliados mediante análise visual, destacando as

1 — O provimento dos cargos de comandante regional, metropolitano, distrital de polícia e da UEP, é feito em co- missão de serviço por um período de três anos, renovável,

Voltado para alunos de escolas de língua japonesa com excelente desempenho e que apresentem bom padrão comportamental e aptidão para contribuir futuramente com o desenvolvimento

ACCF/AHA/ASE/ASNC/HFSA/HRS/SCAI/SCCT/SCMR/STS 2013 multimodality appropriate use criteria for the detection and risk assessment of stable ischemic heart disease: a report of