5 pontos por GN⁺ 2026-02-24 | 1 comentários | Compartilhar no WhatsApp
  • 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

 
GN⁺ 2026-02-24
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

    • Portar é um bom momento para melhorar muita coisa, mas não para adicionar novos recursos
      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
    • Espero ver mais portes puros desse tipo
      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
    • Gosto muito dessa abordagem. Há alguns dias li um texto escrito sob a ótica de testes e validação e fiquei surpreso ao ver isso aplicado a um projeto tão complexo
    • Eu mesmo já converti frameworks web assim várias vezes. Ajustava o código novo até a string de saída HTTP bater completamente, depois apagava por completo a versão antiga
    • Se houver uma boa suíte de testes, essa abordagem funciona muito melhor. Imagino que o Ladybird tenha isso
  • 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

    • Eu também já usei Claude para portar um script Perl quebrado para Rust
      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
    • É uma pena que as empresas de IA não foquem mais nesse modo de uso colaborativo
      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
    • Eu também estou aprendendo Rust e criei uma skill chamada “teach” para usar com Claude
      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
    • Eu também uso Claude assim. Não é “a IA faz tudo”, e sim um parceiro para design, revisão e testes
    • Já portei com Claude um script bash complexo que eu havia feito para golang, e a velocidade e a estabilidade melhoraram enormemente
      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

    • Eu também gosto de Rust, mas o entusiasmo excessivo com a linguagem às vezes cansa
      Linguagem é só ferramenta, e não acho que faça sentido atrelar identidade a uma linguagem específica
    • Eu não gosto de Rust, mas às vezes ele é a melhor escolha prática
    • Há um link dizendo que o Ladybird agora não é mais centrado em C++/Swift
    • Fico um pouco inquieto com mudanças frequentes na direção da linguagem. Isso pode abalar a continuidade do projeto
  • 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

    • Andreas não é apenas um empresário; ele é o engenheiro que criou praticamente sozinho o Serenity OS ao longo de vários anos
      Vejo isso como o resultado de um crescimento natural do projeto
    • Dizem que a decisão por Swift também foi um julgamento racional, depois de testar pessoalmente várias linguagens
    • Como referência, ele trabalhou no time da engine do Apple Safari no passado
    • Mesmo assim, ainda resta a dúvida se isso vai realmente resultar em um navegador novo de verdade
    • Você disse que está “inquieto”, mas fico curioso sobre exatamente o que te inquieta
  • 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

    • Ainda assim, C++ e Rust são ambas linguagens multiparadigma, então dá para portar a estrutura de forma parecida
    • Isso me lembra a “armadilha da reescrita” de Joel on Software
      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
    • Mas o Ladybird não é uma startup, e sim um projeto aberto, então a comparação é diferente
      Linux, PHP e musl libc também passaram por reescritas completas várias vezes
    • Se eu estivesse nessa situação, provavelmente continuaria usando o Firefox
    • Portar durante semanas com LLMs parece uma escolha um tanto estranha
  • 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

    • Em um projeto pessoal eu também usei IA para criar uma biblioteca CLI em Python
      Dá para experimentar rapidamente várias UIs como Streamlit, Shiny e Dash, então a prototipagem fica divertida
    • No longo prazo, conforme a IA avançar, acho que o próprio significado das linguagens de programação vai diminuir
      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

    • Ainda assim, se no fim eles obtiveram 0 regressões + saída idêntica em 65 mil testes, não dá para ignorar totalmente
      Mas a questão é se essa “arrumação” posterior realmente vai acontecer
    • Revisores humanos também não são perfeitos. Quando se revisa sob várias perspectivas, seja IA ou pessoa, é possível detectar erros diferentes
    • Essa é justamente a área que a suíte de testes deveria validar
    • Mas também há quem não queira lidar com código Rust não idiomático gerado por IA
      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

    • Mas codebases mistas, como a do Firefox, são perfeitamente viáveis
      Se cada componente for escrito em apenas uma linguagem, não há problema
    • Tentar uma transição completa pode causar uma grande perda de momento, a ponto de o projeto parar
    • Também é possível garantir segurança de memória usando um subconjunto estrito de C++
  • 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

    • Será que ele mudou de ideia? Nem sei se desde o começo era mesmo necessário trocar o C++
    • Eu me identifico com essa atmosfera excludente da comunidade Rust
    • Talvez tenham promovido essa migração para Rust baseada em IA por exigência de patrocinadores
  • Fico curioso se esse código Rust não idiomático pode virar dívida técnica no futuro

    • O risco está principalmente na etapa de limpeza. Padrões de ponteiro ao estilo C++ podem entrar em conflito com as regras de ownership do Rust
      O projeto Servo também passou por isso, mas nesse processo foi possível encontrar bugs latentes
    • O problema não era o C++ em si; a migração para Rust aconteceu por causa da segurança de memória
    • Andreas já vinha mencionando problemas de segurança com GC no runtime de JS e queria uma linguagem mais segura
      A transição para Rust parece uma escolha madura e alinhada com essa filosofia