O que você vai aprender
Explicar o papel de um compilador como tradutor que preserva o significado entre duas linguagens.
Distinguir compilação de interpretação e reconhecer as abordagens híbridas (bytecode, JIT).
Identificar, em alto nível, as fases de análise (front-end) e de síntese (back-end).
Classificar mensagens de erro em léxicas, sintáticas e semânticas.
Por que estudar compiladores?
Todo programa que você escreve passa por um compilador ou interpretador antes de rodar. Entender essa máquina invisível muda a forma como você programa, depura e raciocina sobre desempenho.
Compiladores reúnem três grandes áreas da computação: teoria das linguagens formais, estruturas de dados e arquitetura de máquinas. É um dos cursos em que a teoria vira, literalmente, um programa que funciona.
O que veremos nesta aula
Esta aula abre o curso com o panorama geral. Vamos percorrer:
- A definição precisa de compilador e o que significa preservar o significado.
- O contraste com interpretadores e os modelos híbridos do mundo real.
- A sequência de fases de análise e síntese.
- As estruturas de apoio que atravessam todas as fases.
O que é um compilador?
A linguagem-fonte é aquela em que o humano escreve (C, Java, Rust). A linguagem-alvo é aquela que a máquina ou uma máquina virtual executa (código de máquina, assembly, bytecode).
O ponto central da definição é "equivalente": a saída deve fazer exatamente o que a entrada descreve.
Tradutor, e não executor
Um compilador não roda o seu programa. Ele apenas o traduz. Quem executa é o processador (no caso de código nativo) ou uma máquina virtual (no caso de bytecode).
Isso tem uma consequência prática: erros descobertos pelo compilador aparecem antes de o programa rodar. Já erros que dependem de dados de entrada (uma divisão por zero, por exemplo) só aparecem em tempo de execução.
Entrada e saída de um compilador
Considere a linha de código-fonte abaixo e uma tradução possível para uma linguagem de baixo nível:
Observe que a multiplicação foi calculada antes da soma: o compilador respeitou a precedência dos operadores. Esse é o tipo de decisão que veremos formalizada nas próximas semanas.
Passo a passo: do fonte ao executável
O que é um interpretador?
Enquanto o compilador traduz tudo de uma vez e entrega um artefato, o interpretador é o próprio executor: ele percorre o código e realiza as ações descritas na hora.
Como o interpretador trabalha
O interpretador também precisa entender o programa (faz análise léxica e sintática), mas em vez de gerar código de máquina, ele percorre a estrutura interna e executa cada operação.
Por isso ele costuma ser mais lento: a tradução acontece repetidas vezes, durante a execução. Em compensação, ele oferece flexibilidade — é mais fácil testar trechos isolados e inspecionar o estado em tempo real.
Tradutor de livro × intérprete simultâneo
Compilador × interpretador
| Compilador | Interpretador | |
|---|---|---|
| Quando traduz | Antes de executar (uma vez) | Durante a execução (comando a comando) |
| Saída | Programa-alvo (artefato) | Resultado da execução |
| Velocidade de execução | Alta (código nativo) | Menor (overhead de tradução) |
| Diagnóstico | Em lote, antes de rodar | No ponto exato em que ocorre |
| Exemplos | C, C++, Rust, Go | Python (CPython), JavaScript |
As fases de um compilador
O caminho completo, que estudaremos semana a semana, é uma esteira de transformações:
tokens→ Sintática
árvore→ Semântica
significado→ Geração de RI→ Otimização→ Geração de código
As três primeiras formam o front-end (análise); as três últimas, o back-end (síntese).
Análise × síntese
A grande divisão de um compilador é entre análise e síntese.
- Análise (front-end): entende o programa — decompõe o texto, verifica sua correção e cria uma representação interna.
- Síntese (back-end): constrói o programa-alvo a partir dessa representação interna.
Verifique você mesmo: é qual fase?
Descobrir que o programa usa uma variável nunca declarada é tarefa de qual fase?
Classificando erros reais
As mensagens de erro de um compilador real revelam em que fase o problema foi detectado:
| Mensagem | Fase |
|---|---|
| "caractere inesperado '@'" | Léxica |
| "')' esperado antes de ';'" | Sintática |
| "não é possível somar inteiro e string" | Semântica |
| "variável 'x' não declarada" | Semântica |
Confusões frequentes
Outra confusão comum: achar que linguagem é compilada ou interpretada "por natureza". Na prática, a mesma linguagem pode ter implementações dos dois tipos.
Lendo o relatório do compilador
Trate os avisos (warnings) com seriedade. Muitos deles apontam bugs reais que ainda não causaram falha.
Reflita: por que duas etapas?
Por que separar o compilador em análise e síntese, em vez de traduzir diretamente?
Termos-chave da aula
Onde isto se encaixa no curso
Esta aula é o mapa. Cada fase que apareceu aqui vira uma ou mais semanas:
- Análise léxica → aulas 3 e 4 (tokens, ER, autômatos).
- Análise sintática → aulas 5, 6 e 7 (GLC, parsing, LL(1)).
- Análise semântica → aulas 8 e 9 (atributos, tabela de símbolos, tipos).
- Síntese → aulas 10 em diante (RI, ambiente de execução, código).
Resumo visual
Conheça o laboratório do curso
Ao longo do curso usaremos simuladores reais escritos em JavaScript: um analisador léxico, uma calculadora de FIRST/FOLLOW e um mini-compilador de expressões. Eles transformam a teoria em algo que você manipula com as próprias mãos.
Nesta aula introdutória, vale apenas conhecê-los pelo nome. A partir da aula 3, cada simulador entra em ação no momento certo do conteúdo.
Atividade em grupo · Compilador na vida real
Em trios, investiguem um compilador/ferramenta real e apresentem em 5 minutos.
Roteiro
- Escolham uma ferramenta: GCC, Clang/LLVM, javac, TypeScript (tsc), Babel ou Roslyn.
- Descubram: que linguagem-fonte e alvo ela usa? É compilador, interpretador ou híbrido?
- Encontrem uma mensagem de erro real que ela emite e classifiquem: é erro léxico, sintático ou semântico?
- Montem 3 slides e apresentem.
Mini-quiz · Aula 1
20 questões sobre esta aula. Escolha e veja a explicação na hora.
📌 Resumo — leve isto para a prova
- Compilador traduz fonte→alvo preservando o significado e reportando erros.
- Compilar traduz antes de executar; interpretar traduz/executa durante a execução.
- Existem modelos híbridos (bytecode + JIT), como Java e Python.
- O processo divide-se em análise (front-end) e síntese (back-end).
- Tabela de símbolos e tratamento de erros são transversais a todas as fases.