# Fases de um compilador

O pipeline da compilação, o que cada fase recebe e produz, e o percurso de uma atribuição até ao código objeto.

Página: https://resumos.rgo.pt/cadeiras/c/fases-compilador/

Um compilador não traduz o programa de uma vez: organiza o trabalho em **fases**, cada uma com uma entrada e uma saída bem definidas. Esta separação é o que permite raciocinar sobre o programa a níveis diferentes, do texto à máquina. Vamos seguir a linha `x = a + b * 2` e ver quem trata de cada passo.

## O pipeline

As fases clássicas, por ordem:

1.  **Análise lexical**: agrupa caracteres em símbolos (_tokens_).
2.  **Análise sintática**: organiza os símbolos numa árvore sintática.
3.  **Análise semântica**: verifica tipos, declarações e âmbitos.
4.  **Geração de código intermédio**: traduz a árvore para uma representação simples.
5.  **Otimização**: transforma o código sem mudar o significado.
6.  **Geração de código objeto**: emite instruções da máquina alvo e gere registos.

Há ainda duas estruturas transversais: a **tabela de símbolos**, que guarda o que se sabe sobre cada nome, e o tratamento de erros, que cada fase deve reportar com posição e mensagem útil.

![Cadeia de seis fases da compilação, do léxico ao código objeto, com a tabela de símbolos ao lado.](https://resumos.rgo.pt/cadeiras/c/fases-compilador/figura-1.svg)

Lê o diagrama de cima para baixo: cada caixa recebe o artefacto da anterior e entrega o seguinte. A tabela de símbolos não está na cadeia porque todas as fases a consultam e atualizam, do léxico (que regista nomes e posições) à semântica (que regista tipos e âmbitos).

## Seguir `x = a + b * 2`

O analisador lexical lê os caracteres e devolve símbolos: `ID(x)`, `=`, `ID(a)`, `+`, `ID(b)`, `*`, `NUM(2)`. Repara que `b * 2` ainda não foi calculado: o léxico só classifica, não interpreta.

O analisador sintático consome os símbolos segundo a gramática e constrói a árvore: a raiz é a atribuição a `x`, com o filho `+` a somar `a` ao produto `b * 2`. A precedência do `*` sobre o `+` fica gravada na forma da árvore, como viste nas [gramáticas livres](https://resumos.rgo.pt/cadeiras/tc/gramaticas-livres/).

A análise semântica consulta a tabela de símbolos: `x`, `a` e `b` estão declarados? Têm tipos compatíveis com `+` e `*`? Se `b` for um vetor, aqui nasce um erro de tipo, com a linha e a coluna da ficha do símbolo.

O gerador de código intermédio traduz a árvore para instruções simples de três endereços:

```
t1 = b * 2
t2 = a + t1
x = t2
```

A mesma linha em três leituras, uma por nível do pipeline. Compara-as: cada nível esquece detalhes do anterior e explicita o que o seguinte precisa.

```
ID(x) = ID(a) + ID(b) * NUM(2)
```

```
t1 = b * 2
t2 = a + t1
x = t2
```

```
iload_1
iload_2
iconst_2
imul
iadd
istore_3
```

Com `a`, `b` e `x` nas variáveis locais 1, 2 e 3: empilha `a` e `b`, empilha 2, multiplica, soma e guarda em `x`. A altura máxima da pilha é 3.

O otimizador pode dobrar constantes ou propagar cópias. Por fim, o gerador de código objeto escolhe instruções da máquina alvo, decide que valores vivem em registos e emite o código final, por exemplo para a JVM no caso do projeto.[1](https://resumos.rgo.pt/cadeiras/c/fases-compilador/#user-content-fn-alvo)

Para ver o pipeline inteiro a mexer, este vídeo constrói um compilador pequeno do zero, uma fase de cada vez:

[Vídeo: Compilers, How They Work, And Writing Them From Scratch](https://www.youtube.com/watch?v=QdnxjYj1pS0)

A miniatura vem do YouTube. O vídeo só carrega quando clicas. [Abrir no YouTube](https://www.youtube.com/watch?v=QdnxjYj1pS0)

## Para levar para a próxima página

Cada fase fala uma linguagem diferente: caracteres, símbolos, árvores, código de três endereços, instruções. A [análise lexical](https://resumos.rgo.pt/cadeiras/c/fases-compilador/analise-lexica/) é a primeira fronteira, onde as [expressões regulares](https://resumos.rgo.pt/cadeiras/tc/linguagens-expressoes/) se transformam em reconhecedores automáticos.

## Notas de rodapé

1.  O projeto da ocorrência usa a JVM como alvo, através do Jasmin. Confirma no enunciado do ano, na página da disciplina, antes de assumires instruções ou limites. [Voltar](https://resumos.rgo.pt/cadeiras/c/fases-compilador/#user-content-fnref-alvo)
