- Empresa (não divulgada) que atende centenas de milhões de usuários e usa C e C++ em sistemas centrais
- Ao longo de 2023, houve discussões sobre qual linguagem adotar entre Rust e Zig
- Principais fatores considerados:
- Interoperabilidade com C
- Escalabilidade de engenharia (contratação, manutenção etc.)
- Escolha final: Zig
- Compartilho isso porque acho que o processo de escolha mostra bem os "fatores considerados quando o código roda em vários alvos e afeta centenas de milhões de usuários" em uma grande empresa
A importância da interoperabilidade com C
- A biblioteca que se queria reescrever provavelmente seria usada em todas as plataformas (web, mobile, headsets de VR, consoles de jogos, desktop etc.)
- Por isso, oferecer uma API em C e usá-la via FFI era a única forma de garantir execução em todas as plataformas
Principais pontos de discussão
Rust
- Na época, era mais de 25 vezes mais popular que Zig (com base em pesquisas e no subreddit)
- Estava estável havia mais tempo
- O apoio industrial à Rust Foundation parecia estável
- Excelente LSP e experiência para desenvolvedores
- Cargo: gerenciador de pacotes de nível líder no setor
- Segurança de memória e "ausência de comportamento indefinido" (não é totalmente verdade, mas foi mencionado na discussão)
- Para sair do C++, Rust parecia mais adequado por não permitir erros de memória nem possibilidades de comportamento indefinido
- Suporte a SIMD na versão
nightly
- Suporte a WASM tão fluido quanto o do Zig
- Em desempenho, equivalia ao Zig ou, em alguns casos, era "consideravelmente mais rápido"
Interoperabilidade com C no Rust:
- Rust tem um ecossistema próprio muito rico, então a importância da interoperabilidade com C é relativamente menor
- Ótimo potencial de integração com linguagens de mais alto nível, como bindings para Python
- Havia o argumento de que as vantagens de usar Rust compensavam as desvantagens de fornecer bindings em C
Zig
- Fácil de aprender para desenvolvedores com background em C/C++ ou TypeScript
- Proporciona uma experiência de programação prazerosa para quem vem de C
- O compilador do Zig também compila C e C++, o que ajuda no gerenciamento de dependências e na construção de bibliotecas com ABI de C
- Suporte muito fácil a várias plataformas-alvo (o comando
zig targets recebeu muitos elogios)
- É fácil escrever software rapidamente (suporte nativo a
Vector, uso de SIMD etc.)
- Compatível com depuradores existentes
- Excelente sistema de build (uma melhoria de 100x em relação ao Makefile existente)
- Alta transparência financeira da Zig Software Foundation
- Possibilita portar gradualmente o código C++ existente e "zigificar" o projeto
- Resolve com segurança os problemas de linkedição/compilação para todas as plataformas-alvo
Conclusão
- Zig reduz bastante o tempo e o esforço necessários para portar a base de código existente e garantir compatibilidade com todas as plataformas
- Fatores decisivos inesperados:
- Facilidade de aprendizado e contratação tiveram impacto maior do que o esperado (a favor do Zig)
- A experiência do desenvolvedor relacionada ao toolchain teve papel importante
- O compilador e o sistema de build do Zig ajudaram muito por causa da compatibilidade com a base de código existente
- O ecossistema, a comunidade e as garantias de segurança de memória do Rust tiveram menos impacto do que se imaginava
10 comentários
Gostei muito do texto, foi uma leitura divertida! Eu estava pesquisando sobre node, bun e deno, e acabei vendo que o bun foi escrito em uma linguagem desconhecida para mim chamada zig, então fiquei curioso para saber que linguagem era — foi ótimo ter esta prévia!
Um grande problema no Zig é que, quando há um erro no código escrito pelo usuário durante a compilação, ele não informa a localização exata nem detalhes precisos. Parece que ele só mostra informações até a biblioteca padrão.
Ao ler os pontos considerados, os tópicos de discussão e a conclusão, parece que desde o início nem era um ambiente que realmente precisasse de Rust. Você já viu algum entregador de comida dirigindo um off-road para fazer entregas?
Tem que desenvolver em linguagem nativa, claro, mas se não for um trabalho crítico em termos de memória, o certo é escolher o lado que é mais prático para desenvolver. Nem precisava passar um ano inteiro discutindo isso...
Dezenas de milhões de usuários como público-alvo....
Fiquei curioso para saber que empresa é essa. Parece uma empresa que não fica presa a procedimentos formais como certificações... inveja...
Costumo dar uma olhada no Zig uma vez por ano, e parece que quase todo ano houve alguma breaking change;;
Além disso, a própria linguagem não vem com uma biblioteca pronta para filas ou passagem de mensagens entre threads, então, em comparação com a maturidade do Rust, ainda parece ter um longo caminho pela frente.
Claro, se o usuário conhecer muito bem as APIs do sistema operacional, talvez isso não seja um grande problema…
Rust é mais de 25 vezes mais popular que Zig, mas parece que, para conseguir emprego, Zig leva vantagem.
Acho que é por causa do item 1: desenvolvedores com experiência em C/C++ ou TypeScript conseguem aprender com facilidade.
Proporciona uma experiência de programação prazerosa para desenvolvedores com background em C
É fácil escrever software rapidamente (suporte nativo a Vector, uso de SIMD etc.)
Lembra a sensação de quando aprendi Python pela primeira vez
Eu estava me perguntando por que escolheram justamente Zig ao ver o Bun sendo desenvolvido nessa linguagem, e graças a um bom texto comparando com Rust agora entendo. Dito isso, parece que a linguagem C realmente será eterna.