Geração e Otimização de Código
A Geração e Otimização de Código é a última etapa na parte de compilação. É nessa etapa onde código de alto nível é transformada em uma linguagem que o computador entende.
Geração de Código
Em geral a geração de código não se dá diretamente para a linguagem Assembly do processador alvo, ela é dividida em duas partes:
1º O analisador sintático gera código para uma máquina abstrata, com uma linguagem próxima a Assembly, porem independente de processadores específicos.
2º O código intermediário é traduzido para a linguagem Assembly desejada.
Dessa forma, grande parte do compilador é reaproveitada para trabalhar com diferentes tipos de processadores.
Código Intermediário
A linguagem utilizada para a geração de um código em formato intermediário entre a linguagem de alto nível e a linguagem Assembly deve representar, de forma Independente do processador para o qual o programa será gerado, todas as expressões do programa original.
Duas formas usuais para esse tipo de representação são a notação pós fixa e o código de três endereços.
Como Faze-la?
São criadas regras baseadas na arvore de derivação sintática. Conhecida como: Geração dirigida sintaticamente.
Exemplo: Obter o resultado para 3*4+5*2:
A introdução dos valores na pilha deve ser feita através da instrução LoadCon, onde será o valor imediato das constantes da expressão. Além disso temos que executar duas multiplicações e uma soma, através dos comandos Multiply e Add respectivamente.
Entretanto, temos ainda que alterar a expressão dada para a notação posfixa, que é a que se adequa ao uso da pilha e a estrutura do analisador sintático. Assim, temos:
3*4+5*2 --> 3 4 * 5 2 * +
Código de três Endereços
O código de três endereços é composto por uma sequência de instruções envolvendo operação binaria ou unárias e uma atribuição. É dado o nome de Três Endereços, pois são usados no