Rust em 2025: evolução da linguagem de programação de sistemas
2025 tornou-se um ano marcante para o ecossistema Rust. A linguagem, que já se consolidou como uma alternativa confiável ao C e C++, continua a se desenvolver ativamente, introduzindo funcionalidades há muito esperadas e melhorando o desempenho. Neste artigo, analisaremos as principais inovações já disponíveis ou que chegarão às versões estáveis do Rust em 2025. Abordaremos mudanças na linguagem, ferramentas e práticas de desenvolvimento, apoiando cada tese com exemplos de código claros.
1. Estabilização de Async-generators e corrotinas
Um dos eventos mais aguardados de 2025 foi a estabilização completa dos async-generators (RFC #2394). Anteriormente, para criar iteradores assíncronos, eram necessários crates de terceiros ou macros complexas. Agora, isso é uma funcionalidade nativa da linguagem.
A nova sintaxe permite definir funções que podem yield valores em um contexto assíncrono, simplificando o trabalho com fluxos de dados, web sockets e processamento de grandes volumes de informação.
use std::pin::pin;use std::future::Future;
// Generator assíncrono que simula recebimento de dados pela redeasync fn stream_data(items: Vec<u32>) -> impl AsyncIterator<Item = u32> { for item in items { // Simulação de atraso assíncrono yield item; }}
#[tokio::main]async fn main() { let mut stream = pin!(stream_data(vec![1, 2, 3, 4, 5])); while let Some(value) = stream.next().await { println!("Recebido: {}", value); }}Essa mudança simplifica significativamente a escrita de pipelines assíncronos eficientes, tornando o código mais legível e seguro.
2. Revolução na compilação: Polonius e Cranelift
Em 2025, o compilador Rust recebeu duas atualizações importantíssimas que impactam diretamente a velocidade de desenvolvimento e verificação de código.
Polonius (NLL v2). O novo modelo de empréstimos (Non-Lexical Lifetimes v2) foi finalmente estabilizado. Ele permite que o compilador analise com mais precisão o tempo de vida das referências, resultando na aceitação de um número maior de programas corretos que antes eram rejeitados erroneamente. Isso é especialmente perceptível ao trabalhar com estruturas de dados complexas e referências internas.
// Exemplo que se tornou possível graças ao Poloniusfn process_data(data: &mut Vec<i32>) -> &i32 { let first = &data[0]; // Empréstimo de data data.push(1); // Antes: erro - empréstimo mutável e imutável first // Agora o compilador entende que first não depende de push}Backend Cranelift. Para compilações de depuração (debug mode), o backend Cranelift agora é usado por padrão. Isso proporciona um ganho de velocidade de compilação de 2 a 3 vezes em comparação com o LLVM, mantendo a boa qualidade das mensagens de erro. Para compilações de produção, o LLVM otimizador continua sendo utilizado.
3. Novas possibilidades em traits e tipos
O desenvolvimento do sistema de tipos continua. Em 2025, duas funcionalidades importantes surgiram: Traits with Associated Defaults e Impl Trait in Associated Types.
A primeira permite definir em um trait não apenas as assinaturas dos métodos, mas também valores padrão para constantes e tipos associados. A segunda possibilita o uso de impl Trait na posição de tipo de retorno para tipos associados, tornando a API mais flexível.
trait Factory { type Output: Clone; // Tipo associado const DEFAULT_NAME: &'static str = "default"; // Valor padrão
fn create(&self) -> Self::Output;}
struct NumberFactory;
impl Factory for NumberFactory { type Output = i32; // const DEFAULT_NAME não é sobrescrito - usamos "default"
fn create(&self) -> i32 { 42 }}
// Uso de impl Trait em tipo associado
```