- La función comptime de Zig ofrece una capacidad de evaluación en tiempo de compilación muy potente, pero es intencionalmente limitada
- Al ejecutar código en tiempo de compilación, no es posible acceder a información del host, un diseño adecuado para la compilación cruzada
- No admite generación dinámica de código, DSL, RTTI, I/O, etc.; en su lugar, usa especialización de código explícita basada en tipos
- RTTI puede implementarse manualmente, reconstruyendo la información de tipos que solo existe en tiempo de compilación para usarla en tiempo de ejecución
- Es posible crear nuevos tipos con comptime, pero no extender APIs; no se pueden agregar métodos definidos por el usuario
Las cosas que comptime de Zig no hace
- Aunque el
comptime de Zig ofrece funciones potentes como genéricos, compilación condicional, serialización y ORM, algunas capacidades están explícitamente restringidas
- Esas limitaciones, de hecho, hacen que el diseño de Zig sea más simple y predecible
-
No hay acceso a información del host (No Host Leakage)
- El código
comptime opera según la plataforma objetivo, no según el sistema donde se ejecuta el compilador
- En Zig, en tiempo de compilación no se puede usar información del sistema host, como el endianness o el tamaño de puntero
- Esto busca garantizar seguridad pensando en la compilación cruzada
- En el código de ejemplo, la salida de bytes de un número en formato BF16 cambia según la plataforma objetivo
-
No hay generación de código basada en cadenas (No #eval)
- Zig no ofrece funciones para generar código dinámicamente como
#include de C, los mixins de D o los macros de Rust
- En su lugar, admite evaluación parcial (partial evaluation) basada en argumentos
comptime
- Si cierto argumento se conoce en tiempo de compilación, solo sobrevive esa rama, lo que permite optimizar el código
-
No se puede extender la sintaxis con DSL (No DSLs)
- En Zig no existe una función para crear sintaxis definida por el usuario como en Lisp o Rust
- Todos los datos solo se pasan como valores conforme a la sintaxis de Zig
- Los DSL limitados, como las cadenas de formato de
printf, solo pueden implementarse como cadenas comptime
-
No hay información de tipos en tiempo de ejecución (No RTTI)
- Zig puede comportarse como un lenguaje dinámico como Python, pero la información de tipos existe únicamente en
comptime
- Si se quiere que funcione también en tiempo de ejecución, hay que definir manualmente una estructura RTTI y manipularla con punteros
- Ejemplo: definir una estructura
RTTI con los nombres y offsets de los campos de un struct, y luego acceder a ellos mediante punteros
-
No se pueden crear APIs nuevas (No New API)
- En Zig se pueden crear tipos nuevos con
comptime, pero no se pueden agregar métodos a ese tipo
- No es posible extender APIs como con los derive macros de Rust
- Al implementar serialización JSON, no se puede agregar un método
.to_json(); en su lugar, se implementa pasando un argumento de tipo a una función global
-
No hay I/O en tiempo de compilación (No IO)
- El
comptime de Zig prohíbe el acceso a recursos externos como sistema de archivos, red o bases de datos
- Gracias a esto, mejoran la reproducibilidad, la seguridad y el aprovechamiento de caché
- Si se necesita I/O, se usa el sistema de build
build.zig para importar código Zig generado previamente
-
Resumen: El Disco (equilibrio entre abstracción y simplicidad)
- Zig ofrece potentes capacidades de metaprogramación, pero asegura la previsibilidad mediante un diseño muy restringido
- Gracias a estas limitaciones, el
comptime de Zig se mantiene práctico y fácil de entender
- Sin abstracciones complejas, sigue siendo útil en la práctica y solo hace claramente lo que declara hacer
1 comentarios
Comentarios en Hacker News
El
comptimede Zig tiene características únicasDesventajas y soluciones de
comptimeen Zigzig buildy luego se compila con@importLa frase en español citada en un relato de Borges trata sobre un dios nórdico
La flexibilidad de
comptimeLo más conocido de la función
comptimede ZigUna entrada de blog educativa
comptime foreinline forcomptimeOpiniones positivas sobre el lenguaje y las herramientas de Zig
Aspectos interesantes de
comptimeen ZigConfusión sobre la ejecución de código en tiempo de compilación