Escolar Documentos
Profissional Documentos
Cultura Documentos
Gerao de Cdigo
A traduo do cdigo de alto nvel para o cdigo do processador est associada a
traduzir para a linguagem-alvo a representao da rvore gramatical obtida para as
diversas expresses do programa. Embora tal atividade possa ser realizada para a rvore
completa aps a concluso da anlise sinttica, em geral ela efetivada atravs das
aes semnticas associadas aplicao das regras de reconhecimento do analisador
sinttico. Este procedimento denominado traduo dirigida pela sintaxe.
Em geral, a gerao de cdigo no se d diretamente para a linguagem assembly do
processador-alvo. Por convenincia, o analisador sinttico gera cdigo para uma
mquina abstrata, com uma linguagem prxima ao assembly, porm independente de
processadores especficos. Em uma segunda etapa da gerao de cdigo, esse cdigo
intermedirio traduzido para a linguagem assembly desejada. Dessa forma, grande
parte do compilador reaproveitada para trabalhar com diferentes tipos de
processadores.
Vrias tcnicas e vrias tarefas se renem sob o nome de Otimizao. Alguns autores da
literatura consideram que, para qualquer critrio de qualidade razovel, impossvel
construir um programa otimizador, isto , um programa que recebe como entrada um
programa P e constri um programa P equivalente que o melhor possvel, segundo o
critrio considerado. O que se pode construir so programas que melhoram outros
programas, de maneira que o programa P , na maioria das vezes, melhor, segundo o
critrio especificado do que o programa P original. A razo para essa impossibilidade a
mesma que se encontra quando se estuda, por exemplo em LFA (Linguagens Formais e
Autmatos), o problema da parada: um programa (procedimento, mquina de Turing,
etc.) no pode obter informao suficiente sobre todas as possveis formas de execuo
de outro programa (procedimento, mquina de Turing, etc.).
Cdigo intermedirio
A linguagem utilizada para a gerao de um cdigo em formato intermedirio entre a
linguagem de alto nvel e a linguagem assembly deve representar, de forma independente
do processador para o qual o programa ser gerado, todas as expresses do programa
original. Duas formas usuais para esse tipo de representao so a notao posfixa e o
cdigo de trs endereos.
Na terceira forma, pode ocorrer uma simples cpia de valores de uma varivel para outra:
x := y
_t1 := c * d
a := b + _t1
As instrues de desvio podem assumir duas formas bsicas. Uma instruo de desvio
incondicional tem o formato
goto L
onde L um rtulo simblico que identifica uma linha do cdigo. A outra forma de desvio
o desvio condicional, com o formato
if x opr y goto L
onde opr um operador relacional de comparao e L o rtulo da linha que deve ser
executada se o resultado da aplicao do operador relacional for verdadeiro; caso
contrrio, a linha seguinte executada.
Por exemplo, a seguinte iterao em C
while (i++ <= k)
x[i] = 0;
x[0] = 0;
_L2: x[0]:= 0
A invocao de rotinas ocorre em duas etapas. Inicialmente, os argumentos do
procedimento so "registrados com a instruo param; aps a definio dos argumentos, a
instruo call completa a invocao da rotina. A instruo return indica o fim de execuo de
uma rotina. Opcionalmente, esta instruo pode especificar um valor de retorno, que pode ser
atribudo na linguagem intermediria a uma varivel como resultado de call.
Por exemplo, considere a chamada de uma funo f que recebe trs argumentos e
retorna um valor:
f(a, b, c);
x[i] := y
Notao posfixa
A notao tradicional para expresses aritmticas, que representa uma operao binria
na forma x+y, ou seja, com o operador entre seus dois operandos, conhecida como
notao infixa. Uma notao alternativa para esse tipo de expresso a notao posfixa,
tambm conhecida como notao polonesa, na qual o operador expresso aps seus
operandos.
O atrativo da notao posfixa que ela dispensa o uso de parnteses. Por exemplo, as
expresses
a*b+c;
a*(b+c);
(a+b)*c;
(a+b)*(c+d);
Otimizao de cdigo
A etapa final na gerao de cdigo pelo compilador a fase de otimizao. Como o
cdigo gerado atravs da traduo orientada pela sintaxe contempla expresses
_L1: (b)
esse cdigo pode ser seguramente reduzido com a aplicao da tcnica de eliminao
de desvios desnecessrios, resultando em
(a)
_L1: (b)
Outra estratgia de otimizao elimina os rtulos no referenciados por outras
instrues do programa. Assim, se o rtulo _L1 estivesse sendo referenciado
exclusivamente por essa instruo de desvio, ele poderia ser eliminado em uma prxima
aplicao das estratgias de otimizao.
As tcnicas de otimizao podem ser classificadas como independentes de mquina,
quando podem ser aplicadas antes da gerao do cdigo na linguagem assembly, ou
dependentes de mquina, quando aplicadas na gerao do cdigo assembly.
A otimizao independente de mquina tem como requisito o levantamento dos blocos
_L1: ...
a instruo contendo a atribuio de y a x nunca poderia ser executada, pois precedida
de um desvio incondicional e no o destino de nenhum desvio, pois no contm um
rtulo na linha. Assim, essa linha poderia ser eliminada e provocar posteriormente a
aplicao da estratgia de eliminao de desvios desnecessrios.
O uso de propriedades algbricas outra estratgia de otimizao usualmente aplicada.
Nesse caso, quando o compilador identifica que uma expresso aritmtica foi reduzida a
x=0 ou 0=x ou x-0 ou x*1 ou 1*x ou x/1, ento ele substitui a expresso simplesmente por
x. Outra classe de propriedades algbricas que utilizada tem por objetivo substituir
operaes de alto custo de execuo por operaes mais simples, como
2.0*x = x+x x2 = x*x x/2 = 0.5*x
Particularmente no ltimo caso, se x for uma varivel inteira a diviso por dois pode ser
substituda por um deslocamento da representao binria direita de um bit.
Genericamente, a diviso inteira por 2n equivale ao deslocamento direita de n bits na
representao binria do dividendo. Da mesma forma, a multiplicao inteira por
potncias de dois pode ser substituda por deslocamento de bits esquerda.
A utilizao de propriedades algbricas permite tambm o reuso de subexpresses j
computadas. Por exemplo, a traduo direta das expresses
a = b + c;
e = c + d + b;
...
No entanto, a anlise de fluxo de dados mostra que o valor de j no varia entre iteraes.
Assim, o compilador poderia mover as expresses que envolvem exclusivamente
constantes na iterao para fora do lao, substituindo esse cdigo por
_t1:= 10 * j
_t2 := 2 * j
_L1: if i >= _t1 goto _L2
a[i] := i + _t2
i := i + 1
goto _L1
_L2:
...
Wikiversidade Mvel
Normal
Privacidade