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:

  1. Lexer — transforma caracteres em tokens, como func, main, int e literais.
  2. Parser — organiza tokens numa árvore sintática concreta (CST), preservando a estrutura do arquivo.
  3. Resolução e type checking — resolve módulos, nomes e tipos; também verifica regras de posse e uso.
  4. AMIR — representa o programa numa IR intermediária onde análises e garantias podem ser aplicadas.
  5. 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.

Por baixo dos panos

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.