- 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
Opiniões no Hacker News
O
comptimedo Zig tem características únicasDesvantagens do
comptimedo Zig e soluçõeszig builde depois compila usando@importA expressão em espanhol citada na história de Borges é sobre um deus norueguês
Flexibilidade do
comptimePontos pelos quais o
comptimedo Zig é famosoPost de blog educativo
comptime foreinline forcomptimeOpiniões positivas sobre a linguagem e as ferramentas Zig
Pontos interessantes sobre o
comptimedo ZigConfusão sobre execução de código em tempo de compilação