O Que É um Compilador? De Código-Fonte a Código de Máquina
Um compilador é um programa que traduz o código-fonte que você escreve em uma forma de nível mais baixo que o computador pode executar, geralmente de uma vez, antes de o programa rodar.
Quando você escreve código em uma linguagem como C, Rust ou Go, a CPU não consegue rodar esse texto diretamente. Um compilador lê seu código-fonte, verifica se há erros e produz um executável (ou uma forma intermediária) que a máquina pode rodar. A compilação acontece antecipadamente, então a maioria dos erros é detectada antes de o programa sequer iniciar, e o binário resultante tende a rodar rápido.
O que um compilador realmente faz
Um compilador trabalha em fases: ele tokeniza o código-fonte (lexing), constrói uma árvore que representa a estrutura (parsing), verifica tipos e regras (análise semântica) e, por fim, emite código-alvo. Cada fase pode rejeitar seu programa, e é por isso que um step de compilação também é um poderoso gate de correção.
Compilador vs interpretador
Um compilador traduz o programa inteiro antes de ele rodar, produzindo um artifact autônomo. Um interpretador lê e executa o código linha a linha em tempo de execução. Linguagens compiladas costumam rodar mais rápido; linguagens interpretadas costumam iniciar mais rápido e são mais fáceis de iterar.
O que a compilação produz
- Código de máquina nativo para uma arquitetura de CPU específica (por exemplo x86-64 ou ARM).
- Bytecode para uma máquina virtual, como Java e C# fazem.
- Outra linguagem inteiramente, caso em que a ferramenta costuma ser chamada de transpilador.
- Diagnósticos: erros e avisos que interrompem um build ruim cedo.
Por que compiladores importam
Além da tradução, compiladores otimizam: eles fazem inline de funções, removem código morto e reorganizam instruções para rodar mais rápido. Eles também impõem o sistema de tipos da linguagem, transformando classes inteiras de bugs em erros de tempo de compilação em vez de incidentes em produção.
Um exemplo rápido
Rodar gcc main.c -o app lê main.c, compila e escreve um executável chamado app. Se você referenciar uma variável não declarada, o compilador para e imprime um erro em vez de produzir um binário quebrado.
Compiladores no CI
O step de compilação costuma ser a parte mais cara de um build, e é sensível a CPU e memória. Uma compilação grande pode ser lenta em runners pequenos e pode até ser encerrada se esgotar a memória. Runners maiores (como os que a Latchkey oferece) encurtam os tempos de compilação, e falhas transitórias de out-of-memory ou de toolchain podem ser reexecutadas automaticamente para que um build ruim não bloqueie um merge.
Principais conclusões
- Um compilador traduz código-fonte em código de máquina ou outra forma de nível mais baixo antes de o programa rodar.
- Ele detecta erros cedo e pode otimizar a saída em busca de velocidade.
- A compilação costuma ser o step mais pesado do build, limitado por CPU e memória.