Case Uber — Como a Uber Usa Zig para Compilação Cruzada em Escala

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:

  1. Múltiplas toolchains: Cada combinação de target/host exigia uma toolchain específica (gcc-aarch64-linux-gnu, clang com sysroot customizado, etc.)
  2. Sysroots complexos: Manter sysroots com as bibliotecas corretas para cada distribuição Linux alvo
  3. Reprodutibilidade: Garantir que o mesmo código fonte produzisse o mesmo binário em diferentes máquinas de build
  4. 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
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:

  1. Visibilidade: Uma das primeiras validações empresariais em larga escala do Zig
  2. Contribuições upstream: A Uber contribuiu com fixes e melhorias para o compilador
  3. Case study: Inspirou outras empresas a avaliarem o Zig como toolchain
  4. 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:

  1. Instale o Zig com zigup
  2. Substitua gcc ou clang por zig cc em um projeto piloto
  3. Teste compilação cruzada para seus targets de produção
  4. Integre com seu sistema de build existente (CMake, Make, Bazel)
  5. 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.

Continue aprendendo Zig

Explore mais tutoriais e artigos em português para dominar a linguagem Zig.