Zig es un lenguaje de programación de sistemas simple, explícito y sin trabajo oculto. Si llevas tiempo desarrollando cerca del “hierro” o buscando alto rendimiento, seguramente habrás notado el renacimiento de los lenguajes de sistemas.
Durante décadas, C y C++ han sido los reyes indiscutibles. Pero seamos honestos: C tiene 50 años. Es un lenguaje legendario, pero arrastra problemas de diseño que hoy en día son fuentes constantes de vulnerabilidades y dolores de cabeza.
Zig nace justo en ese hueco. No busca ser “el próximo C++” ni tampoco “el nuevo Rust”. Su propuesta se parece más a replantear C con herramientas actuales: simplicidad, claridad y control explícito.
Zig es un lenguaje de propósito general orientado a la programación de sistemas, diseñado por Andrew Kelley. Sus objetivos principales son la robustez, el rendimiento y la claridad.
La filosofía de las «cero sorpresas»
Lo que realmente diferencia a Zig de otros lenguajes modernos no es lo que tiene, sino lo que NO tiene.
Cuando leemos código en C++, C# o incluso JavaScript, a menudo ocurren cosas que no vemos. Una suma a + b podría estar invocando una sobrecarga de operadores compleja. Una asignación podría disparar un constructor de copia. Una línea cualquiera podría lanzar una excepción y cambiar el flujo del programa.
Zig se apoya en una idea muy sencilla: sin flujo de control oculto.
Si ves a + b en Zig, sabes que es una suma matemática. Si ves una llamada a una función, sabes que el flujo va allí y vuelve.
- No hay sobrecarga de operadores.
- No hay propiedades (getters o setters ocultos).
- No hay excepciones.
Esto, que puede parecer restrictivo, es una bendición cuando estamos depurando sistemas críticos. El código hace exactamente lo que dice que hace.
Sin asignaciones de memoria ocultas
En lenguajes de alto nivel (Java, Python, JS), el Garbage Collector (GC) trabaja por nosotros. Es cómodo, pero impredecible. En C++, constructores o la STL pueden asignar memoria en el heap sin que nos demos cuenta explícitamente.
En Zig, no hay asignaciones ocultas.
Zig no tiene Garbage Collector. A diferencia de C, donde existe el asignador global malloc, en Zig no hay un asignador por defecto. Por convención, si una función necesita reservar memoria, recibe un Allocator como parámetro.
// Ejemplo conceptual
// En Zig, tú decides DÓNDE se guarda la memoria
const resultado = try miFuncion(mi_allocator, datos);Esto nos da un control absoluto. ¿Quieres usar la pila (stack)? ¿Un bloque de memoria fijo? ¿El heap del sistema? Tú decides.
Esta característica resulta especialmente útil en WebAssembly (WASM) y sistemas embebidos, donde el tamaño del binario y el control de memoria son importantes.
comptime: código en tiempo de compilación
comptime es una de las partes más interesantes de Zig, y también una de las que más lo diferencia de C.
La mayoría de lenguajes tienen dos fases: compilación y ejecución. Zig difumina esa línea permitiéndonos ejecutar código Zig durante la compilación.
En C++ se suelen usar templates para la metaprogramación y en Rust, macros. En Zig usamos el propio lenguaje.
Podemos escribir funciones que, al compilarse, generan código optimizado, calculan tablas de valores o validan tipos, todo antes de que el programa final se genere.
// El inicializador de una constante global se calcula al compilar.
const tabla_seno = generarTablaSeno();Esto nos permite hacer genéricos y metaprogramación sin aprender una sintaxis nueva y extraña.
Una herramienta para compilar C y C++
Una de las genialidades de Zig es cómo abraza el ecosistema existente. Zig no pretende aislarse; pretende integrarse.
Zig también puede actuar como compilador de C y C++ sin dependencias externas, con soporte de compilación cruzada. Para ello expone los comandos zig cc y zig c++.
Esto nos permite compilar proyectos existentes y usar bibliotecas de C desde Zig. En Zig 0.16 la traducción de cabeceras se integra preferentemente en build.zig; veremos el proceso completo más adelante en el curso.
Para muchos casos no hace falta escribir wrappers manuales. Zig puede traducir declaraciones de archivos .h y enlazar la biblioteca correspondiente desde su sistema de construcción.
¿Por qué debería importarte?
Si trabajas únicamente en desarrollo web, quizás Zig te parezca “demasiado bajo nivel”. Aun así, puede interesarte para:
- Entender cómo funciona el ordenador realmente.
- Crear herramientas de línea de comandos (CLI) rápidas.
- Programar microcontroladores (como en Arduino) pero con un lenguaje moderno.
- Crear módulos WebAssembly (WASM) eficientes.
En esos ámbitos, Zig merece que le dediquemos tiempo.