Case Uber — Como a Uber Usa Zig para Compilação Cruzada em Escala
A Uber, uma das maiores empresas de tecnologia do mundo com operações em mais de 70 países, adotou o Zig como parte fundamental de sua infraestrutura de build. Esta decisão, que pode parecer surpreendente à primeira vista, demonstra como o Zig resolve problemas reais de engenharia que vão além de simplesmente escrever código na linguagem.
O Problema
A Uber opera centenas de microsserviços, muitos deles escritos em C e C++, que precisam ser compilados para múltiplas plataformas e arquiteturas. A infraestrutura da empresa inclui:
- Servidores x86_64 em data centers
- Dispositivos ARM para IoT e edge computing
- Diferentes distribuições Linux com versões variadas de glibc
- Necessidade de builds reproduzíveis e determinísticos
O Desafio da Compilação Cruzada em C/C++
Antes do Zig, a compilação cruzada de projetos C/C++ na Uber envolvia:
- Múltiplas toolchains: Cada combinação de target/host exigia uma toolchain específica (gcc-aarch64-linux-gnu, clang com sysroot customizado, etc.)
- Sysroots complexos: Manter sysroots com as bibliotecas corretas para cada distribuição Linux alvo
- Reprodutibilidade: Garantir que o mesmo código fonte produzisse o mesmo binário em diferentes máquinas de build
- Manutenção: Atualizar toolchains, resolver conflitos de versão de bibliotecas e manter compatibilidade ABI
O time de infraestrutura de build da Uber estimou que gastava milhares de horas por ano lidando com problemas de toolchain.
A Solução: Zig como Compilador C/C++
O compilador Zig inclui um driver de compilação C/C++ integrado que pode substituir gcc e clang para compilação de código C e C++. Esse recurso, frequentemente descrito como “zig cc”, oferece compilação cruzada nativa sem necessidade de toolchains externas.
Como Funciona
# Compilar código C para Linux x86_64
zig cc -target x86_64-linux-gnu main.c -o app
# Compilar para Linux ARM64
zig cc -target aarch64-linux-gnu main.c -o app-arm
# Compilar código C++ para qualquer target
zig c++ -target x86_64-linux-gnu.2.17 app.cpp -o app
# Especificar versão de glibc
zig cc -target x86_64-linux-gnu.2.28 main.c -o app
O zig cc é um drop-in replacement para gcc/clang que:
- Inclui sysroots para todas as versões de glibc suportadas
- Suporta compilação cruzada para ~40 targets sem configuração
- Produz binários determinísticos
- Integra-se com sistemas de build existentes (CMake, Make, Bazel)
Integração com CMake na Uber
# CMakeLists.txt
set(CMAKE_C_COMPILER "zig cc")
set(CMAKE_CXX_COMPILER "zig c++")
set(CMAKE_C_COMPILER_TARGET "aarch64-linux-gnu.2.28")
set(CMAKE_CXX_COMPILER_TARGET "aarch64-linux-gnu.2.28")
# Build de linha de comando
cmake -DCMAKE_TOOLCHAIN_FILE=zig-toolchain.cmake ..
make -j$(nproc)
Integração com Bazel
A Uber usa extensivamente o Bazel como sistema de build. A integração com Zig foi implementada como uma toolchain customizada:
# BUILD.bazel
zig_cc_toolchain(
name = "zig_cc_linux_aarch64",
target = "aarch64-linux-gnu.2.28",
zig_path = "/usr/local/bin/zig",
)
cc_binary(
name = "meu_servico",
srcs = ["main.cc", "server.cc"],
toolchains = ["//toolchains:zig_cc_linux_aarch64"],
)
Resultados Obtidos
Redução de Complexidade
- Eliminação de toolchains externas: Substituição de dezenas de toolchains por um único binário Zig
- Configuração simplificada: Novos engenheiros configuram o ambiente de build em minutos, não horas
- Manutenção reduzida: Uma ferramenta para atualizar em vez de dezenas
Performance de Build
- Builds 15-20% mais rápidos: O driver de compilação do Zig é otimizado para speed
- Cache eficiente: Builds determinísticos melhoram hit rate de cache distribuído
- Paralelismo: O sistema de build do Zig gerencia paralelismo automaticamente
Reprodutibilidade
- Builds determinísticos: O mesmo código fonte sempre produz o mesmo binário
- Independência de host: Builds idênticos em Ubuntu, CentOS, macOS ou CI
- Auditabilidade: Facilita compliance e auditoria de segurança
Economia de Infraestrutura
- Redução de máquinas de build: Menos configurações de build necessárias
- Menor tempo de CI: Builds mais rápidos significam pipelines mais curtos
- Menos incidents de build: Eliminação de problemas de toolchain incompatível
Detalhes Técnicos
Compatibilidade de glibc
Um dos maiores problemas em compilação cruzada Linux é a compatibilidade de glibc. O Zig resolve isso incluindo suporte a múltiplas versões de glibc (de 2.17 a 2.38):
# Compilar para servidor com glibc antiga
zig cc -target x86_64-linux-gnu.2.17 server.c
# Compilar para sistema com glibc recente
zig cc -target x86_64-linux-gnu.2.38 server.c
Suporte a Link-Time Optimization (LTO)
zig cc -flto -O2 -target x86_64-linux-gnu file1.c file2.c -o app
Static Linking Confiável
# Linkage estático com musl libc
zig cc -target x86_64-linux-musl main.c -o app-static
Impacto no Ecossistema Zig
A adoção pela Uber teve impactos significativos:
- Visibilidade: Uma das primeiras validações empresariais em larga escala do Zig
- Contribuições upstream: A Uber contribuiu com fixes e melhorias para o compilador
- Case study: Inspirou outras empresas a avaliarem o Zig como toolchain
- Financiamento indireto: O sucesso contribuiu para a sustentabilidade do projeto Zig
Lições Aprendidas
Para Empresas
- Adoção incremental funciona: A Uber começou usando apenas o
zig cc, sem reescrever código - ROI claro: Redução mensurável em tempo de build e incidents
- Low risk: Usar Zig como compilador C/C++ não requer migração de linguagem
Para Desenvolvedores
- Zig resolve problemas reais: Compilação cruzada é um problema concreto de engenharia
- A toolchain é tão importante quanto a linguagem: Muitas adoções começam pela toolchain
- Contribua upstream: Bugs encontrados em produção beneficiam toda a comunidade
Como Começar
Se sua empresa enfrenta desafios semelhantes de compilação cruzada:
- Instale o Zig com zigup
- Substitua
gccouclangporzig ccem um projeto piloto - Teste compilação cruzada para seus targets de produção
- Integre com seu sistema de build existente (CMake, Make, Bazel)
- Escale gradualmente para mais projetos
Próximos Passos
Conheça outros cases de sucesso como Cloudflare e Bun. Explore o sistema de build do Zig e consulte nossos tutoriais para começar a experimentar com compilação cruzada.