Moacyr Francischetti Corrêa

1 Compiladores: por onde começar

Este é o material da disciplina em formato de consulta. Ele cobre o mesmo conteúdo do livro, em versão mais curta e organizada para você achar rápido o que precisa — antes de uma tutoria, durante o projeto, ou na véspera de uma avaliação.

1.1 Como este material está organizado

Cada módulo tem três níveis de profundidade, e você escolhe qual usar conforme a situação.

O livro é o texto completo, para quando você quer entender de verdade e tem tempo para isso. É onde as demonstrações aparecem por inteiro e onde a ordem dos assuntos é justificada. Leia antes do encontro do módulo, se conseguir.

O material é a versão reduzida, cobrindo os mesmos temas em cerca de metade da extensão. É o que a maioria das pessoas usa como leitura principal durante a semana.

O resumo é a versão de revisão, curta o bastante para ser lida de uma vez. Serve para reativar o que você já estudou, não para aprender pela primeira vez — se um trecho dele parecer denso demais, é sinal de que aquele tema pede uma volta ao material.

Há ainda, por módulo, três exercícios em dificuldade crescente e um banco de questões para autoavaliação. Os exercícios cobrem a teoria; o projeto cobre a prática. Fazer só um dos dois deixa metade da disciplina de fora.

1.2 O que você vai construir

A disciplina inteira gira em torno de um sistema que o seu grupo desenvolve do começo ao fim. Ele nasce lendo texto sem estrutura nenhuma e termina executando o que aquele texto descrevia.

flowchart TD
    T["Texto que você escreveu<br/>uma sequência de caracteres"]
    S["Sequência de símbolos<br/>palavras com categoria"]
    E["Estrutura em árvore<br/>o que contém o quê"]
    V["Estrutura verificada<br/>faz sentido, os nomes existem,<br/>os tipos combinam"]
    I["Representação intermediária<br/>operações elementares"]
    O["Programa objeto<br/>instruções de uma máquina"]
    R["Execução<br/>o efeito no mundo"]

    T -->|"análise léxica"| S
    S -->|"análise sintática"| E
    E -->|"análise semântica"| V
    V -->|"tradução"| I
    I -->|"geração de código"| O
    O -->|"máquina de execução"| R

    T -.- MT["cada seta é uma fase do compilador<br/>e cada fase é um modelo formal<br/>que você vai estudar e implementar"]

    style T fill:#f4ecdd
    style R fill:#e8f4ea

Cada módulo acrescenta uma camada a esse sistema, e a camada nova depende das anteriores estarem funcionando. Essa é a característica que mais afeta o seu ritmo de trabalho: não dá para deixar um módulo para depois e seguir em frente. O que ficou para trás bloqueia o que vem.

Duas consequências práticas. Primeira: use as sessões de tutoria para desbloquear, não para mostrar serviço. Chegar dizendo que travou é o uso correto delas. Segunda: mantenha o que já funciona funcionando. A cada camada nova, rode o que a camada anterior fazia e confira que continua certo — descobrir três módulos depois que algo quebrou é o cenário mais caro que existe aqui.

1.3 Por que a ordem dos assuntos é essa

Vale entender uma coisa logo no começo, porque ela explica a estrutura do curso inteiro e evita a sensação de que os temas foram enfileirados por tradição.

Cada modelo que você vai estudar existe porque o anterior não dá conta de alguma coisa — e não dá conta de um jeito que se pode demonstrar. O primeiro modelo reconhece palavras muito bem e é matematicamente incapaz de reconhecer aninhamento. Isso não é uma limitação de implementação a ser contornada com esperteza: é um teorema, e você vai demonstrá-lo. É essa impossibilidade que obriga a existência do modelo seguinte.

Por isso o curso é uma sequência de limites provados e superados. Quando um assunto novo aparecer, a pergunta útil é sempre a mesma: qual limite do assunto anterior este aqui resolve? Se você souber responder, entendeu por que ele está ali.

1.4 Sugestão de rotina

O que costuma funcionar, na experiência de quem já cursou: ler o material do módulo antes do primeiro encontro, mesmo que superficialmente, para chegar com as perguntas formadas; trabalhar no projeto entre os encontros, e não na véspera da entrega; usar o resumo e o banco de questões para revisar, não para estudar pela primeira vez.

E, quando algo não fizer sentido, tente localizar o limite. Quase toda confusão nesta disciplina vem de tentar entender um mecanismo sem ter entendido qual problema ele resolve.