- O projeto Git anunciou oficialmente que vai adotar Rust no núcleo e que, a partir do Git 3.0, Rust se tornará um requisito obrigatório de build
- Esta série de patches avança com o caráter de adoção experimental (test balloon), como ocorreu no passado com a introdução de recursos do C99, com o objetivo de preparar gradualmente a infraestrutura para incorporar Rust
- Como primeiro passo, o módulo varint.c, que quase não tem dependências, foi convertido para Rust para validar a interoperabilidade entre C e Rust e o tooling de build
- No momento, há suporte apenas para build com Meson; no futuro, devem ser adicionados suporte a Makefile e, no CI, validação de build com Rust e verificação de consistência de formatação baseada em
cargo format
- Trata-se de uma mudança importante de longo prazo para aumentar a segurança e a escalabilidade do código, ao mesmo tempo em que dá à comunidade Git e aos distribuidores tempo para se adaptar aos novos requisitos da toolchain Rust
Contexto da adoção de Rust
- O Git vem avaliando uma evolução de linguagem para reforçar a estabilidade e a manutenção
- A adoção de Rust significa reforço da segurança de memória, uso de toolchains modernas e possibilidade de otimização de desempenho
- Além disso, a ideia é construir uma base de código mais robusta por meio da adoção de uma linguagem moderna
- O objetivo de avisar com antecedência que Rust será obrigatório no lançamento do Git 3.0 é garantir tempo de preparação para o ecossistema
- O plano é ampliar gradualmente o escopo de aplicação do código Rust e, no fim, até reimplementar em Rust parte de funcionalidades centrais
Série experimental de patches
- O varint.c foi escolhido como primeiro módulo a receber Rust
- É muito simples e não tem dependências
- Permite validar a interop entre C ↔ Rust
- Dá para experimentar sem impactar o conjunto de funcionalidades do Git
- Todos os testes passaram na versão
varint.rs
Mudanças no sistema de build
- Atualmente, o suporte a Rust foi adicionado apenas ao sistema de build Meson
- No futuro, também há planos de adicionar suporte a Rust no Makefile
- Também será preciso preparar trabalhos relacionados ao CI
- Validação de build e funcionamento com Rust
- Garantia de consistência do estilo de código com
cargo format
- Outras automações de tooling e manutenção
Próximos passos
- Este trabalho está mais focado em experimentar o processo de adoção do que nos recursos de Rust em si
- Depois, mais funcionalidades internas do Git, incluindo o módulo xdiff, poderão ser reescritas em Rust
- A ideia é expandir gradualmente o uso de Rust e levar todo o ecossistema a se adaptar a um ambiente de build baseado em Rust
Implicações
- O Git está se preparando para a transição de linguagem mais importante de sua história
- Tornar Rust obrigatório pode garantir segurança, manutenibilidade e potencial de evolução de longo prazo
- Para distribuidores e desenvolvedores, montar um ambiente de desenvolvimento Rust passará a ser essencial no ecossistema do Git
1 comentários
Comentários do Hacker News
Link para a discussão relacionada
Como o suporte a Rust também é para uma linguagem sem um padrão formal, suspeita que com o tempo a implementação pode ficar bastante defasada, como aconteceu no passado com Java
O Git já parece ser uma ferramenta bastante madura, precisando apenas de manutenção e melhorias, e não parece haver necessidade de uma grande quantidade de código novo a ponto de justificar a introdução de uma nova linguagem
Ao contrário do Linux, que precisa continuamente de novos drivers, não vê um motivo equivalente no Git
Gostaria que alguém explicasse se há algo que ele não está percebendo
As mudanças no Git podem ser vistas nas RelNotes ou, de forma mais acessível, na categoria Git do blog do GitHub
No caso do git-branchless, há recursos como merge em memória escritos em Rust
Há mais conteúdo relacionado a Rust nessa mailing list
(Não está avaliando diretamente se é bom ou ruim; apenas diz que alguém provavelmente fará isso)
Quase ninguém quer desenvolver Git em C, enquanto desenvolvedores interessados em reescrevê-lo em Rust demonstram entusiasmo para participar
O Git é maduro e não parece que muito código novo será adicionado
Rust é muito mais complexa que C
Se realmente forem necessários recursos de orientação a objetos, usar algo como C++98 já seria muito mais simples e fácil de entender do que C++ moderno ou Rust
Rust não será obrigatório para futuros patches, e sim no sistema de build
Se estiver errado, ainda pode corrigir de novo
Quer saber se isso é necessário para compilar o próprio sistema de build ou se também será obrigatório para compilar a aplicação
Investiu muito no Git e criou vários projetos, então não quer perder a possibilidade de hackear o Git
Na prática, Rust é mais fácil de aprender do que C “comum” (especialmente C cheio de bugs), e certamente mais fácil do que entender o código-fonte do Git ou do Linux
Segundo o GitHub, é 50% C, 38% Shell, 4% Perl, e o restante TCL/Python etc.
Perl/TCL é que são mais excepcionais
Conforme o projeto cresceu, acumulou muitos hacks espalhados, e agora chegou a hora de melhorar segurança/desempenho e limpar hacks antigos
Considera Rust adequada para isso
Acha que o fato de o Git usar um pouco de Rust não vai atrapalhar o desenvolvimento de clientes ou servidores Git feitos por ele mesmo
As notas de lançamento do Debian também mencionam problemas relacionados a pacotes Rust/Go
Ao compilar pacotes Rust, rebuilds frequentes são necessários por causa de problemas com linkagem estática, o que causa inconvenientes no uso prático
Se o lado do Rust continuar ignorando a questão essencial de ABI estável/bibliotecas compartilhadas para sistemas Linux, isso pode acabar gerando mais reclamações do que C
Acha que seria preciso mais cautela em arquiteturas de software de grande porte
Se procurar pela palavra-chave NonStop neste artigo, verá um exemplo
Em grupos como o RESF, costuma-se dizer que “a plataforma não suporta Rust”, mas, na prática, o que precisa existir é suporte do compilador Rust para que funcione de fato
O git parece estabilizado na série 2.x, então não vê motivo para quebrar compatibilidade
Questiona se a cultura de desenvolvimento recente não se afastou desse tipo de uso de toolchain
Controle de versão, build e ambiente de execução eram diferentes entre si, exigindo cópia remota ou execução remota, e as regras de build precisavam necessariamente detectar a plataforma de destino
Com apenas a flag
--target, é possível compilar para cerca de 100 plataformas sem grandes problemasAcha que o problema real é que parte dos desenvolvedores do Git insiste em manter as limitações de suas máquinas de desenvolvimento antigas/fixas
Cross-compilation sempre foi tratada como cidadã de segunda classe, e em projetos externos nem se espera que funcione direito
Há distribuições Linux que, no caso de Raspberry Pi etc., só constroem no hardware real
Por isso, ninguém se esforça de fato para dar suporte adequado a isso
O Linux é especialmente problemático, porque a estrutura do glibc envelheceu a ponto de tornar difícil mirar até mesmo uma versão mínima de glibc em qualquer hardware
A maioria dos projetos nem sequer tenta oferecer suporte a cross-compilation
O Zig está tentando melhorar isso
Como o Git é uma ferramenta central do projeto, vê risco alto na mudança e considera perigoso torná-la uma dependência obrigatória em um prazo curto, como seis meses
Essa complexidade existe para capturar mais erros em tempo de compilação, mas, como resultado, a própria linguagem se torna bastante complexa
Por isso, não recomenda sua adoção
Também acha que o kernel rejeitou Rust pela mesma razão
Acrescentar um sistema de tipos no nível de Haskell e um sistema de macros no nível de Lisp a um kernel já complexo aumentaria ainda mais a complexidade
Rastrear código Rust via serde é difícil
Em contraste, o Unmarshal do Go é muito mais fácil de rastrear
Isso porque elas permitem carregar mais informação no compilador
Nunca tive grandes problemas com Serde; na verdade, já precisei depurar o Unmarshal do Go com mais frequência
A alegação de que o kernel rejeitou Rust também não corresponde aos fatos; na prática, foi um conflito entre dois desenvolvedores sobre onde armazenar headers
Rust tem uma barreira de entrada mais alta que C, mas a distância entre “o mínimo de Rust” e “Rust rápido e seguro” é muito menor do que em C
Consideram isso tão importante quanto o borrow checker
A sintaxe também é tolerante
O kernel Linux, na verdade, não rejeitou Rust