Descripción general del lenguaje Zig

Zig 0.14 — lenguaje de sistemas | sin flujo de control oculto | sin asignaciones ocultas | sin preprocesador | ejecución en tiempo de compilación

paradigma

Imperativo, procedimental, orientado a datos. Escritura estática con inferencia, escritura estructural (pato) mediante comptime. Compilación a través de LLVM + backend autohospedado. Sin sobrecarga de operadores, sin excepciones, sin RAII, sin macros.

Tipos

Categoría Tipos
Firmado entero i8 i16 i32 i64 i128 isize
entero sin firmar u8 u16 u32 u64 u128 usize
flotador f16 f32 f64 f128
booleano bool
vacío void
nunca noreturn
matriz [N]T
rebanada []T
puntero *T *const T [*]T (varios elementos) [*c]T (puntero C)
Opcional ?T
Unión de errores E!T
estructura struct { field: T }
unión union { field: T } (etiquetado)
enumeración enum { variant }
Empaquetado union/enum packed union packed enum
Vector @Vector(N, T) (SIMD)
Función fn(params) ReturnType
opaco opaque {}
tiempo completo comptime T (tiempo de compilación conocido)
cualquier tipo anytype (escritura de pato comptime)
Cualquier error anyerror
Tipo type (tipo de primera clase)
Vacío (cero bits) comptime void

Declaraciones

construir Sintaxis Notas
Función fn name(params) ReturnType { body }
variable const x = expr; inmutable
Mutable var x = expr;
constante const NAME: T = expr; Conocido en tiempo de compilación
Exportar export fn name() void { ... } Visible para el vinculador
externo extern fn name() void; De otro objeto
estructura const T = struct { field: T };
enumeración const E = enum { variant };
unión const U = union(enum) { field: T }; Unión etiquetada
Conjunto de errores const Errors = error { E1, E2 };
prueba test "name" { ... }
bloque de tiempo de compilación comptime { ... }
Montaje en línea asm volatile ("code");
Importar const std = @import("std");

Controlar el flujo

construir Sintaxis Notas
si if (cond) { ... } else { ... }
Si (expresión) const x = if (cond) a else b;
Si (opcional) if (opt) |val| { ... } else { ... } Capturar desenvolver
Si (unión de error) if (result) |val| { ... } else |err| { ... }
mientras while (cond) { ... }
Mientras (opcional) while (opt) |val| { ... }
Mientras (error) while (result) |val| { ... } else |err| { ... }
Para for (slice) |item| { ... }
Para (índice) for (slice, 0..) |item, i| { ... }
Cambiar switch (expr) { variant => body, else => body } exhaustivo
descanso break;
Continuar continue;
Regresar return expr;
Aplazar defer expr; Ejecutar al salir del alcance
Errdefer errdefer expr; Ejecutar en caso de error
atrapar result catch |err| { ... } Desenvolver o manipular

Funciones del interruptor

Operadores

Categoría Operadores
Aritmética + - * / %
Envoltura +% -% *%
Saturación +| -| *|
Comparación == != < > <= >=
Lógico and or !
Bit a bit >> << & | ^ ~
compuesto += -= *= /%= &= |= ^= <<= >>=
Anulable orelse catch .? (desenvolver opcional)
Varios .. (rango) ** (ptr deref multi) . (campo) .* (ptr deref)
dirección de &expr

Comptime (metaprogramación)

fn max(comptime T: type, a: T, b: T) T {
    return if (a > b) a else b;
}

comptime {
    // Runs at compile time
    @compileLog("building for", @tagName(builtin.cpu));
}

// Generics via comptime parameters
fn ArrayList(comptime T: type) type {
    return struct {
        items: []T,
        fn init(self: *Self) void { ... }
    };
}

Funciones de tiempo completo

Memoria

Operación Sintaxis Notas
asignar allocator.alloc(T, n) Devuelve ![]T
Gratis allocator.free(slice)
Reasignar allocator.realloc(slice, n)
crear allocator.create(T) Elemento único
destruir allocator.destroy(ptr)
parámetro asignador allocator: Allocator Siempre explícito

Asignadores

