Rust ativa seu resolvedor de traits de nova geração nas builds nightly
3 min de leitura
Em números
- 200+
- GitHub issues fixed by the new solver, per the Rust team
- ~4 yrs
- of active development before this switch
- 8x
- faster on the datafusion crate, per the announcement

O projeto Rust ativou por padrão seu resolvedor de traits de nova geração nas builds nightly em 22 de agosto, chamando-o de "a maior mudança única no compilador Rust desde seu lançamento inicial". O anúncio coloca a estabilização "nos próximos meses" - ou seja, o código de todo desenvolvedor Rust em breve passará por um núcleo reescrito do compilador, e a hora de descobrir se o seu sobrevive é agora, enquanto um relatório de regressão ainda conta.
O que o resolvedor de traits realmente faz
O resolvedor de traits é a parte do compilador que responde à pergunta mais frequente do Rust: este tipo implementa este trait? Ele prova cláusulas where, normaliza tipos associados e decide os limites de traits por trás de quase toda linha de código genérico. A cobertura da LWN remonta o esforço a uma década: uma reimplementação experimental chamada Chalk começou em 2015, e em 2023 o projeto decidiu pela reescrita que se tornou o resolvedor de hoje.
O novo resolvedor também muda o que a linguagem consegue expressar. A LWN explica que ele aplica raciocínio coindutivo - que seu autor Daroc Alden descreve por contraste: "um ciclo indutivo é um loop infinito, ou uma função recursiva sem caso base. Um ciclo coindutivo... corresponde a algo como um gerador" - habilitando interfaces baseadas em traits autorreferenciais que o resolvedor antigo simplesmente não conseguia provar. Segundo a LWN, esse tratamento coindutivo é deliberadamente limitado a um pequeno conjunto de autotraits como Send.
Uma década de trabalho
| Marco | Quando |
|---|---|
| Começa o Chalk, primeira reimplementação experimental | 2015 |
| Decisão de reescrever rumo ao resolvedor atual | 2023 |
| Novo resolvedor chega ao stable - só para verificação de coerência | antes desta mudança |
| Padrão no nightly | 22 de agosto de 2026 |
| Estabilização planejada | "nos próximos meses" |
A escala é incomum para a troca de um componente de compilador: a equipe do Rust diz que o novo resolvedor corrige mais de 200 issues do GitHub acumuladas contra o antigo, e o retrato de março da LWN contava 76 bugs abertos e 78 fechados contra a nova implementação - uma base de código testada em público, não uma peça de reposição pronta.
O que quebra, e o que se destrava
A equipe do Rust é incomumente direta sobre o custo: "Esta é uma mudança
incrivelmente grande que resulta em uma quantidade não trivial de
quebras". Parte do código que compila hoje deixará de compilar; parte do
código que o resolvedor antigo rejeitava por engano agora compila. O
anúncio cita o tratamento alterado de impl Trait em posição de retorno,
Type Alias Impl Trait e Return Type Notation, além de um tratamento mais
correto de tipos associados em tipos higher-ranked - removendo inferências
de tipo incorretas que o resolvedor antigo permitia.
A recompensa, segundo o anúncio: aposentar a implementação antiga destrava Type Alias Impl Trait e Return Type Notation como recursos estáveis, abre a porta para novos limites de traits implícitos por padrão e permite à equipe corrigir as inseguranças conhecidas restantes do sistema de tipos. Há ganhos de desempenho também - a equipe cita a crate datafusion compilando 8 vezes mais rápido com o novo resolvedor.
O que isso significa para desenvolvedores
Se você mantém uma crate Rust, rode-a esta semana contra o nightly mais
recente - rustup update nightly && cargo +nightly check é o teste
inteiro - e abra um issue para qualquer regressão. O pedido da equipe é
explícito: "Experimente o nightly mais recente e abra um issue se
encontrar bugs ou regressões". A quebra que você reporta agora molda a
estabilização; a quebra que você descobre depois de chegar ao stable é só
problema seu.
Se o seu CI ainda não inclui um job de nightly, este é o argumento mais forte em anos para adicionar um, mesmo como build consultiva não bloqueante: uma "maior mudança desde a 1.0" chegando ao stable em meses é exatamente o evento para o qual esse canal existe.
E se você já bateu nas paredes do resolvedor antigo - designs de API cheios de traits que morreram em falhas de inferência misteriosas, ou travamentos em código profundamente genérico - vale a pena retestar exatamente esses casos no nightly. Entre o suporte à coindução, as correções de tipos associados e ganhos de compilação como o do datafusion, alguns contornos antigos de "Rust não consegue fazer isso" na sua base de código podem ter acabado de se tornar removíveis.