O andamento da reescrita de Rust para Zig
Reescrever um compilador de 300 mil linhas de código é uma tarefa hercúlea. Fazer isso em um ano e meio, trocando Rust por Zig, e ainda alcançar a paridade de recursos com a versão original? Essa é a história recente por trás do compilador Roc, e é um estudo de caso cheio de lições valiosas para qualquer equipe de engenharia.
Enquanto o projeto Bun recentemente compartilhou a experiência oposta – uma reescrita de Zig para Rust – a equipe do Roc optou por uma direção diferente, e os resultados já começam a aparecer, trazendo funcionalidades poderosas e um vislumbre do futuro da linguagem.
A Jornada da Reescrita e a Paridade de Recursos
Nos últimos 18 meses, a equipe por trás do compilador Roc embarcou na ambiciosa missão de reescrever suas 300.000 linhas de código Rust para Zig. A decisão não foi trivial, e o objetivo era mais do que apenas uma portabilidade direta; envolvia mudanças arquitetônicas significativas que visavam desbloquear novas capacidades para a linguagem.
Recentemente, um marco emocionante foi atingido: a paridade de recursos com o compilador original. Isso significa que a nova base de código Zig agora é capaz de fazer tudo o que a versão Rust fazia, abrindo caminho para o lançamento da versão 0.1.0 ainda este ano.
Um exemplo prático dessa conquista é a atualização do jogo Rocci Bird, criado por Brendan Hansknecht. O jogo, com menos de mil linhas de código Roc, agora roda com o novo compilador. O resultado é notável: o código-fonte atualizado é mais conciso, e o comando roc build --opt=size gera um binário WebAssembly (WASM) de apenas 31KB – menos da metade do tamanho produzido pelo compilador original. WebAssembly é um formato de código binário que pode ser executado em navegadores web e outros ambientes, ideal para aplicações de alta performance. Ver aqueles pixels roxos ganharem vida com o novo compilador trouxe um sorriso ao rosto da equipe, validando o árduo trabalho.
O sucesso dessa empreitada é um testemunho do esforço coletivo. A equipe expressou profunda gratidão a diversos colaboradores, como Anthony Bullard e Sam Mohr pelo novo parser, Jared Ramirez pelo novo type-checker, e Ayaz Hafiz pelo sistema de resolução de lambda set, entre muitos outros que dedicaram seu tempo e talento para tornar essa visão uma realidade. O suporte de patrocinadores como rwx, Lambda Class e NoRedInk também foi crucial para apoiar os contribuidores.
O Contraste com Bun e as Razões por Trás dos Números
É natural comparar a experiência do Roc com a do Bun, que realizou uma reescrita de Zig para Rust em meros 11 dias para cerca de 500.000 linhas de código. A reescrita do Roc, por outro lado, levou 487 dias – 476 dias a mais. À primeira vista, essa diferença pode parecer um ponto para Rust ou Zig, mas a realidade é mais complexa e instrutiva.
A disparidade no tempo de reescrita não tem a ver inerentemente com as linguagens Rust ou Zig. A equipe do Roc enfatiza que a reescrita do Bun foi um port direto, ou seja, uma tradução de um código existente para outra linguagem, mantendo a arquitetura e as funcionalidades. Em contraste, a reescrita do Roc foi impulsionada por uma decisão estratégica de mudar fundamentalmente o compilador. Isso significou redesenhar, reinventar e implementar uma série de novas funcionalidades e abordagens que não existiam na versão Rust. As técnicas usadas pelo Bun, focadas na portabilidade rápida, simplesmente não teriam funcionado para os objetivos do Roc.
Essa distinção é crucial: comparar as bases de código original em Rust e a nova em Zig não é uma comparação "maçãs com maçãs". A reescrita do Roc foi um investimento em uma nova fundação, projetada para o futuro e para desbloquear capacidades que seriam difíceis ou impossíveis de alcançar com a arquitetura anterior.
O Que a Reescrita Desbloqueou: Funcionalidades Inovadoras
A dor de cabeça de uma reescrita massiva é justificada pelas inovações que ela permite. O novo compilador Roc, construído em Zig, introduz funcionalidades que aprimoram significativamente a experiência de desenvolvimento e o desempenho:
Hot Code Loading (Recarregamento de Código em Tempo Real): Esta é uma funcionalidade padrão em linguagens interpretadas como Python, mas rara em linguagens compiladas de alta performance como Roc. Com o novo compilador, é possível iniciar um servidor web com
roc server.roc, alterar seu código enquanto ele está em execução, e a próxima requisição já será tratada pela nova versão do código, sem a necessidade de reiniciar o servidor. Isso acelera drasticamente o ciclo de desenvolvimento.Binários Cross-Compilados Otimizados: O comando
roc build server.rocgera um binário otimizado por LLVM (um conjunto de tecnologias de compilador que visa gerar código de máquina eficiente) e autocontido, pronto para ser implantado. Além disso, o Roc agora suporta cross-compilation, ou seja, compilar código em uma plataforma para ser executado em outra. Construir um binário estático para Alpine Linux, por exemplo, é tão simples quantoroc build --target=x64musl. O mais impressionante é que esse comando produzirá os mesmos bytes de saída (para os mesmos bytes de código-fonte de entrada) em qualquer sistema operacional, uma garantia que nem todos os compiladores oferecem.Pattern Matching com Interpolação de Strings: Uma nova funcionalidade da linguagem permite a interpolação de strings diretamente dentro de pattern matching, como visto na lógica de tratamento de requisições HTTP. Isso não só torna o código mais conciso e legível, mas também é type-safe em tempo de compilação e, no exemplo fornecido, realiza zero alocações de memória dinâmica (heap allocations), o que significa maior performance e menor consumo de memória.
Por Que Isso Importa
A história da reescrita do Roc é um lembrete poderoso de que, embora dolorosas e demoradas, as reescritas de código podem ser investimentos estratégicos cruciais. Não se trata apenas de trocar uma linguagem por outra, mas de aproveitar a oportunidade para repensar e refatorar fundamentalmente a arquitetura de um sistema. Para builders e tomadores de decisão em tecnologia, a lição é clara: avalie se uma reescrita é um port ou uma chance de inovação. Quando feita com uma visão clara e para desbloquear novas capacidades, ela pode levar a ganhos significativos em eficiência, desempenho e experiência do desenvolvedor, solidificando a base para o crescimento futuro.
Fontes
📬 Gostou? Assine a newsletter do Vaccari's Code e receba as próximas tendências em software e IA direto no seu e-mail: Assinar aqui