std.heap.page_allocator std.heap.arena_allocator std.heap.FixedBufferAllocator std.heap.ArenaAllocator std.heap.StackFallbackAllocator std.heap.c_allocator

La filosofía del asignador de Zig

Manejo de errores

// Error union type: ReturnType!Error
fn div(a: i32, b: i32) !i32 {
    if (b == 0) return error.DivisionByZero;
    return a / b;
}

// Try operator: early return on error
const result = try div(10, 2);

// Catch: provide default
const val = div(10, 0) catch 0;

// Global error set vs specific
fn parse() ParseError!i32 { ... }

Aplazar y Errdefer

{
    const buf = try allocator.alloc(u8, 100);
    defer allocator.free(buf);  // always runs at scope exit
    errdefer allocator.free(buf);  // runs only if error returned

    // ... use buf
}  // defer triggers here

Biblioteca estándar (seleccionada)

Módulo Contenidos
std.fs Archivo, Directorio, Ruta, cwd, readFile, writeFile, copyFile, deleteFile, makeDir, makePath
std.io Lector, escritor, almacenado en búfer, formateo, impresión
std.net TcpStream, TcpListener, UdpSocket, dirección IP, dns
std.mem copiar, configurar, intercambiar, indexOf, dividir, unir, Allocator, interfaz de Allocator
std.process ChildProcess, Args, Env, salir, getSelfPath
std.time Instantáneo, nanoTime, suspensión, temporizador, época
std.Thread spawn, Pool, Mutex, RwLock, Semáforo, Condición, Atómico
std.math sqrt, pecado, porque, bronceado, exp, iniciar sesión, pow, abdominales, min, max, abrazadera
std.hash funciones hash, crc32, sha256, sha512, md5
std.json analizar, encadenar, valor, matriz, objeto
std.sort ordenar, búsqueda binaria, inserción, fusionar, pdqsort
std.unicode utf8, utf16, ancho, mapeo de casos
std.Build Sistema de compilación (reemplaza a make/cmake)
std.Target Detección de objetivos de compilación cruzada
std.debug afirmar, entrar en pánico, imprimir, volcar, rastrear

Pruebas

test "basic addition" {
    try std.testing.expectEqual(4, add(2, 2));
    try std.testing.expect(add(1, 1) == 2);
    try std.testing.expectError(error.DivisionByZero, div(1, 0));
}
zig test file.zig        # run tests
zig build test           # run all tests in project
zig test --name "filter" # filter test names

Compilación cruzada

zig build-exe main.zig --target x86_64-windows  # cross-compile to Windows
zig build-exe main.zig --target aarch64-linux    # cross-compile to ARM64 Linux
zig build-exe main.zig --target riscv64-linux    # cross-compile to RISC-V

Zig se entrega con encabezados libc y cadenas de herramientas de compilación cruzada para todos los objetivos principales; no se necesita un compilador cruzado separado.

Interoperabilidad C

// Import C header
const c = @cImport({
    @cInclude("stdio.h");
});

// Link C library
pub fn main() void {
    _ = c.printf("hello %d\n", 42);
}

// Direct use of C ABI
extern "c" fn strlen(s: [*:0]u8) usize;

// Zig is a better C:
// - @cImport for headers
// - export fn for C-ABI exports
// - [*:0]T for null-terminated strings
// - @ptrCast for pointer conversion
// - packed struct for ABI-compatible layouts

Diferencias notables con C

Compilación

zig build-exe main.zig     # compile executable
zig build-lib lib.zig       # compile library
zig build-obj obj.zig       # compile object
zig run main.zig            # compile + run
zig test file.zig           # compile + run tests
zig fmt file.zig            # format code
zig build                   # build project (build.zig)
zig translate-c foo.h       # translate C header to Zig

Modos de construcción

Modo Bandera Controles de seguridad Optimizaciones
Depurar (predeterminado) completo Ninguno
Liberación segura -Doptimize=ReleaseSafe completo Velocidad
Liberación rápida -Doptimize=ReleaseFast Ninguno Velocidad
LanzamientoPequeño -Doptimize=ReleaseSmall Ninguno Tamaño