6 pontos por GN⁺ 2025-04-21 | 1 comentários | Compartilhar no WhatsApp
  • O recurso comptime de Zig oferece uma avaliação em tempo de compilação muito poderosa, mas é intencionalmente limitado
  • Ao executar código em tempo de compilação, não é possível acessar informações do host, o que resulta em um design adequado para compilação cruzada
  • Geração dinâmica de código, DSLs, RTTI, I/O etc. não são suportados; em vez disso, usa-se especialização explícita de código baseada em tipos
  • RTTI pode ser implementado manualmente, reconstruindo informações de tipo que existem apenas em tempo de compilação para uso em tempo de execução
  • É possível criar novos tipos com comptime, mas não expandir APIs; não é possível adicionar métodos definidos pelo usuário

O que o comptime de Zig não faz

  • Embora o comptime de Zig ofereça recursos poderosos para genéricos, compilação condicional, serialização, ORM e mais, algumas funcionalidades são explicitamente limitadas
  • Paradoxalmente, essas limitações tornam o design de Zig mais simples e previsível
  • Sem acesso a informações do host (No Host Leakage)

    • O código de comptime opera com base na plataforma de destino, não no sistema onde o código está sendo executado
    • Em Zig, em tempo de compilação, não é possível usar informações do sistema host, como endianness e tamanho de ponteiro
    • O objetivo é garantir segurança levando em conta a compilação cruzada
    • No código de exemplo, a saída dos bytes de um número no formato BF16 varia conforme a plataforma de destino
  • Sem geração de código baseada em strings (No #eval)

    • Zig não oferece recursos para gerar código dinamicamente, como o #include de C, os mixins da linguagem D ou as macros de Rust
    • Em vez disso, há suporte a avaliação parcial (partial evaluation) baseada em argumentos comptime
    • Se certos argumentos forem conhecidos em tempo de compilação, apenas aquele ramo permanece, permitindo otimização de código
  • Sem extensão de sintaxe para DSLs (No DSLs)

    • Em Zig, ao contrário de Lisp ou Rust, não existe recurso para criar sintaxe personalizada pelo usuário
    • Todos os dados só podem ser passados na forma de valores dentro da sintaxe de Zig
    • DSLs restritas, como strings de formatação (printf), só podem ser implementadas por meio de strings comptime
  • Sem informação de tipo em tempo de execução (No RTTI)

    • Zig pode se comportar como linguagens dinâmicas, como Python, mas as informações de tipo existem apenas em comptime
    • Para funcionar também em tempo de execução, é preciso definir manualmente uma struct de RTTI e manipulá-la com ponteiros
    • Ex.: definir uma struct RTTI com nomes e offsets dos campos de uma struct e acessar os campos por ponteiro
  • Sem criação de nova API (No New API)

    • Em Zig, é possível criar novos tipos com comptime, mas não é possível adicionar métodos a esse tipo
    • Não é possível expandir a API como em macros derive do Rust
    • Ao implementar serialização JSON, não dá para adicionar um método .to_json(); em vez disso, usa-se uma função global que recebe o tipo como argumento
  • Sem I/O em tempo de compilação (No IO)

    • O comptime de Zig proíbe o acesso a recursos externos, como sistema de arquivos, rede e banco de dados
    • Com isso, reprodutibilidade, segurança e aproveitamento de cache aumentam
    • Se I/O for necessário, usa-se o sistema de build build.zig para importar código Zig gerado previamente
  • Resumo: El Disco (equilíbrio entre abstração e simplicidade)

    • Zig oferece metaprogramação poderosa, mas assegura previsibilidade por meio de um design bastante restritivo
    • Graças a essas limitações, o comptime de Zig continua prático e fácil de entender
    • Mesmo sem abstrações complexas, ele é útil na prática e executa com clareza apenas as funcionalidades declaradas

1 comentários

 
GN⁺ 2025-04-21
Opiniões no Hacker News
  • O comptime do Zig tem características únicas

    • substitui vários recursos encontrados em outras linguagens
    • é fácil de entender por ter transparência referencial
    • oferece recursos poderosos por meio de introspecção
    • permite escrever código simples e poderoso de uma forma diferente de Lisp
    • são raras as linguagens com um novo design e uma nova abordagem
  • Desvantagens do comptime do Zig e soluções

    • gera código com zig build e depois compila usando @import
    • oferece mais liberdade e tempo de execução ilimitado, mas não dá liberdade para gerar tipos Zig como valores na compilação atual
    • é semelhante à experiência passada de conectar Perl e Tcl com C
    • a atitude autocrítica da comunidade Zig às vezes é desconcertante
  • A expressão em espanhol citada na história de Borges é sobre um deus norueguês

  • Flexibilidade do comptime

    • quando é necessário ter informações de tipo durante o trabalho, isso pode ser adicionado aos parâmetros da função
    • quando não é possível fornecer o tipo em determinadas situações, é preciso resolver um problema de design
  • Pontos pelos quais o comptime do Zig é famoso

    • fornece vários recursos, como genéricos, compilação condicional, subtipagem, serialização e ORM
    • outras linguagens também têm recursos semelhantes de avaliação em tempo de compilação
  • Post de blog educativo

    • explica a diferença entre comptime for e inline for
    • a versão inline só consegue conhecer o comprimento em comptime
  • Opiniões positivas sobre a linguagem e as ferramentas Zig

    • seria bom se houvesse um modo seguro como o do Rust
    • está em um estágio muito mais avançado do que C/C++
    • o compilador Zig causa profunda impressão
  • Pontos interessantes sobre o comptime do Zig

    • a capacidade de representar tipos como valores em tempo de compilação
    • permite implementar algo próximo de linguagens dinâmicas ou reflexão em tempo de execução sem overhead em runtime
  • Confusão sobre execução de código em tempo de compilação

    • dúvida sobre se o código de tempo de compilação realmente roda na máquina host local
    • curiosidade sobre por que o Zig esconde a plataforma host
    • opinião positiva sobre o recurso de cross-compile do Zig