En Zig, la Standard Library (std) es el núcleo de la mayoría de las funcionalidades que el lenguaje ofrece: desde manejo de memoria hasta entrada‑salida y utilidades de sistema. Cuando escribes un programa, el compilador debe saber dónde buscar los archivos fuente de esa librería. Ese conjunto de ubicaciones se conoce como zig language standard library path. Comprender cómo funciona te permite compilar correctamente, usar versiones distintas o incluso crear tus propias extensiones de std.
El rol de la ruta estándar (std)
El compilador Zig necesita localizar el archivo std.zig, el cual contiene la definición de todas las funciones y tipos que se importan con:
const std = @import("std");
Si el compilador no encuentra std.zig, el programa no compilará. Por eso la ruta a la librería estándar es una de las configuraciones más críticas.
Ubicación por defecto
- Cuando instalas Zig desde los binarios oficiales, la librería estándar se encuentra dentro del propio directorio de Zig, típicamente
/usr/local/zig/lib/stden Linux oC:\zig\lib\stden Windows. - El compilador incluye automáticamente esta ruta en su búsqueda, por lo que en la mayoría de los casos no necesitas hacer nada extra.
Variables de entorno y flags
En proyectos más complejos o cuando quieres usar una versión de std distinta a la que viene con la instalación, puedes indicar explícitamente la ruta a la librería estándar.
ZIG_STD_LIB_PATH– Variable de entorno que señala al directorio donde se encuentrastd. Ejemplo:
export ZIG_STD_LIB_PATH=/ruta/a/mi_std
--library std– Flag de compilación que especifica la ruta directamente. Ejemplo:
zig build-exe main.zig --library std=/ruta/a/mi_std
Configuración en proyectos
Cuando usas el sistema de construcción de Zig (el build.zig), puedes configurar la ruta de la librería estándar con el método rootModule.linkLibraryPath(). Así se garantiza que todas las dependencias del proyecto utilicen la misma versión de std.
// build.zig
const std = @import("std");
pub fn build(b: *std.build.Builder) void {
const mode = b.standardReleaseOptions();
const exe = b.addExecutable("mi_programa", "src/main.zig");
exe.setBuildMode(mode);
exe.rootModule.linkLibraryPath("/ruta/a/mi_std"); // <-- ruta personalizada
b.installArtifact(exe);
}
Ejemplo práctico 1: Uso de std.io
En este programa simple se lee una cadena de entrada y se la escribe en la salida estándar, usando la librería std.io que proviene de std.
const std = @import("std"); // Importamos la librería estándar
pub fn main() !void { // Función principal que puede devolver un error
const stdout = std.io.getStdOut(); // Obtenemos el descriptor de salida estándar
var out_stream = stdout.writer(); // Creamos un escritor (writer) a partir del descriptor
try out_stream.print("Introduce tu nombre: ", .{}); // Mostramos un mensaje
// Leer la línea completa del usuario
var buffer: [256]u8 = undefined; // Creamos un buffer fijo de 256 bytes
const stdin = std.io.getStdIn(); // Descriptor de entrada estándar
var in_stream = stdin.reader(); // Creamos un lector (reader)
const bytes_read = try in_stream.readUntilDelimiterOrEof(&buffer, '\n');
// bytes_read es opcional: si se llega al final del archivo sin encontrar '\n', devuelve null
// Si bytes_read no es null, convertimos a string y lo mostramos de vuelta
if (bytes_read) |len| {
const name = buffer[0..len]; // Slice del buffer con la longitud leída
try out_stream.print("Hola, {s}!\n", .{name});
} else {
try out_stream.print("No se leyó ningún dato.\n", .{});
}
}
Comentarios explicados línea por línea:
const std = @import("std");importa la librería estándar.pub fn main() !void {define la función principal que puede lanzar errores (el!indica que devuelve!void).- Las llamadas a
std.io.getStdOut()ystd.io.getStdIn()obtienen los descriptores de archivo estándar. - Los métodos
writer()yreader()crean abstracciones para escribir y leer. - La función
readUntilDelimiterOrEoflee hasta un carácter específico o el fin del fichero, devolviendo un opcional con la cantidad de bytes leídos. - Los
tryse usan para propagar errores sin tener que escribir bloquescatchexplícitos.
Ejemplo práctico 2: Reemplazar la std con una versión personalizada
Supongamos que quieres usar una versión modificada de la librería estándar que añade una función de saludo
