Introdução à Teoria dos Compiladores/Geração de Código Intermediário
Tomando um compilador como um modelo de análise-e-síntese, podemos considerar que seus módulos iniciais ("front-end modules") traduzem um programa fonte em uma representação (linguagem) intermediária, a partir da qual seus módulos finais ("back-end modules") geram o código objeto final. A geração de um código intermediário requer um passo a mais para a tradução, tornando o processo um pouco mais lento. Embora um programa fonte possa ser traduzido diretamente para a linguagem objeto, o uso de uma representação intermediária, independente de máquina, tem as seguintes vantagens:
- Reaproveitamento de código, facilitando o transporte de um compilador para diversas plataformas de hardware; somente os módulos finais precisam ser refeitos a cada transporte.
- Um otimizador de código independente de máquina pode ser usado no código intermediário.
Pode-se pensar nessa representação intermediária como um programa para uma máquina abstrata. A representação intermediária deve possuir duas propriedades importantes: ser fácil de produzir e fácil de traduzir no programa alvo. A diferença básica entre o código intermediário e o código objeto final é que não são especificados detalhes da máquina alvo, tais como quais registradores serão usados, quais endereços de memória serão referenciados, etc.
Tipos de código intermediário
[editar | editar código-fonte]- HIR – High Intermediate Representation
- Usada nos primeiros estágios do compilador
- Simplificação de construções gramaticais para somente o essencial para otimização/geração de código
- MIR – Medium Intermediate Representation
- Boa base para geração de código eficiente
- Pode expressar todas características de linguagens de programação de forma independente da linguagem
- Representação de variáveis, temporários, registradores
- LIR – Low Intermediate Representation
- Quase 1-1 para linguagem de máquina
- Dependente da arquitetura
Representação
[editar | editar código-fonte]As formas de representação mais comuns dos tipos de códigos intermediários são:
- HIR
- Árvore e grafo de sintaxe
- Notações Pós-fixada e Pré-fixada
- Representações linearizadas
- MIR
- Árvore e grafo de sintaxe
- Notações Pós-fixada e Pré-fixada:
- Representações linearizadas
- Código de três endereços:
- Quádruplas
- Triplas
- Grafos acíclicos dirigidos (DAG)
- LIR
- Instruções assembler
|