crustc: `rustc` completo em C
No mundo do desenvolvimento de software, a portabilidade e o suporte a diferentes arquiteturas são tópicos que frequentemente geram debates acalorados. Rust, com sua promessa de segurança e performance, tem conquistado seu espaço, mas uma crítica recorrente é sua dependência de toolchains modernas e, em particular, do LLVM. E se eu dissesse que agora existe um compilador Rust que pode ser construído com GCC e make, e que é, surpreendentemente, escrito inteiramente em C?
crustc: O Compilador de Rust em C
Isso mesmo, você não leu errado. crustc é a totalidade do rustc — o compilador oficial de Rust — traduzida para C. Não é uma reescrita, mas uma tradução direta do código-fonte. O resultado? Um compilador Rust funcional que você pode compilar com ferramentas clássicas como GCC e make. Ele foi demonstrado compilando bibliotecas essenciais do Rust como core, alloc e std, e o crustc resultante é uma versão rustc 1.98.0-nightly.
A ideia de ter o rustc em C é fascinante por si só, mas crustc é, na verdade, uma vitrine, um "teaser" para uma ferramenta maior e mais ambiciosa: a toolchain cilly. O projeto cilly é o culminar de três anos de trabalho, diversas tentativas públicas e privadas, e representa a 14ª iteração de um esforço para compilar Rust para C.
cilly: A Ferramenta Por Trás da Mágica
cilly é uma biblioteca Rust para geração de código C e um backend (ou plugin) para o compilador Rust, que permite compilar seu código Rust para C para targets arbitrários. A grande sacada por trás do cilly é sua capacidade de se adaptar aos compiladores C existentes. Em vez de fazer suposições, ele gera programas de "testemunha" (witness programs) que verificam o que um dado compilador e plataforma realmente suportam. Isso inclui desde a presença de _Thread_local até o sizeof de tipos básicos como float e double.
Essa abordagem garante que cilly possa gerar código C que funcione mesmo com compiladores C mais exóticos ou específicos para sistemas operacionais incomuns. Ele consulta layouts de tipos, tamanhos, alinhamentos, codificações de caracteres (ASCII) e formatos de inteiros (complemento de dois), com fallbacks quando possível. O objetivo é não assumir nada além do ANSI C, inclusive implementando workarounds para funcionalidades de padrões C "modernos" como strict aliasing.
Uma ressalva importante é que o código C gerado pelo cilly é específico para o compilador e a plataforma. Ou seja, o C gerado para Arm64 não rodará em riscv32; no entanto, o cilly pode gerar código C especificamente para riscv32. O crustc que serve de demo, por exemplo, foi gerado para Arm64 Linux, a arquitetura da estação de trabalho do desenvolvedor, utilizando GCC 13.3.0 e LLD 18.1.3.
O objetivo principal do cilly é estender o suporte de Rust a hardware antigo ou obscuro que não possui suporte para LLVM ou GCC, mas que ainda roda C. Isso resolve uma crítica legítima ao Rust: a dificuldade de portar projetos para certos targets onde o C ainda é rei.
Como cilly Atua na Prática
Do ponto de vista do usuário, cilly se integra ao rustc e a um compilador C, traduzindo o código Rust para C "on the fly". A configuração é feita através de um JSON onde você define o compilador C a ser usado para um determinado target, especificando executável, argumentos base e outros detalhes.
Uma característica engenhosa é a transparência de rede do cilly. Ele pode se comunicar com compiladores C via TCP (e potencialmente UART), o que é uma solução elegante para o "paradoxo do bootstrap" em plataformas sem cross-compilers C. Você pode rodar um pequeno servidor C no seu sistema operacional exótico (ex: Plan9), e o cilly no seu Linux Arm64 se comunica com ele para compilar o Rust. Isso já foi demonstrado com sucesso, compilando pequenos programas Rust para VMs x86 Plan9 a partir de um Linux Arm64.
Para maior flexibilidade, o cilly pode opcionalmente incorporar marcadores em seus arquivos objeto e salvar sua Intermediate Representation (IR) em um diretório de cache. A partir desses marcadores, ele pode gerar um diretório com makefiles, permitindo que você construa seu projeto Rust com um compilador C e make, da forma mais tradicional possível.
Em termos de compatibilidade ABI, o código gerado pelo cilly é "majoritariamente" compatível com o código compilado pelo rustc padrão. Digo "majoritariamente" porque, em algumas plataformas (como Arm64), o rustc escolhe uma ABI que não é representável diretamente a partir do C.
Por Que Isso Importa?
A iniciativa crustc e, mais amplamente, a toolchain cilly, representam um avanço significativo para a comunidade Rust. Ao permitir a compilação de Rust para C, o projeto remove uma barreira considerável para a adoção da linguagem em cenários onde o suporte a toolchains modernas é limitado ou inexistente. Isso significa que desenvolvedores podem agora considerar Rust para sistemas embarcados legados, hardware especializado ou plataformas obscuras que antes estavam fora de alcance. É um passo ousado para tornar Rust ainda mais ubíquo, provando que a linguagem pode ser tão adaptável e "pé no chão" quanto o C, sem abrir mão de suas vantagens de segurança e performance.