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:

  1. 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.
  2. 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
  • 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

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


  Esta página é somente um esboço. Ampliando-a você ajudará a melhorar a Wikiversidade.