Lição 6: Do código-fonte ao binário
Você já escreveu código. Agora vamos acompanhar o que acontece quando o CLI transforma esse código em um programa executável.
O pipeline de compilação
Quando você roda arandu check, o compilador percorre etapas que separam texto, significado e execução:
- Lexer — transforma caracteres em tokens, como
func,main,inte literais. - Parser — organiza tokens numa árvore sintática concreta (CST), preservando a estrutura do arquivo.
- Resolução e type checking — resolve módulos, nomes e tipos; também verifica regras de posse e uso.
- AMIR — representa o programa numa IR intermediária onde análises e garantias podem ser aplicadas.
- Backend — traduz a IR para o alvo de execução. O backend atual usa Cranelift para JIT e AOT.
check para antes de gerar e executar o artefato. run usa o caminho de execução do host; build produz um artefato nativo para distribuição.
Tipos e representação
Os tipos primitivos não são sinônimos:
| Tipo | O que representa | Uso típico |
|---|---|---|
int |
inteiro da plataforma | contadores e quantidades comuns |
i8, i16, i32, i64 |
inteiro com largura definida | protocolos, arquivos e layouts binários |
uint e variantes sem sinal |
inteiro não negativo | tamanhos e índices quando o domínio exigir |
f32, f64 |
ponto flutuante | medições e cálculos aproximados |
bool |
verdadeiro ou falso | estados e condições |
str |
texto | mensagens e identificadores textuais |
int é conveniente quando o valor acompanha a largura natural do alvo. i32 não significa “inteiro melhor”: significa exatamente 32 bits, o que importa quando o layout precisa ser estável entre máquinas. O compilador e o TargetInfo usam o alvo para conhecer tamanho, alinhamento e offsets.
O que “multiplataforma” significa
O mesmo código-fonte pode ser analisado para diferentes alvos, mas um binário nativo não é universal. Um executável para Windows não é o mesmo artefato que um executável para Linux ou macOS: cada um precisa da ABI, do linker e das convenções do sistema correspondente.
src/main.aru
│
├── build para x86_64-pc-windows-msvc → executável Windows
├── build para x86_64-unknown-linux-gnu → executável Linux
└── build para aarch64-apple-darwin → executável macOS/Apple Silicon
O suporte a um novo alvo depende do backend, do TargetInfo e das ferramentas de link desse sistema. A matriz suportada deve ser confirmada na release instalada.
O pipeline é incremental: queries do compilador podem reutilizar resultados que não mudaram. Por isso, projetos maiores não precisam reprocessar tudo a cada edição.
Pratique
Altere o tipo de saldo na primeira lição para i32, rode arandu check e compare o contrato. Depois rode arandu build e observe o artefato produzido para o host atual.
Este é o ponto de chegada do tour: escrever código legível, entender o contrato dos tipos, controlar posse e saber o que o compilador garante em cada etapa.