← Volver al listado de tecnologías
Introducción a Zig
Introducción a Zig
¿Qué es Zig?
Zig es un lenguaje de programación de sistemas de bajo nivel diseñado para ser una alternativa moderna a C. Creado por Andrew Kelley en 2016, Zig busca ofrecer:
- Rendimiento óptimo: Sin runtime oculto ni garbage collector
- Seguridad: Detección de errores en tiempo de compilación
- Simplicidad: Sintaxis clara sin características ocultas
- Interoperabilidad: Integración directa con código C
¿Por qué aprender Zig?
| Característica | C | Rust | Zig |
|---|---|---|---|
| Curva de aprendizaje | Media | Alta | Media |
| Seguridad de memoria | Manual | Compilador | Manual + herramientas |
| Interop con C | Nativo | FFI | Nativo |
| Comptime | Macros | Macros proc | Nativo |
| Testing integrado | No | Cargo | Nativo |
Instalación
Linux/macOS
# Descargar desde ziglang.org o usar el gestor de paquetes
# Arch Linux
sudo pacman -S zig
# macOS con Homebrew
brew install zig
# Ubuntu/Debian - descargar binario
wget https://ziglang.org/download/0.11.0/zig-linux-x86_64-0.11.0.tar.xz
tar xf zig-linux-x86_64-0.11.0.tar.xz
export PATH=$PATH:$PWD/zig-linux-x86_64-0.11.0
Windows
# Usando winget
winget install zig.zig
# O descarga el binario desde ziglang.org
Verificar instalación
zig version
# Output: 0.11.0 (o versión actual)
Tu primer programa
Crea un archivo hola.zig:
const std = @import("std");
pub fn main() void {
std.debug.print("¡Hola, Zig!\n", .{});
}
Ejecuta:
zig run hola.zig
# Output: ¡Hola, Zig!
Anatomía del programa
const std = @import("std"): Importa la biblioteca estándarpub fn main() void: Función principal pública que no retorna nadastd.debug.print: Función de impresión para debug.{}: Tuple vacío para argumentos de formato
Testing en Zig
Zig tiene testing integrado en el lenguaje. Crea matematicas.zig:
const std = @import("std");
pub fn sumar(a: i32, b: i32) i32 {
return a + b;
}
pub fn restar(a: i32, b: i32) i32 {
return a - b;
}
// Tests integrados
test "sumar dos números positivos" {
const resultado = sumar(2, 3);
try std.testing.expectEqual(@as(i32, 5), resultado);
}
test "sumar con números negativos" {
try std.testing.expectEqual(@as(i32, -1), sumar(-3, 2));
}
test "restar números" {
try std.testing.expectEqual(@as(i32, 7), restar(10, 3));
}
Ejecuta los tests:
zig test matematicas.zig
# Output:
# All 3 tests passed.
Anatomía de un test
test "nombre del test": Define un bloque de test con descripcióntry: Propaga errores si el test fallastd.testing.expectEqual: Compara valores esperados vs actuales@as(i32, 5): Cast explícito para evitar ambigüedad de tipos
Estructura de proyecto recomendada
mi-proyecto/
├── src/
│ ├── main.zig # Punto de entrada
│ └── lib.zig # Biblioteca principal
├── tests/
│ └── test_lib.zig # Tests adicionales
└── build.zig # Configuración de build
Compilación
# Compilar ejecutable
zig build-exe hola.zig
# Compilar con optimizaciones
zig build-exe -O ReleaseFast hola.zig
# Compilar biblioteca
zig build-lib matematicas.zig
Modos de compilación
| Modo | Uso | Características |
|---|---|---|
| Debug | Desarrollo | Checks de seguridad, símbolos debug |
| ReleaseSafe | Producción segura | Optimizado, mantiene checks |
| ReleaseFast | Máximo rendimiento | Sin checks de seguridad |
| ReleaseSmall | Binarios pequeños | Optimiza tamaño |
Ejercicios
- Hola personalizado: Modifica el programa para que imprima tu nombre
- Calculadora básica: Crea funciones
multiplicarydividircon sus tests - Test fallido: Escribe un test que falle intencionalmente y observa el output
Resumen
- Zig es un lenguaje de sistemas moderno con testing integrado
zig runejecuta código,zig testejecuta tests- Los tests se definen con
test "nombre" { ... } std.testingprovee funciones de aserción