- Agora, para o alvo x86_64, o backend x86 próprio do Zig passa a ser aplicado por padrão no modo debug
- Em comparação com a base anterior em LLVM, ele alcançou mais testes de comportamento aprovados e compilação mais rápida
- Com a adoção do backend próprio, o Zig obteve grande redução no tempo de compilação e aumento de eficiência em algumas tarefas
- Também avançaram vários reforços de recursos, como o sistema de build recentemente aprimorado, a expansão do suporte a sistemas BSD e melhorias no runtime do UBSan
- A biblioteca padrão e as ferramentas próprias otimizadas destacam a competitividade exclusiva do Zig
Resumo das principais novidades mais recentes
8 de junho de 2025 – backend x86 self-hosted passa a ser o padrão no modo debug
- No alvo x86_64, agora o backend x86 próprio do Zig é usado por padrão
- Antes, era usado o LLVM para converter bitcode em arquivo objeto
- No Windows, a mudança foi adiada porque ainda há trabalho adicional necessário no linker COFF
- O backend x86 do Zig passou em 1.987 testes de comportamento, mostrando estabilidade superior à do backend LLVM (1.980)
- O total de testes é 2.084, mas alguns se sobrepõem aos próprios testes do LLVM, então a verificação adicional é feita apenas ao testar o backend próprio
- O principal motivo para o Zig focar no desenvolvimento de um gerador de código próprio é superar amplamente o LLVM em velocidade de build
- Nos resultados de benchmark, o tempo médio de build de
zig build-exe hello.zig -fllvm (usando LLVM) foi de 918 ms, enquanto o backend próprio registrou 275 ms
- É possível confirmar grandes melhorias em todos os aspectos, incluindo uso de memória, ciclos de CPU, número de instruções e cache misses
- O tempo de build de projetos grandes, como o próprio compilador Zig, também caiu de 75 segundos para 20 segundos
- Para o futuro, estão previstos a paralelização completa da geração de código, reforços nas capacidades de linking e o desenvolvimento do backend aarch64
- A introdução de um novo passe Legalize também deve acelerar o trabalho em aarch64
- As mudanças mais recentes podem ser experimentadas diretamente nas builds mais atuais da branch master do Zig
6 de junho de 2025 – vídeo de apresentação do sistema de build
- Foi publicado um vídeo-guia no YouTube para iniciantes no sistema de build do Zig
- Ele explica como criar módulos e pacotes Zig e como importá-los em outros projetos
- Mais vídeos sobre o sistema de build também devem ser adicionados continuamente como parte da série
20 de maio de 2025 – suporte reforçado a alvos FreeBSD e NetBSD
- Com a fusão dos Pull Requests #23835 e #23913, passou a ser possível compilar binários para os alvos FreeBSD 14.0.0+ e NetBSD 10.1+ com
zig cc e zig build
- A estratégia de extrair informações da libc e de bibliotecas relacionadas, antes aplicada no glibc, foi estendida também à família BSD
- Os arquivos
abilists gerados são distribuídos junto com o Zig, permitindo criar bibliotecas stub que correspondem com precisão a cada biblioteca libc durante a compilação cruzada
- Os headers do sistema e da libc também são fornecidos com base na versão mais recente do sistema operacional
- OpenBSD, Dragonfly BSD, SerenityOS, Android e Fuchsia também estão na mira de suporte
9 de abril de 2025 – site oficial do Zig passa a ser construído como um Zine standalone
- A estrutura do site oficial do Zig agora foi alterada para ser construída como um Zine standalone
- Ele evoluiu de um script de build existente para um único executável
- O texto indica que este é um bom momento para experimentá-lo diretamente
Notícias de release e melhorias de recursos
- O release 0.14.0 deve ser distribuído em breve, e melhorias notáveis já foram aplicadas
- Com melhorias na interoperabilidade com C e no runtime do UBSan (Undefined Behavior Sanitizer), erros SIGILL antes ambíguos passaram a ser substituídos por mensagens de erro específicas e úteis
- Exemplo: o local e a causa de um overflow de inteiro com sinal são mostrados claramente, aumentando muito a eficiência de depuração
- Limitações restantes do UBSan:
- Sem suporte para verificação de tipo dinâmico e ciclo de vida relacionados a vptr em C++
- A indicação precisa de localização para atributos como
assume_aligned e __nonnull ainda não foi concluída
7 de fevereiro de 2025 – inovações no debug allocator e no SmpAllocator
- O debug allocator foi redesenhado para oferecer suporte ao reconhecimento do tamanho de página em runtime e refletir diversas otimizações
- Redução na criação de memory maps, remoção de repetições desnecessárias de memset 0xaa/0x00 e eliminação de estruturas de dados de busca e trip
- Os metadados são armazenados inline dentro da página, facilitando a implementação de erros de compilação e validação
- Em comparação com o malloc tradicional baseado em C, houve ganho de legibilidade e manutenibilidade
- Com o desenvolvimento do SmpAllocator, otimizado para ambientes concorrentes, a eficiência de execução da alocação de memória em ambientes multi-thread foi maximizada
- Benchmarks comparando com o glibc comprovaram na prática a velocidade e a eficiência no uso de recursos
- Como resultado, isso é avaliado como um importante ponto de virada em que a usabilidade do Zig supera C e libc
24 de janeiro de 2025 – ambiente de depuração dedicado ao Zig
- Jacob desenvolveu um fork do LLDB (depurador) para Zig, reforçando o suporte de depuração do backend próprio
- A forma de compilar e usar o fork do LLDB é fornecida em documentação na wiki
- Desenvolvedores que usam o backend próprio do Zig podem aproveitar um ambiente de depuração mais refinado com essa ferramenta
Conclusão
- O Zig segue promovendo mudanças inovadoras com foco principal em ganho de desempenho, eficiência de build e maior conveniência para depuração
- Está garantindo competitividade diferenciada em algoritmos independentes, compilador e também nas ferramentas de build/runtime
- Incluindo suporte a várias plataformas como BSD, melhorias em mensagens voltadas ao usuário e inovação no modelo de memória, o projeto continua entregando avanços realmente úteis para profissionais de engenharia de software
1 comentários
Comentários do Hacker News
Pelo que sei, o Zig está trabalhando diariamente em vários recursos para melhorar a experiência de desenvolvimento. Por exemplo, recentemente houve este PR. No passado, hot code swapping também estava nos planos de desenvolvimento do Zig e, nesse ritmo, imagino que esse recurso possa estar disponível em x86_64 dentro de um ano. Pessoalmente, o maior incômodo que sinto é a velocidade do
comptime. Houve um experimento rodando uma DSL de brainF** em tempo de compilação, e foi realmente muito lento (mas foi um experimento divertido). Fico curioso para saber quando essa parte do compilador vai melhorar. Também estou muito empolgado com os novos backends, e quero até tentar criar meu próprio backend URCL para Zig 😉Sobre melhorar o desempenho do comptime, já sabemos o que precisa ser feito e até começamos um branch relacionado há bastante tempo. Mas isso exige retrabalhar o código de análise semântica em uma escala significativa, então, embora seja uma das tarefas importantes, ainda disputa prioridade com outras coisas
Hot code swapping é um recurso que pode causar uma transformação enorme no desenvolvimento de jogos. Acho impressionante que no Zig isso esteja planejado para ser suportado basicamente por uma flag do compilador. Com clang, é algo que mal dá para tentar
Não olhei URCL a fundo, mas isso está me levando para outra toca de coelho. Fico imaginando um cenário realmente bizarro em que um IR criado para Minecraft acabe virando um alvo real de compilação de uma linguagem
Fico curioso se criar backends customizados é fácil. Ainda não tentei pessoalmente, mas tenho vontade de fazer um experimento de backend que receba AIR e produza relatórios de segurança de memória (por exemplo, checando uso de valores indefinidos, escape de ponteiro de stack, use-after-free, double free, alias xor mut etc.)
Tenho curiosidade se comptime lento é realmente um problema. Estou fazendo uma biblioteca JSON-RPC e, em tempo de compilação, uso bastante comptime para despachar JSON para funções arbitrárias. Como com a tipagem estática forte do Zig não é possível fazer despacho dinâmico em runtime para funções com parâmetros arbitrários, acabei tendo que gerar, em tempo de compilação, um mapeamento dos tipos das funções. O que me preocupa é que isso inevitavelmente aumenta o tamanho do binário, porque o código comptimado é copiado para cada função
Só de já ter chegado até esse ponto, já é um feito impressionante. Como foi dito no devlog, o que vem pela frente parece ainda mais promissor. A ideia de o compilador alterar apenas as partes necessárias do binário na hora de buildar parece algo novo e radical, e graças ao projeto Zig isso agora virou uma meta viável. Tempos muito interessantes pela frente
O gerenciamento de pacotes do Zig é mais manual do que no Rust. Você busca diretamente a URL do pacote na CLI e importa o módulo no script de build. A vantagem disso é que até arquivos compactados arbitrários podem ser usados facilmente como dependências, e muitos pacotes de bibliotecas C para Zig simplesmente conectam releases untouched (tarball) diretamente no script de build. Mas para iniciantes isso pode ser um pouco complicado
No caso do SDL3, há dois caminhos: o wrapper nativo em Zig (https://github.com/Gota7/zig-sdl3) e o https://github.com/castholm/SDL, que é uma versão mais simples que "zigifica" a biblioteca/API em C
O QuickJS suporta apenas a API C (https://github.com/allyourcodebase/quickjs-ng)
O Zig facilita muito o uso direto de pacotes em C, mas como a tipagem é rígida, pode ser necessário fazer casts de tipo com frequência ao lidar com a API
O compilador D dmd consegue compilar a si mesmo em cerca de 18,4 segundos em build de debug.
Meu processador é um AMD Athlon 64 X2 (4400+) bem antigo, mas roda tão rápido que eu ainda nem fiz upgrade
(inclui uma lista detalhada das informações da CPU)
Fico curioso se existe um guia para compilar o Zig em 20 segundos para ter um ciclo de desenvolvimento rápido. Da última vez que compilei Zig, havia vários estágios envolvidos (principalmente o bootstrap em WASM), então levava bastante tempo
É impressionante que o Zig consiga compilar a si mesmo em 75 segundos mesmo ainda usando LLVM
Não tenho nenhuma intenção de exigir demais do Zig, e sei muito bem que é open source, mas o que mais me interessa é um cronograma realista para o lançamento 1.0.
O Zig é quase exatamente a linguagem que eu sempre quis em uma linguagem de baixo nível, e agora só estou esperando a estabilização.
E realmente admiro a filosofia de design minimalista do Zig
Como completo iniciante, fico curioso sobre quais são as vantagens do Zig em comparação com outras linguagens. Eu o entendo como um C mais moderno, mas queria saber o que exatamente há de “moderno” nele
switchdefereerrdeferpara implementar limpeza automática no retorno da função ou em caso de erro@typeInfoetc.)GeneralPurposeAllocator(para iniciantes), fica mais fácil rastrear vazamentos de memóriaEu nunca me dei muito bem com C, e sempre senti uma barreira de entrada para programação de baixo nível por causa de várias coisas pouco razoáveis e pouco intuitivas da linguagem. O Zig foi a primeira linguagem que me fez sentir diversão e interesse de verdade por programação de sistemas
Fico curioso se existe um guia para compilar o Zig em 20 segundos. Queria acelerar o ciclo de desenvolvimento, mas já tive a experiência de achar difícil contribuir porque stage1/2/3 demoravam bastante para compilar
Se ao compilar um hello world com
zig initno Zig o resultado dá 9,3 MB, usar a flag-Doptimize=ReleaseSmallreduz isso para 7,6 KBÉ uma diferença de mais de 1000 vezes com uma única flag
-OReleaseSmall -fno-stripdá 580 KB, e-ODebug -fstrippode chegar a 1,4 MBCom o backend x86 do Zig, existe um fork do LLDB específico para Zig que oferece uma experiência de depuração muito melhor
Não lembro se hoje já é possível depurar a lógica de comptime passo a passo, mas isso foi tema de discussão recente
Acho que a Julia poderia considerar Zig como compilador para obter vantagens de desempenho. Também me lembro da ansiedade dos desenvolvedores de Julia a cada release por medo de regressões de performance
A Julia, na prática, é fortemente acoplada ao LLVM. Várias partes do ecossistema dependem da existência de LLVM intrinsics, autodiff (Enzyme), compilação para GPU etc.
O compilador está se tornando bem retargetable, e essa área também está sendo pesquisada ativamente agora.
No futuro, dá para imaginar o Zig como compilador alternativo para partes da linguagem
Há quem diga que o próprio LLVM é a API pública da Julia. Na prática, existem até macros como
@code_llvmque mostram diretamente o IRCertamente ajudaria a reduzir o tempo de compilação, mas a Julia ainda tem muito trabalho pela frente
Há espaço para granular melhor o cache de compilação, criar tooling para evitar invalidation, remover a otimização de world splitting, usar mais multithreading no compilador, fazer pré-compilação automática para certas assinaturas e até compilar/trocar código em hot swap de forma lazy
Isso é um avanço enorme para o Zig, e acho que será uma das principais formas de diferenciação em relação ao Rust daqui para frente. Aliás, fui eu quem escreveu a maior parte do código de renderização da ferramenta de análise de performance, então fico feliz em ver meu código sendo usado amplamente online
link do projeto poop
Veja rustc_codegen_cranelift
Acho que isso é justamente uma das pré-condições para trazer de volta o recurso de async/await no Zig
Vale ver também o FAQ oficial do Zig sobre async
Essa parte já está toda mapeada, e devemos conseguir divulgar uma atualização interessante nos próximos 2 ou 3 meses. Estamos praticamente refazendo toda a camada de I/O, como se estivéssemos criando a biblioteca padrão de novo
Pelo que diz o link, parece que o async pode nem voltar, ou pelo menos continua sendo algo fora de cogitação até 2028