Aula 03: Fases de um Compilador

Objetivos

  • Detalhar o pipeline de compilação.
  • Entender a entrada e saída de cada fase.

Conteúdo

Um compilador moderno é grande demais para ser entendido como um bloco monolítico. A Engenharia de Software nos ensina a dividir para conquistar. O processo é estruturado em uma “pipeline” onde a saída de uma fase é a entrada da próxima.

1. Análise Léxica (Scanner)

  • Entrada: Fluxo de caracteres (código fonte).
  • Saída: Fluxo de tokens.
  • Função: Agrupar caracteres em palavras significativas (lexemas) e classificá-las (tokens). Elimina comentários e espaços em branco.

2. Análise Sintática (Parser)

  • Entrada: Fluxo de tokens.
  • Saída: Árvore Sintática Abstrata (AST).
  • Função: Validar a estrutura gramatical. “A ordem dos tokens faz sentido?”. Responsável por criar a estrutura hierárquica do programa.

3. Análise Semântica

  • Entrada: AST.
  • Saída: AST Decorada (com tipos e referências) e Tabela de Símbolos preenchida.
  • Função: Validar o sentido. “Posso somar uma string com um int?”, “A variável ‘x’ foi declarada?”.

4. Geração de Código Intermediário (IR)

  • Entrada: AST Decorada.
  • Saída: Representação Intermediária (ex: 3AC, LLVM IR).
  • Função: Traduzir a estrutura de árvore para uma lista linear de instruções simples, agnósticas de hardware.

5. Otimização

  • Entrada: IR.
  • Saída: IR Otimizada.
  • Função: Melhorar o código (menos instruções, menos memória) sem alterar o comportamento. Ex: Remover código morto, calcular constantes prévias.

6. Geração de Código Alvo

  • Entrada: IR Otimizada.
  • Saída: Assembly ou Código de Máquina.
  • Função: Mapear as instruções virtuais para o set de instruções real da CPU, alocando registradores físicos.

Referências

  • Aho, A. V., Lam, M. S., Sethi, R., & Ullman, J. D. (2006). Compilers: Principles, Techniques, and Tools.
  • Cooper, K., & Torczon, L. (2011). Engineering a Compiler.
Back to top