Arquitetura de Compiladores

Fundamentos

O Tradutor Universal

Um compilador não é mágica; é um programa que traduz código escrito em uma linguagem de alto nível (legível por humanos) para uma linguagem de baixo nível (linguagem de máquina ou assembly) que o processador pode executar.

Código Fonte

int a = 10 + 5;

Binário

0101 1100 0011

Compiladores vs. Interpretadores

  • 🚀
    Compilador (AOT): Traduz tudo de uma vez antes da execução. Ex: C, C++, Rust. Mais rápido na execução.
  • 🐌
    Interpretador: Traduz linha por linha durante a execução. Ex: Python, Ruby. Início rápido, execução mais lenta.
  • JIT (Just-In-Time): Híbrido. Compila partes "quentes" do código durante a execução. Ex: Java (JVM), JavaScript (V8).

O Pipeline de Compilação

Navegue pelas fases abaixo para ver como o código x = a + b * 2 é transformado. Este processo é dividido em Front-end (análise) e Back-end (síntese).

Análise Léxica

O "Scanner". Lê o fluxo de caracteres e agrupa em tokens significativos, removendo espaços e comentários. Se encontrar caracteres ilegais, lança um erro.

Input Atual
x = a + b * 2

Trade-offs de Engenharia

Comparação entre tempo de compilação (espera do dev) e tempo de execução (espera do usuário) para diferentes paradigmas.

Complexidade de Análise (Parsing)

Como o computador entende a estrutura gramatical.

Top-Down (Descendente)

LL(1)

Constrói a árvore da raiz para as folhas. Intuitivo, fácil de escrever à mão (Recursive Descent).

Bottom-Up (Ascendente)

LR(1) / LALR

Constrói das folhas para a raiz (reduzindo tokens). Mais poderoso, usado por ferramentas como Yacc/Bison.

Tabela de Símbolos

Estrutura de dados crítica usada em todas as fases para armazenar nomes de variáveis, funções e seus tipos.
id: a
type: int
scope: global

A Arte da Otimização

O compilador reescreve seu código para torná-lo mais eficiente sem alterar o resultado. Experimente os filtros abaixo.

Entrada (Código Sujo)
// Loop Ineficiente
x = 10;
y = 20 + 30; // Constant Folding
for (i=0; i<n; i++) {
z = x * 2; // Invariante de Loop
arr[i] = z + i;
}
Saída (Otimizado)
Low IR
x = 10;
y = 50; // Calculado
temp_z = 20; // Movido para fora
for (i=0; i<n; i++) {
arr[i] = temp_z + i;
}