Bun reescreve 535 mil linhas de Zig para Rust em 4 meses com ajuda de IA, eliminando vazamentos de memória
Jarred Sumner, criador do Bun, anunciou recentemente que o Bun — um runtime, bundler e gerenciador de pacotes para JavaScript e TypeScript — foi completamente reescrito de Zig para Rust. O objetivo da reescrita é eliminar vulnerabilidades recorrentes de segurança de memória por meio do borrow checker do Rust. A reescrita assistida por IA foi concluída em 4 meses de trabalho, em vez dos 12 meses estimados.
Sumner resumiu a motivação por trás do que começou como um teste:
Uma grande porcentagem dos bugs [...] são use-after-free, double-free e "esqueci de liberar a memória" em um caminho de erro. No Rust seguro, esses são erros do compilador e limpeza automática similar a RAII com Drop. Erros do compilador são um ciclo de feedback melhor do que um guia de estilo. Historicamente, reescritas são uma péssima ideia. [...] Bun tem 535.496 linhas de Zig. Uma reescrita em outra linguagem levaria a um pequeno time de engenheiros um ano inteiro. Significaria congelar correções de bugs, correções de segurança ou desenvolvimento de features por todo esse tempo. Felizmente, a própria suíte de testes do Bun é escrita em TypeScript, o que significa que não depende da linguagem de programação do runtime. E se, em vez disso, eu gastasse uma semana testando se o novo modelo da Anthropic consegue reescrever Bun em Rust? No começo, eu não esperava que funcionasse. Poucos dias depois, uma alta porcentagem da suíte de testes começou a passar e vi como o novo código Rust se alinhava com a base de código Zig original. Minha opinião mudou de "isso vale a pena tentar" para "vou fazer o merge disso".
Arquitetura da reescrita com IA
Sumner executou uma porta automatizada all-at-once aproveitando, para a maior parte da reescrita, uma versão pré-lançamento do Claude Fable 5 orquestrado em aproximadamente 50 workflows dinâmicos. O código Zig seria transpilado para Rust (possivelmente usando Rust unsafe que poderia ser refatorado depois) e validado contra a suíte de testes existente com mais de um milhão de assertions. Um guia de porting ajudaria Claude a mapear padrões e tipos de Zig para padrões e tipos de Rust. Revisões de código adversárias por agentes detectariam problemas antes que chegassem ao port final. O loop de implementação seria melhorado após cada erro, aprimorando o processo de implementação em vez de corrigir manualmente os artefatos de implementação (por exemplo, o código).
O processo constante de melhoria revelou padrões úteis. A fase de planejamento é crítica para o sucesso e deve resultar na antecipação e mitigação dos principais desafios. O arquivo PORTING.md (descrevendo o mapeamento de Zig para Rust) e o arquivo LIFETIMES.tsv (descrevendo os tempos de vida de cada campo de struct na base de código) foram fatores-chave de sucesso para o port.
Um agente implementador usaria esses arquivos para traduzir arquivos Zig em código Rust. O agente implementador enfrentaria dois agentes revisores adversários executados em janelas de contexto isoladas com acesso apenas aos diffs de arquivo, tendo como única tarefa descobrir bugs e divergências comportamentais. Sumner enfatiza:








