A compilação de um programa de alto nível para código de máquina é um processo complexo que envolve múltiplas fases inter-relacionadas. Cada fase possui responsabilidades bem definidas e depende da saída da fase anterior para executar sua tarefa corretamente. A ordem em que essas fases são executadas reflete a progressão lógica desde a compreensão do texto-fonte até a produção do executável final. Assinale a alternativa que apresenta a ordem CORRETA das fases de um compilador, da primeira à última etapa executada.
a. Análise Sintática → Análise Léxica → Análise Semântica → Geração de Código Intermediário → Alocação de Variáveis → Otimização de Código → Geração de Código Objeto.
b. Análise Léxica → Análise Sintática → Análise Semântica → Geração de Código Intermediário → Otimização de Código → Alocação de Variáveis → Geração de Código Objeto.
c. Análise Léxica → Análise Sintática → Geração de Código Intermediário → Análise Semântica → Otimização de Código → Alocação de Variáveis → Geração de Código Objeto.
d. Análise Léxica → Análise Sintática → Análise Semântica → Otimização de Código → Geração de Código Intermediário → Alocação de Variáveis → Geração de Código Objeto.
e. Análise Léxica → Análise Sintática → Análise Semântica → Geração de Código Intermediário → Alocação de Variáveis → Otimização de Código → Geração de Código Objeto.
A ordem clássica das fases de um compilador, conforme apresentada na literatura de referência (como o "Livro do Dragão Vermelho" de Aho et al.), segue uma progressão lógica desde a leitura do texto-fonte até a produção do executável:
| Ordem | Fase | Responsabilidade principal |
|---|---|---|
| 1 | Análise Léxica | Lê o código-fonte caractere a caractere e agrupa-os em tokens (unidades léxicas significativas). |
| 2 | Análise Sintática | Verifica se a sequência de tokens respeita a gramática da linguagem, construindo a árvore sintática. |
| 3 | Análise Semântica | Verifica a consistência semântica do programa (tipos de dados, escopo, compatibilidade de operações). |
| 4 | Geração de Código Intermediário | Produz uma representação intermediária do programa (ex.: código de três endereços), independente de máquina. |
| 5 | Otimização de Código | Aplica transformações para melhorar o código intermediário (reduzir tempo/espaço), ainda de forma independente de máquina. |
| 6 | Alocação de Variáveis | Define o mapeamento de variáveis para registradores e posições de memória, já considerando a arquitetura alvo. |
| 7 | Geração de Código Objeto | Produz o código de máquina (ou assembly) final, específico para a arquitetura alvo. |
Diante do exposto, a sequência correta é a apresentada em:
b. Análise Léxica → Análise Sintática → Análise Semântica → Geração de Código Intermediário → Otimização de Código → Alocação de Variáveis → Geração de Código Objeto.