Rust em 2025: mirando o software fundacional
(smallcultfollowing.com)- Rust completa 10 anos neste ano e vem se consolidando como a principal linguagem para o desenvolvimento de software fundacional (Foundational) no futuro
- Software fundacional significa a camada que serve de base para tudo, como kernels de sistemas operacionais, plataformas de nuvem, dispositivos embarcados e ferramentas de CLI
- Rust reduziu a barreira de entrada ao oferecer desempenho e confiabilidade no nível de C/C++, ao mesmo tempo em que garante segurança de memória com seu sistema de tipos
- A missão do Rust não se limita apenas à camada de base: por meio de projetos como Dioxus, Tauri e Leptos, ele também vem influenciando o desenvolvimento de aplicações de níveis superiores
- Para o futuro, planeja investir principalmente em interoperabilidade entre linguagens, expansão do sistema de tipos e fortalecimento do ecossistema
A visão do Rust: software fundacional
- A visão central do Rust é tornar mais fácil escrever e manter software fundacional
- Software fundacional inclui kernels de sistemas operacionais, infraestrutura de nuvem, dispositivos embarcados e ferramentas de CLI, que formam a base de todos os sistemas
- Ele já está sendo adotado em vários lugares, como os kernels do Windows e do Linux, o mecanismo de busca do VSCode
ripgrep, o Deno e o gerenciador de pacotes Pythonuv
- Nesse tipo de software, desempenho, confiabilidade e produtividade são igualmente cruciais
- Se a base falha, toda a camada superior é afetada, então estabilidade é indispensável
- Quedas de desempenho acabam limitando o desempenho das camadas acima, por isso é necessário minimizar overhead
Desempenho, confiabilidade e produtividade no software fundacional
- O software fundacional, como qualquer outro software, tem várias exigências, mas aqui cada uma delas se torna ainda mais importante
- Confiabilidade é a prioridade máxima. Se a fundação quebra, tudo o que está sobre ela falha junto
- Overhead de desempenho define o limite de desempenho das camadas superiores e, por isso, deve ser minimizado
- Tradicionalmente, havia duas opções para atender a esses requisitos
- C/C++: oferecem grande liberdade, mas exigem um nível equivalente de perfeição
- Linguagens de alto nível como Java e Go: exigem estilos especiais de programação para manter o desempenho, impondo restrições ao uso de abstrações e conveniências
- Rust muda esse cenário ao combinar abstrações de custo zero com um sistema de tipos que garante segurança de memória
- Assim, torna-se uma ferramenta que permite escrever código de alto nível com segurança, alcançando ao mesmo tempo desempenho de baixo nível e estabilidade de memória
Reduzir a barreira de entrada e ampliar a capacidade dos desenvolvedores
- Em apresentações sobre Rust, o sistema de tipos e as verificações estáticas costumam ser comparados a "espinafre": algo bom para você, mas que ninguém quer consumir
- Na prática, porém, o sistema de tipos é uma ferramenta extremamente poderosa para desenvolvedores
- Iniciantes podem aprender, por meio dele, a estruturar software de forma bem-sucedida
- Especialistas conseguem detectar mais rapidamente erros em suas próprias estruturas e designs
- A frase de Yehuda Katz, "As abstrações que construo em estado de foco ajudam o meu eu cansado do futuro", resume bem essa ideia
Além do software fundacional
- Mesmo que a missão do Rust esteja focada em software fundacional, isso não significa ignorar outras áreas
- Projetos como Dioxus, Tauri e Leptos estão expandindo o uso de Rust também para aplicações de nível mais alto, como GUIs e páginas web
- O principal ponto forte do Rust continua sendo, por natureza, o foco em software fundacional, mas essas iniciativas também não devem ser ignoradas
Metas ambiciosas e crescimento
- Como o software fundacional exige controle detalhado de baixo nível, em geral há a tendência de considerar acessibilidade e ergonomia como menos importantes
- Mas, justamente por haver esse nível de controle necessário, a usabilidade se torna ainda mais importante
- Se o desenvolvedor puder se concentrar apenas no que realmente importa, a produtividade aumenta bastante
- Projetos que impulsionam aplicações de alto nível em Rust também criam oportunidades para tornar a programação em Rust mais conveniente
- Essas melhorias acabam sendo refletidas integralmente também no desenvolvimento de software fundacional
- O ponto central é aumentar a usabilidade sem perder controle e confiabilidade
A importância do suporte à stack completa
- Outro motivo para tornar o desenvolvimento de aplicações de alto nível mais agradável em Rust é a possibilidade de construir a stack completa com uma única tecnologia
- Desenvolvedores que inicialmente planejavam usar Rust apenas em partes específicas, como serviços de data plane, vêm cada vez mais expandindo seu uso para toda a área
- Isso acontece porque Rust tem alta produtividade e permite compartilhar bibliotecas e código em uma única linguagem
- Em essência, código simples continua simples, não importa em qual linguagem seja escrito
A experiência de aprofundamento iterativo (Iterative Deepening)
- Idealmente, a primeira experiência de quem usa Rust deveria ser simples, e, à medida que o projeto avança, deveria ser possível expandir gradualmente mais controle de forma localizada
- Isso parece simples, mas na prática é um desafio muito difícil
- Muitos projetos fracassam por terem uma barreira de entrada alta para iniciantes ou por exigirem muito conhecimento para aprender níveis mais avançados de controle
- Rust nem sempre acerta, mas continua trabalhando de forma constante para melhorar isso
Planos para o futuro
- Este texto é o primeiro desta série e, ao longo de mais quatro artigos, pretende apresentar as áreas de investimento necessárias para tornar o Rust mais adequado ao software fundacional
- Interoperabilidade entre linguagens (smooth language interop) e extensibilidade (extensibility)
- Clareza de propósito (clarity of purpose) por meio do sistema de tipos
- Fortalecimento do ecossistema: melhores diretrizes, ferramentas e uso da Rust Foundation
- No último artigo, será discutida a operação da organização open source do Rust, com foco em como tornar contribuição e manutenção atividades o mais acessíveis e agradáveis possível
15 comentários
Mesmo que Rust pareça até legal, acho que é a única linguagem que me dá preguiça por causa do fandom tóxico (?) em volta dela.
Seria ótimo se C ou C++ tivessem um gerenciador de pacotes padrão. Sempre penso nisso quando vejo o Cargo.
Mas espinafre é tão gostoso....
Hoje em dia, não há lugar onde Rust não seja usado.
Trabalho em uma empresa relativamente grande, mas não existe nenhuma área onde Rust seja usado. Por favor, não tentem distorcer a realidade.
Não arrume briga.
Credo;;;;;;;
Não venha arrumar confusão, viu? 😅
Caramba ;;
Nossa...;;;
Deixando todo o resto de lado, ultimamente esses fanáticos por Rust estão me deixando doente de tanta raiva. Offline, é uma minoria dentro da minoria, mas online é quase um ISIS... Ah, sei lá, queria que se juntassem num canto e ficassem brincando só entre eles...
Muitas vezes, para quem paga de "rustacean", dá até para duvidar se a própria pessoa realmente usa direito.
Mesmo assim... vocês gostam de Rust, né?
Podem até odiar os fanáticos por Rust, mas por favor amem Rust ;_;
Mesmo apanhando feio por causa do FFmpeg, ficam dizendo que todo o código tem que ser escrito em Rust e coisas do tipo.
Comentários do Hacker News
Ao discutir software essencial, o ponto mais decepcionante no Rust seria a ABI. Para criar um OS em Rust e oferecer serviços ricos, os aplicativos precisam continuar funcionando após atualizações do sistema sem exigir recompilação das bibliotecas. O Windows resolve isso com COM, a Apple resolveu por um tempo com o dynamic dispatch do ObjC (e agora com a ABI do Swift), e o Android com JVM e bytecode. O Rust, na prática, só oferece suporte a
extern "C", o que limita o uso de bibliotecas dinâmicas. Fornecer uma ABI sem uma camada de VM (JVM, .NET) é extremamente difícil, e como isso exige nunca mais mudar detalhes de implementação já definidos, faz sentido que a prioridade seja baixa. Na prática, só Swift e COM parecem ter tido sucesso com esse modelo. Se o Rust adotasse uma ABI completa, ficaria perto de uma linguagem quase perfeita. (Gerenciar dependências em formato binário também reduziria muito o tempo de compilação)dlopen, existem ferramentas como stabby e abi_stable, que funcionam bem. Para interoperabilidade mais geral entre linguagens, o crABI (proposta do crABI) pode ser uma alternativa futura. Ainda assim, isso não é algo que o Rust possa resolver sozinho; também exige apoio e cooperação de outras linguagens e de várias comunidades, como as distribuições Linux. Também se menciona que, como Rust é uma linguagem em que a forma de I/O e de alocação de memória é escolhida explicitamente, talvez uma estrutura como a do Swift, que resolve tudo com bibliotecas compartilhadas, não se encaixe tão bem.repr(wasm)/extern "wasm", mas com wit-bindgen ou o alvo wasm32-wasip2 dá para usar sem muita dificuldade. Vídeo de introdução ao Wasm Componentsextern "C". E também já houve propostas para expandir a ABI extern para mais tiposCGosta muito de Rust, mas gostaria que alguns problemas crônicos e irritantes recebessem mais atenção
proc macroetc.Ao refletir sobre a expressão “Smooth, iterative deepening”, considera-se que o Rust dá importância demais à compatibilidade entre linguagens, o que pode acabar só aumentando a complexidade e prejudicando a segurança. Nesses casos, seria mais útil substituir as partes mais fundamentais do sistema, como a
libc. O Go quase não faz chamadas cross-language. O Google fortaleceu a base ao desenvolver internamente suas bibliotecas essenciais, mas no Rust há várias versões concorrentes de bibliotecas fundamentais, e muitas delas estão incompletasDestaca-se que “evitar alocação, evitar acionar o GC” não está de acordo com conceitos modernos de GC e JIT. GCs modernos muitas vezes quase não têm latency stop-the-world, e o uso total de CPU do GC depende principalmente da proporção entre resident set e tamanho do heap. JIT tem mais oportunidades de otimização do que AOT, e pode explorá-las de forma mais agressiva (graças a otimização especulativa). O que realmente importa são atraso de inicialização/aquecimento, overhead de memória e desempenho médio, não o pior caso degradado. Além disso, não é garantido que gerenciamento manual de memória seja mais eficiente, e mesmo que o uso real de RAM triplique, a diferença de custo pode ser zero. Também se recomenda esta apresentação da ISMM, que trata bem do tema
Considera-se que os comentários sinalizados e a discussão captaram bem os pontos centrais. “Vamos criar um padrão de linguagem com especificação oficial”, “precisamos de várias implementações” etc. são questões importantes na prática. Em especial, @infogulch apontou bem que, para uma linguagem se tornar base da indústria, uma especificação formal é essencial (comentário de referência)
As pessoas frequentemente questionam se o Rust realmente precisa ter especificação, e isso é visto como prova de que há engenharia de menos em engenharia de software
Sobre um comentário dizendo que Rust é “uma linguagem usada apenas por quem quer parecer programador”, alguém responde que, na verdade, ama programar e Rust foi um choque renovador. Não quer de jeito nenhum voltar ao passado extremamente doloroso do C++. E não considera tão importante ter padrão de linguagem (doação da especificação Ferrocene) ou várias implementações. Python e Java também funcionam bem dependendo de uma implementação central. O C++ tentou dar suporte a vários compiladores e acabou apenas ampliando problemas complexos por plataforma. Não fica claro o que exatamente seria a “bagunça” do cargo, e a experiência com C++ parecia muito pior