Fundamentos del lenguaje
27 pasos en 9 series de Zig.
Zig es un lenguaje de sistemas moderno con una promesa a la antigua: sin flujo de control oculto, sin reservas de memoria ocultas, sin preprocesador — lo que el código dice es lo que la máquina hace. Andrew Kelley lo empezó en 2015 como un C mejor antes que un C++ más grande, y se ganó una comunidad devota justamente por esa contención, más un compilador que compila cruzado a cualquier parte casi como un detalle.
Este tour cubre el núcleo tal como lo compila zig 0.16: const y var bajo un compilador que rechaza código sin usar, switch exhaustivo, las formas de bucle, errores como valores con try y catch, opcionales con orelse, punteros y slices, structs y enums y uniones rotuladas, comptime y los genéricos que salen de él, allocators explícitos del DebugAllocator a las arenas, y las cajas de herramientas std.mem y std.fmt. El bis entrega programas completos. Cada fragmento compila y corre — y en Zig, compilar es una vara alta.
Valores
- La forma del programaEl programa Zig más pequeño: un import, un main público, dos prints.
- const y varZig vigila en las dos direcciones: const no puede cambiar, var tiene que hacerlo.
- Anchos de enteroEl ancho es parte del tipo: u8 e i32, u64 — y u3 si tres bits es lo que quieres decir.
Control de flujo
- if y switchLas dos formas de ramificar producen valores, y switch debe dar cuenta de cada caso.
- Bucles whileEl while con expresión de continuación, y uno que rompe con un valor.
- Bucles forfor recorre elementos; agrega 0.. y te entrega el índice también.
Errores
- Errores y tryLos errores son valores en el tipo de retorno: una bóveda que abre o dice por qué no.
- catch y orelseDos operadores de respaldo: catch para uniones de error, orelse para opcionales.
- deferLa limpieza declarada junto a lo que limpia: defer corre al salir del ámbito, en reversa.
Opcionales y punteros
- Opcionales?u32 es un número de amarradero o null, y el compilador no te deja olvidar cuál.
- PunterosUn puntero de un solo elemento duplica un contador en el lugar; .* es la desreferencia.
- SlicesUn slice es un puntero más un largo sobre memoria que ya existe.
Structs y enums
- StructsUn struct de kayak con valores de campo por defecto y un método que se lee natural.
- EnumsUn enum de carga con su propio método, recorrido por un switch exhaustivo.
- Uniones rotuladasUna lectura, dos formas: un float cuando el sensor funciona, una razón cuando no.
comptime
- comptimeEl mismo lenguaje corre en compilación: un número de Fibonacci horneado en el binario.
- GenéricosUn genérico es una función que recibe un tipo: un solo largest() para enteros y floats.
- Builtins y castsLos @-builtins: reflexión sobre tipos, y casts que siempre se escriben completos.
Memoria
- AllocatorsNada reserva memoria a tus espaldas: rentas bytes a un allocator, los devuelves, te auditan.
- ArrayListLa lista que crece es unmanaged: cada append entrega el allocator explícitamente.
- La arenaCinco reservas, cero frees: la arena devuelve todo en un solo deinit.
La biblioteca estándar
- std.memLas cadenas son []const u8, y std.mem es la caja de herramientas que las trabaja.
- std.fmtFormatear a un buffer de pila y parsear de vuelta — sin allocator a la vista.
- StringHashMapUn registro portuario: claves de cadena, amarraderos enteros y un iterador de claves.
Bis
- word_freq.zigUna tabla de frecuencia de palabras con tokenize, un hash map, un sort y un gráfico.
- grade_report.zigLos puntajes de quiz se pliegan en promedios y calificaciones, y luego en un reporte.
- temp_stats.zigUna semana de máximas diarias reducida a mínima, máxima y media, con una barra por día.