ZIG - Introduzione


Il linguaggio Zig si propone un obiettivo decisamente ambizioso: sostituire il linguaggio C. O meglio, essere un C "migliore". Nella home page campeggia questo slogan:
Zig is a general-purpose programming language and toolchain for maintaining robust, optimal and reusable software.
Non male come dichiarazione di intenti. La sfida è quindi verso la programmazione di sistema, laddove gli sfidanti sono numerosi e in alcuni casi decisamente consolidati, citiamo C, C++ e ancor di più l'emergente Rust. E non possiamo non citare l'ottimo ma ahimè quasi dimenticato D e poi linguaggi giovani come Crystal, Nim, Go (con i primi due che stentano un po' ad imporsi) ecc...
Nato per iniziativa del brillante Andrew Kelley intorno al 2015 è un progetto che sta rapidamente conquistando adepti e consensi e per il quale si prevede un futuro molto luminoso. Vedremo....

Le caratteristiche di Zig sono  molto interessanti. Propongo un breve elenco non esaustivo:

1) Nessuna "magia", nessuna astrazione nascosta. Zig evita: conversioni implicite allocazioni nascoste inizializzazioni automatiche eccezioni garbage collector L’obiettivo è controllo totale e comportamento sempre prevedibile.

2) Sicurezza senza runtime. Zig punta a un modello di sicurezza a compile‑time: controlli sui tipi molto rigidi, overflow checking opzional,e bounds checking opzionale, errori espliciti (error!T) invece delle eccezioni nessun UB nascosto (se lo vuoi, devi dichiararlo) La sicurezza è esplicita, non magica.

3) Error handling esplicito e strutturato. Zig non ha eccezioni. Ha invece: error!T come tipo di ritorno try per propagare errori catch per gestirli errdefer per cleanup condizionale Il flusso degli errori è chiaro e leggibile, senza stack unwinding nascosto.

4) Compile-time potente e integrato. Zig ha un sistema di metaprogrammazione senza macro: comptime per eseguire codice a compile‑time introspezione dei tipi con @typeInfo generics basati su parametri di tipo anytype generazione di codice senza template complessi È come avere un piccolo linguaggio di metaprogrammazione integrato.

5) Allocazione della memoria esplicita. Zig non decide mai come allocare: passi sempre un allocator alle funzioni che ne hanno bisogno puoi scegliere allocatori diversi (arena, bump, general-purpose…) puoi controllare lifetime e ownership in modo preciso Nessuna allocazione nascosta = nessuna sorpresa.

6) Portabilità estrema. Zig può: compilare per qualsiasi architettura supportata da LLVM cross‑compilare senza toolchain esterne includere C direttamente (@cImport) sostituire make, cmake, ninja con zig build È pensato per sistemi embedded, OS development, toolchain, engine.

7) Performance prevedibile. Zig punta a prestazioni C‑like, con: zero-cost abstractions nessun runtime nessun GC nessuna allocazione implicita nessuna eccezione nascosta Il costo di ogni operazione è evidente nel codice.

8) Standard library minimalista ma potente. La stdlib di Zig è: piccola modulare senza dipendenze orientata al controllo esplicito Include: I/O allocatori parsing networking algoritmi container opzionali (ArrayList, HashMap…) Tutto è opt‑in, niente è imposto.

9) Filosofia “comptime-first”. Zig incoraggia a spostare logica e controlli a compile‑time: validazione dei parametri generazione di funzioni specializzate introspezione dei tipi ottimizzazioni statiche Il risultato è codice più sicuro e più veloce.

10) Finalità principali del linguaggio. Zig è progettato per: ✔️ Sostituire C in modo moderno e sicuro Senza perdere controllo, prevedibilità e performance. ✔️ Essere un linguaggio per sistemi OS, driver, embedded, engine, toolchain. ✔️ Essere un linguaggio per tool di basso livello Compilatori, linker, loader, build system. ✔️ Essere un linguaggio per applicazioni ad alte prestazioni Senza GC, senza overhead nascosto. ✔️ Essere un linguaggio per metaprogrammazione sicura Grazie a comptime.

Descrizioni simili le troverete ovunque si parli di Zig, parola più, parola meno. Le promesse sono dunque di prim'ordine.
Problemi? Qualcuno. La curva di apprendimento non mi pare così dolce come si legge a volte in giro sui siti specializzati. Troverete difficoltà inattese anche per cose apparentemente banali come la gestione dell'input da tastiera. Il linguaggio ha le sue peculiarità, in particolare per chi arriva da strumenti magari più user-friendly come Python. Inoltre siamo ancora (gennaio 2026) non proprio in vista della versione 1.0. Il mondo va avanti e non aspetta nessuno... La verbosità (che nasce dalla necessità di un grande rigore) vi potrebbe a volte far perdere la pazienza. La community è già abbastanza frequentata ma, così come a livello di tools, di documentazione, libri ed esempi, siamo lontani da quanto disponibile per altri linguaggi.

Vale la pena ricordare che questo non è un corso o un tutorial ne tanto meno un libro "ufficiale" ma è il materiale creato durante il mio personale percorso di apprendimento del linguaggio.