Otimizações Aplicadas
Visão Geral
No desenvolvimento do Mini C Compiler to Calango, optou-se por não implementar uma fase de otimização sobre código intermediário, como TAC — Three-Address Code — ou SSA — Static Single Assignment.
Em vez disso, foram aplicadas otimizações estruturais de alto nível, atuando diretamente sobre a Tabela de Símbolos, a Árvore Sintática Abstrata — AST — e o processo de geração do código final em Calango.
Com as atualizações mais recentes, o compilador passou a contar também com uma etapa explícita de otimização sobre a AST antes da geração do código Calango. Essa etapa reduz expressões constantes, simplifica operações redundantes e remove declarações ou atribuições que não impactam o resultado final do programa.
Otimizações na Tabela de Símbolos
A Tabela de Símbolos foi projetada para manter uma estrutura simples e adequada ao escopo esperado da linguagem Mini C.
Tabela 01: Otimizações aplicadas na Tabela de Símbolos.
| Otimização | Impacto |
|---|---|
| Busca com escopo progressivo — interno → externo | Permite resolver corretamente o sombreamento de variáveis sem aumentar desnecessariamente a complexidade da resolução de escopo. |
Remoção imediata ao sair do escopo (sairEscopo) |
Remove da tabela os símbolos pertencentes ao bloco encerrado, reduzindo o uso de memória durante a compilação. |
Campo usado para rastreamento de variáveis |
Permite identificar quais símbolos foram efetivamente utilizados, servindo como base para remoção de variáveis mortas. |
Remoção de variáveis mortas (removerVariaveisMortas) |
Remove variáveis declaradas que não são utilizadas, evitando declarações desnecessárias no código Calango gerado. |
| Cópia segura de strings | Evita problemas de corrupção de memória ao lidar com nomes de identificadores. |
| Implementação via lista encadeada | Mantém a estrutura simples e suficiente para o tamanho esperado dos programas Mini C. |
Autor(es): João Pedro, Pedro Silva.
Otimizações na AST
A AST representa a estrutura sintática do programa e é utilizada nas etapas finais do compilador. As otimizações nessa estrutura reduzem ruídos antes da geração do código Calango.
Tabela 02: Otimizações aplicadas na AST.
| Otimização | Impacto | ||||
|---|---|---|---|---|---|
Lista encadeada direta via prox |
Reduz a necessidade de nós intermediários de lista e simplifica a travessia sequencial da árvore. | ||||
| Array fixo de filhos | Mantém os filhos de cada nó em uma estrutura simples e previsível. | ||||
Uso de calloc na criação de nós |
Inicializa os campos com zero, reduzindo riscos de ponteiros inválidos ou contadores não inicializados. | ||||
Liberação recursiva com ast_libera |
Libera filhos e nós encadeados, reduzindo risco de vazamento de memória. | ||||
Otimização recursiva com otimizarAST |
Percorre a árvore antes da geração de código, aplicando otimizações diretamente nos nós da AST. | ||||
| Constant Folding | Resolve expressões constantes em tempo de compilação. Exemplo: (2 + 3) * 4 passa a ser 20. |
||||
| Simplificação algébrica | Remove operações redundantes, como x + 0, x - 0, x * 1, x / 1 e x * 0. |
||||
| Simplificação lógica | Reduz expressões booleanas redundantes, como true && x, false | | xex | | false. |
||||
| Remoção de declarações e atribuições mortas | Remove nós que não influenciam o resultado final do programa. |
Autor(es): João Pedro, Pedro Silva.
Otimizações na Geração de Código
O gerador recebe a AST validada e otimizada, convertendo-a para código Calango.
Tabela 03: Otimizações aplicadas no pipeline de geração Calango.
| Otimização | Impacto |
|---|---|
Geração a partir de AST otimizada (gerarASTOtimizada) |
Garante que o código Calango seja emitido após a redução e limpeza da AST. |
Integração com o parser.y do gerador |
O fluxo principal passa a chamar gerarASTOtimizada, evitando que a otimização fique isolada ou sem efeito prático. |
| Parentesamento explícito em expressões | Preserva a precedência das operações no código Calango gerado. |
Escolha entre escreva e escreval |
Mantém a equivalência da saída de acordo com o uso de quebra de linha. |
Conversão de for para enquanto |
Traduz estruturas for para uma forma compatível com o Calango. |
| Bloqueio da geração em caso de erro semântico | Evita a emissão de código inválido quando há erros detectados anteriormente. |
| Indentação padronizada | Mantém a legibilidade e a estrutura esperada no código gerado. |
Autor(es): João Pedro, Pedro Silva.
Histórico de Versões
| Versão | Descrição | Data | Responsável |
|---|---|---|---|
0.1 |
Criação da página para detalhamento das otimizações estruturais do compilador. | 06/06/2026 | Luiz Faria, João Pedro |
0.2 |
Melhoria da etapa de otimização sobre a AST, incluindo constant folding, simplificação algébrica, simplificação lógica, remoção de variáveis mortas e integração dos testes de otimização ao fluxo do repositório. | 19/06/2026 | Pedro Silva |