- O projeto do navegador Ladybird adotou Rust como linguagem com segurança de memória para substituir C++ e está usando ferramentas de IA no processo de transição
- Eles avaliaram Swift anteriormente, mas mudaram de direção para Rust devido a limitações de interoperabilidade com C++ e restrições de plataforma
- O primeiro alvo de portabilidade foi o motor JavaScript LibJS, com uma tradução conduzida manualmente ao longo de centenas de prompts usando Claude Code e Codex
- Em cerca de duas semanas, concluíram 25 mil linhas de código Rust e verificaram que a saída e o desempenho são totalmente idênticos à versão em C++
- Por enquanto, o projeto manterá um modelo de desenvolvimento paralelo em C++ e Rust, com planos de reforçar segurança e manutenibilidade no longo prazo
Contexto da adoção de Rust
- A Ladybird avaliou várias linguagens para encontrar uma linguagem com segurança de memória para substituir C++
- Swift foi descartada por falta de interoperabilidade com C++ e por limitações de suporte fora do ecossistema Apple
- Rust foi considerada uma linguagem com ecossistema maduro para programação de sistemas e já familiar para muitos contribuidores
- Em 2024, a adoção foi adiada por conta da inadequação do modelo de OOP ao estilo de C++, mas depois decidiram retomá-la por razões de segurança e maturidade do ecossistema
- Com base nos casos de Firefox e Chromium, que já adotaram Rust, concluíram que Rust também era adequada para a Ladybird
Processo de portabilidade do LibJS
- O primeiro alvo da transição foi o LibJS, motor JavaScript da Ladybird
- Componentes independentes como lexer, parser, AST, bytecode generator e a cobertura de testes baseada no test262 o tornavam um bom ponto de partida
- Na portabilidade, usaram Claude Code e OpenAI Codex
- Não foi geração automática, e sim uma tradução conduzida por humanos, com decisões diretas sobre ordem de portabilidade e estrutura do código
- Eles deram instruções detalhadas ao longo de centenas de prompts e depois realizaram validação de código e detecção de erros com diferentes modelos
Resultados e validação
- O objetivo era que as saídas dos pipelines em C++ e Rust fossem idênticas em nível de byte
- Cerca de 25.000 linhas de código Rust foram concluídas em duas semanas, encurtando um trabalho que levaria meses
- AST e bytecode são completamente idênticos, sem queda de desempenho em testes e benchmarks de JS
- A correspondência dos resultados durante a navegação na web foi verificada com testes lockstep executando simultaneamente os pipelines em C++ e Rust
- Atualmente, o código mantém a forma traduzida a partir de C++, imitando até os padrões de alocação de registradores
- Isso ocorre porque a maior prioridade é garantir compatibilidade com o pipeline em C++
- Quando chegar o momento de aposentar o pipeline em C++, o plano é simplificar e reorganizar o código Rust
Próximos planos
- A transição para Rust seguirá como um trabalho paralelo, e não a direção principal de desenvolvimento do projeto
- Código C++ e Rust coexistirão, mantendo limites claros de interoperabilidade
- A ordem e o escopo da portabilidade serão gerenciados pela equipe principal, e contribuidores externos precisarão de alinhamento prévio
- No longo prazo, a transição gradual buscará melhorar segurança e manutenibilidade
- Embora reconheçam que a decisão pode gerar controvérsia, avaliam que foi a escolha certa para o futuro da Ladybird
1 comentários
Comentários no Hacker News
A parte mais inteligente deste projeto foi exigir uma saída idêntica byte a byte
Isso permite executar o pipeline antigo e o novo em paralelo, comparar o diff e detectar imediatamente bugs surgidos durante a tradução
Muitas reescritas fracassam porque as pessoas tentam “melhorar” durante o porte e acabam perseguindo bugs fantasmas causados pela versão antiga, pela nova ou por simples diferenças de comportamento
Mesmo que a versão traduzida de C++ para Rust pareça estranha no começo, tudo bem. Depois que o lado em C++ for totalmente aposentado, dá para torná-la gradualmente mais idiomatic
Dá para fazer refatoração, otimização e documentação, desde que a saída permaneça idêntica
Acho que ler o código e documentá-lo é o melhor momento para isso. Em um projeto popular como o Ladybird, documentar é uma forma de acelerar o desenvolvimento
Antigamente o custo de migração era tão alto que se justificava com algo como “já que vamos fazer, vamos melhorar também”, mas no fim isso só fazia perseguir mais bugs fantasmas
Eles traduziram código C++ para Rust usando Claude Code e Codex
Não foi totalmente automático; humanos definiram a direção e ajustaram tudo com centenas de prompts pequenos
Desde o início foi imposta a exigência de que a saída dos dois pipelines fosse idêntica byte a byte, e como resultado 25 mil linhas de código Rust ficaram prontas em 2 semanas
Tanto a AST quanto o bytecode coincidiram, e eles alcançaram 0 regressões
Acho que essa é exatamente a forma certa de usar IA para portar entre linguagens
Em 80 minutos ele analisou a estrutura do Drupal, restaurou a arquitetura e a organização modular originais e ainda implementou até plugins customizados
Hoje dizem que esse site já foi migrado para WordPress, ProcessWire, Node.js e agora até Next.js
Eu não quero “código pronto com um único prompt”, e sim uma ferramenta para passar longas sessões com a IA e amplificar a inteligência humana (IA)
Mas como esse tipo de ferramenta só pode ser usado por quem tem conhecimento de desenvolvimento, talvez o mercado seja pequeno
Claude não escreve código diretamente, apenas dá dicas e faz revisão
Como Rust é difícil de improvisar por causa das características da linguagem, esse método me agrada bastante
Agora ele até tem uma versão wasm que roda no navegador
Não implementei a parte criptográfica com ele, então não precisa se preocupar
A notícia da transição para Rust é interessante, mas surpreende porque a equipe do Ladybird antes parecia bem inclinada ao “anti-Rust hype”
Ainda assim, se migrarem para Rust, vai ficar muito mais fácil para eu contribuir
Linguagem é só ferramenta, e não acho que faça sentido atrelar identidade a uma linguagem específica
Andreas é um excelente engenheiro e alguém com instinto empreendedor
É impressionante como ele transformou um projeto de hobby em um projeto industrial
Ainda assim, essa mudança rápida de linguagem passa um leve ar de instabilidade
Vejo isso como o resultado de um crescimento natural do projeto
A fala de que “é um código Rust anormal, mas vamos arrumar depois” parece sugerir outra reescrita, e isso preocupa
Quando startups trocam de linguagem, isso costuma parecer um sinal de alerta
Quando o desenvolvimento da nova versão e o da versão existente andam em paralelo, surge uma corrida por velocidade, e a nova versão pode não conseguir alcançar a antiga
Linux, PHP e musl libc também passaram por reescritas completas várias vezes
Agora que a IA se popularizou, a conta de “reescrever tudo em uma nova linguagem” mudou completamente
Especialmente se houver uma suíte de testes, o risco cai bastante
Estamos numa era em que a importância dos testes ficou 10 vezes maior
Dá para experimentar rapidamente várias UIs como Streamlit, Shiny e Dash, então a prototipagem fica divertida
Em alguns projetos, a combinação de low-code + agent já é suficiente
A parte de “deixamos a revisão de código com a IA” soa preocupante
Modelos têm limitações para detectar erros lógicos
Mas a questão é se essa “arrumação” posterior realmente vai acontecer
Se você passa a depender de código de IA, cria-se um ciclo ruim de dependência de IA cada vez maior
O fato de o projeto desenvolver C++ e Rust em paralelo parece ineficiente
Talvez fosse melhor unificar tudo em uma única linguagem com segurança de memória
Se cada componente for escrito em apenas uma linguagem, não há problema
Na época da adoção de Swift em 2024, Andreas fez um tweet sobre Rust
Ele disse que Rust é ótimo para programas de curta execução, mas incômodo para programas de longa duração que mantêm grafos de objetos complexos
Também acrescentou uma avaliação de que a comunidade é tóxica
Link do tweet relacionado
Fico curioso se esse código Rust não idiomático pode virar dívida técnica no futuro
O projeto Servo também passou por isso, mas nesse processo foi possível encontrar bugs latentes
A transição para Rust parece uma escolha madura e alinhada com essa filosofia