Você está na página 1de 37

Sntese - Gerao de Cdigo Intermedirio

- Otimizao de Cdigo - Gerador de Cdigo

Estrutura geral de um compilador


programa-fonte analisador lxico analisador sinttico analisador semntico gerador de cdigo intermedirio

Analise

Sntese
otimizador de cdigo gerador de cdigo programa-alvo dados de entrada sada

Na sntese, encontram-se as fases de gerao de cdigo intermedirio, otimizao e gerao de cdigo.

Cdigo intermedirio

A partir da rvore de derivao pode ser gerado o cdigo objeto final


Resoluo de muita abstrao em um passo Complexidade Gerao de uma representao intermediria do cdigo
nvel de abstrao

Normalmente feito um passo intermedirio

+ Cdigo fonte

Cdigo objeto

Cdigo intermedirio

Cdigo intermedirio

O gerador de cdigo intermedirio usa as estruturas produzidas pelo analisador sinttico e verificadas pelo analisador semntico para criar uma seqncia de instrues simples, denominada cdigo intermedirio

est entre a linguagem de alto nvel e a linguagem de baixo nvel

O cdigo intermedirio o que mais se aproxima do programa executvel, porm, ele passa por mais etapas at virar o executvel final.

Cdigo intermedirio

Vantagens

Possibilita a otimizao do cdigo intermedirio

Cdigo objeto final mais eficiente Resoluo gradativa da abstrao das operaes

Simplifica a implementao do compilador

O cdigo intermedirio abstrai detalhes da mquina alvo

Possibilita a traduo do cdigo intermedirio para diversas mquinas

Cdigo intermedirio

Desvantagem

O compilador precisa realizar um passo a mais, logo a traduo do cdigo fonte para o objeto leva a uma compilao mais lenta. O intermedirio no especifica detalhes da maquina alvo, tais como

Intermedirio X objeto final

quais registradores sero usados, quais endereos de memria sero referenciados, etc.

Cdigo intermedirio

Representaes intermedirias

representao grfica: rvore sinttica ou grafo Notao ps-fixada e pr-fixada Cdigo de trs endereos

A representao intermediria pode ser construda paralelamente anlise sinttica

Traduo dirigida pela sintaxe

Compilao em um passo

Cdigo de trs endereos

O cdigo de trs endereos formado por uma seqncia 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 so nomes, constantes ou objetos de dados temporrios criados pelo compilador op est no lugar de qualquer operador aritmtico de ponto fixo ou flutuante oprel um operador relacional L um rtulo simblico

Cdigo de trs endereos

Outros enunciados que sero usados para chamadas de procedimentos


param X call P, N return Y

onde:

X um parmetro do procedimento P o nome do procedimento N nmero de parmetros do procedimento Y o valor retornado (opcional)

Exemplo

Cdigo de trs endereos para o comando de atribuio A := X + Y * Z

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

t1 e t2 so variveis temporrias criadas pelo compilador

chamado assim porque utiliza no mximo trs posies de memria, duas para os operandos e uma para o resultado.

Exerccio

Escreva o cdigo de trs endereos para o comando de atribuio a := b * (- c) + b * (- c)

Exerccio

Escreva o cdigo de trs endereos para o comando de atribuio a := b * (- c) + b * (- c)


t1 := - c t2 := b * t1 t3 := - c t4 := b * t3 t5 := t2 + t4 a := t5

Exerccio

Escreva o cdigo de trs endereos para o comando de atribuio a := b + c * b


t1 := c * b t2 := b + t1 a := t2
:= a

+ b
c

t2
*

t1
b

Cdigo intermedirio

Revendo....

Cdigo de trs endereos

Cada instruo faz referncia, no mximo, a trs variveis (endereos de memria)

A := B + C

A representao intermediria pode ser construda paralelamente anlise sinttica

Traduo dirigida pela sintaxe

O cdigo intermedirio no especifica detalhes da maquina alvo

Estrutura geral de um compilador


programa-fonte analisador lxico analisador sinttico analisador semntico gerador de cdigo intermedirio

Analise

Sntese
otimizador de cdigo
gerador de cdigo programa-alvo dados de entrada sada

Otimizador de Cdigo
Referncia: http://www-di.inf.puc-rio.br/~rangel/comp/otim.pdf

Otimizador de Cdigo

A otimizao do cdigo a inferncia de um conjunto de mudanas que melhoram a seqncia de instrues de mquina (tempo de execuo, memria ocupada, etc) sem que seja modificada a semntica. Apesar do termo otimizao, so poucas s vezes que se pode garantir que o cdigo obtido seja o melhor possvel. A otimizao de cdigo faz com que o compilador gaste muito tempo de compilao Deve ser implementada se o uso do compilador realmente necessite de um cdigo objeto (cdigo de mquina) eficiente.

Otimizador de Cdigo

O difcil na otimizao no 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 rpido e menor) se este comando for retirado. Mas para que o funcionamento do programa no seja alterado deve-se verificar algumas propriedades, por ex.:

