6 puntos por GN⁺ 2025-04-21 | 1 comentarios | Compartir por WhatsApp
  • 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

 
GN⁺ 2025-04-21
Comentarios en Hacker News
  • El comptime de Zig tiene características únicas

    • reemplaza varias funciones presentes en otros lenguajes
    • es fácil de entender gracias a su transparencia referencial
    • ofrece capacidades potentes mediante introspección
    • permite escribir código simple pero potente de una forma distinta a Lisp
    • son raros los lenguajes con diseños y enfoques nuevos
  • Desventajas y soluciones de comptime en Zig

    • se genera código con zig build y luego se compila con @import
    • ofrece más libertad y tiempo de ejecución ilimitado, pero no la libertad de generar tipos de Zig como valores dentro de la compilación actual
    • es similar a experiencias pasadas de conectar Perl y Tcl con C
    • la actitud autocrítica de la comunidad de Zig a veces resulta desconcertante
  • La frase en español citada en un relato de Borges trata sobre un dios nórdico

  • La flexibilidad de comptime

    • cuando se necesita información de tipos durante una tarea, se puede agregar a los parámetros de una función
    • cuando no es posible proporcionar tipos en ciertas situaciones, hay que resolver un problema de diseño
  • Lo más conocido de la función comptime de Zig

    • ofrece varias capacidades como genéricos, compilación condicional, subtipado, serialización, ORM y más
    • otros lenguajes también tienen funciones similares de evaluación en tiempo de compilación
  • Una entrada de blog educativa

    • explica la diferencia entre comptime for e inline for
    • en la versión inline, la longitud solo puede conocerse en comptime
  • Opiniones positivas sobre el lenguaje y las herramientas de Zig

    • ojalá tuviera un modo seguro como Rust
    • está mucho más avanzado que C/C++
    • el compilador de Zig causa una gran impresión
  • Aspectos interesantes de comptime en Zig

    • la capacidad de representar tipos como valores en tiempo de compilación
    • permite implementar algo cercano a los lenguajes dinámicos o la reflexión en tiempo de ejecución sin sobrecarga en runtime
  • Confusión sobre la ejecución de código en tiempo de compilación

    • dudas sobre si el código de tiempo de compilación realmente se ejecuta en la máquina host local
    • curiosidad sobre por qué Zig oculta la plataforma host
    • opiniones positivas sobre la capacidad de cross-compile de Zig