Da análise para a síntese
A representação intermediária marca a transição entre entender o programa e produzir uma forma executável.
FGA0003 - Compiladores 1 | Semana 8 | Aula teórica
Até aqui, o compilador já reconhece tokens, estrutura sintática e parte das regras semânticas.
A representação intermediária marca a transição entre entender o programa e produzir uma forma executável.
Separa front-end e back-end, reduzindo acoplamento.
Facilita adaptar o compilador a novas arquiteturas-alvo.
Permite aplicar transformações antes do código final.
Torna visível uma etapa intermediária do compilador.
Qual é a principal função da representação intermediária em um compilador?
A RI não é um único formato. Ela pode preservar estrutura, linearizar operações ou preparar execução em máquina virtual.
Na expressão x = (a + b) * (a + b), a subexpressão a + b aparece duas vezes.
Qual característica diferencia um DAG de uma AST no contexto de otimização?
Para emitir código, é útil transformar estruturas hierárquicas em uma sequência explícita de instruções.
Operadores aparecem depois dos operandos: a b +.
Instruções simples com no máximo três endereços.
Registram operador, argumento 1, argumento 2 e resultado.
Referenciam resultados por posição da instrução.
A expressão x = a * b + c exige respeitar precedência, criar temporária e emitir instruções em ordem.
x = a * b + c;
t1 = a * b x = t1 + c
Qual TAC representa corretamente x = a * b + c?
Cada instrução possui operador, dois argumentos e resultado.
O resultado é identificado pela posição da instrução.
Representação de máquina de pilha comum em compiladores educacionais.
Formato portável executado por uma máquina virtual, como JVM ou CLR.
A VM executa instruções intermediárias diretamente.
A VM compila trechos frequentes para código nativo em tempo de execução.
Em Static Single Assignment, cada variável recebe valor apenas uma vez. Novas atribuições geram novas versões.
Por que SSA utiliza diferentes versões de uma variável?
Flex retorna tokens para o parser gerado pelo Bison.
Ações semânticas criam nós da AST durante reduções.
A análise semântica anota tipos e identifica escopos.
Uma travessia da AST gera temporárias e instruções TAC.
Todo código didático gerado para a disciplina deve identificar a origem e o propósito.
Calcula expressões constantes em tempo de compilação.
Substitui usos por valores constantes conhecidos.
Remove instruções que não afetam o resultado observável.
Reutiliza o resultado de subexpressões comuns.
Considere t1 = a + b; t2 = a + b; x = t1 * t2. Qual otimização é diretamente aplicável?
O compilador valida a estrutura e os significados básicos do programa.
A AST anotada é transformada em uma forma linear e testável.
As equipes implementam emissão de instruções e validam casos simples.
A RI passa a alimentar transformações e geração de saída executável.
Uma boa representação intermediária torna explícito o que precisa ser preservado e o que pode ser transformado.
Da AST anotada ao TAC, o compilador passa a ter uma forma verificável, transformável e preparada para a geração de código final.