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.