o comando intil, porque nenhum dos comandos executados posteriormente, usa o valor da varivel x o comando x=a+b; nunca executado. Por exemplo, est em seguida a um if cuja condio nunca satisfeita:

if(0) x=a+b;

Otimizador de Cdigo

Oportunidades de otimizao

Suponha que a mesma expresso ocorre mais de uma vez em um trecho de programa. Se as variveis que ocorrem na expresso no tem seus valores alterados entre as duas ocorrncias, possvel calcular seu valor apenas uma vez. Exemplo: x=a+b; ... y=a+b; ... Se os valores de a e de b no so alterados, possvel guardar o valor da expresso a+b em uma temporria (t1) e us-lo posteriormente. t1=a+b; x=t1; ... y=t1;

Otimizador de Cdigo

Otimizador de Cdigo

Otimizador de Cdigo

Otimizador de Cdigo

Otimizador de Cdigo

Otimizador de Cdigo
Outro exemplo de otimizao a retirada de comandos de lao de repetio (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 varivel a usada aps o loop,em vez de seu valor original, seu valor ser, incorretamente, o resultado dado pela atribuio.

Otimizador de Cdigo

Um outro problema a quantidade de informao que se deseja manipular:

examinar otimizaes locais (em trechos pequenos de programas, por exemplo trechos sem desvios, ou seja, trechos em linha reta), otimizaes em um nvel intermedirio (as otimizaes so consideradas apenas em funes, mdulos, ou classes, dependendo da linguagem) e otimizaes globais (que consideram as inter-relaes de todas as partes de um programa).

A maioria dos compiladores oferece algumas otimizaes do primeiro

Estrutura geral de um compilador


programa-fonte analisador lxico analisador sinttico analisador semntico gerador de cdigo intermedirio

Analise

Sntese
otimizador de cdigo gerador de cdigo
programa-alvo dados de entrada sada

Gerao de Cdigo Objeto


Referncias: http://www-di.inf.puc-rio.br/~rangel/comp/gercod.pdf

Gerao de Cdigo Objeto

Enquanto a fase de anlise essencialmente dependente da linguagem de programao, a fase de gerao de cdigo dependente principalmente da mquina alvo Sua principal funo gerar o cdigo equivalente ao programa fonte para uma mquina real A fase de traduo converte o cdigo fonte para um cdigo objeto, que pode ser:

um ASSEMBLY de uma determinada mquina um pseudo-cdigo de uma mquina hipottica


interpretado posteriormente, pode ser executado em qualquer mquina

Gerao de Cdigo Objeto

Gerao de Cdigo Objeto

Os principais requisitos impostos a geradores de cdigo objeto so:


O cdigo gerado deve ser correto e de alta qualidade O cdigo gerado deve fazer uso efetivo dos recursos da mquina; e O cdigo gerado deve executar eficientemente.

O problema de gerar cdigo timo insolvel (indecidvel) como tantos outros. Na prtica, devemos usar heursticas que geram um bom cdigo.

Gerao de Cdigo Objeto

A ltima etapa do compilador propriamente dito a gerao do cdigo em linguagem simblica Uma vez que esse cdigo seja gerado, outro programa o montador ser responsvel pela traduo para o cdigo em formato de linguagem de mquina.

Gerao de Cdigo Objeto

A abordagem mais simples da etapa de gerao de cdigo objeto :

para cada instruo (do cdigo intermedirio) ter um gabarito com a correspondente seqncia de instrues em linguagem simblica do processador-alvo Por exemplo:

le := ld1 + ld2 A seqncia de instrues em linguagem simblica que corresponde a essa instruo depende da arquitetura do processador para o qual o programa gerado.

Gerao de Cdigo Objeto

Diferentes processadores podem ter distintos formatos de instrues Classicao pelo nmero de endereos na instruo:

3 : dois operandos e o resultado 2 : dois operandos (resultado sobrescreve primeiro operando) 1 : s segundo operando, primeiro operando implcito (registrador acumulador), resultado sobrescreve primeiro operando 0 operandos e resultado numa pilha, sem endereo explcitos

Gerao de Cdigo Objeto

Produo do Cdigo Executvel

O resultado da compilao um arquivo em linguagem simblica Montagem

Processo em que o programa em linguagem simblica transformado em formato binrio, em cdigo de mquina. O programa responsvel por essa transformao o montador

Montadores

Traduzem cdigo em linguagem simblica para linguagem de mquina

Exerccio

Sobre o processo de compilao, assinale V para verdadeiro e F para falso.

O resultado da compilao um arquivo em linguagem simblica A ltima etapa do compilador propriamente dito a gerao do cdigo em linguagem executvel A fase de anlise essencialmente dependente da mquina alvo A fase de gerao de cdigo objeto dependente principalmente da linguagem de programao A fase de traduo converte o cdigo fonte para um cdigo objeto, que pode ser um ASSEMBLY de uma determinada mquina