Menu

Cos'è il linguaggio C: il linguaggio alla base di tutto il resto

C è un linguaggio compilato, piccolo e veloce, nato nel 1972, che ancora oggi fa girare sistemi operativi, database e quasi ogni dispositivo embedded. Ecco cos'è, dove gira e perché vale la pena impararlo nel 2026.

Questa pagina include editor eseguibili: modifica, esegui e vedi subito l'output.

C è un linguaggio di programmazione compilato e general purpose creato da Dennis Ritchie ai Bell Labs nel 1972 per scrivere il sistema operativo Unix. È sopravvissuto a quasi tutto ciò che è nato nella sua epoca, e il motivo è semplice: C sta un sottile strato sopra la macchina. Ti dà accesso diretto alla memoria e alle reali capacità della CPU, pur restando leggibile come qualcosa scritto da una persona.

Mezzo secolo dopo è ancora il linguaggio in cui vengono costruiti gli altri linguaggi.

Un programma C completo

Ecco la forma dell'intero linguaggio in sei righe. Premi Esegui.

#include <stdio.h> importa le dichiarazioni standard di input/output così che printf sia conosciuta. main è il punto in cui parte ogni programma C. printf scrive del testo, \n è un a capo e return 0 comunica al sistema operativo che il programma è terminato correttamente. È un programma completo e compilabile: nessuna classe che lo avvolge e nessun framework sotto.

Cosa rende C diverso

La maggior parte dei linguaggi moderni ti nasconde la macchina. C deliberatamente no.

  • Viene compilato in codice nativo. Un programma C diventa istruzioni macchina per una specifica CPU e gira direttamente, senza interprete né macchina virtuale in mezzo.
  • La memoria la gestisci tu. Non c'è garbage collector. Chiedi la memoria e la restituisci. È più lavoro, ed è anche il motivo per cui i programmi C usano così poca memoria e hanno tempi così prevedibili.
  • È piccolo. C ha circa 32 parole chiave. Puoi tenere in testa l'intero linguaggio, cosa che non vale per C++, Java o Python.
  • Non ha quasi runtime. Un programma C può girare su un microcontrollore con pochi kilobyte di RAM e senza alcun sistema operativo.

Lo scambio è onestà in cambio di sicurezza. C ti lascia leggere oltre la fine di un array o usare memoria che hai già liberato, e non ti ferma. Questi errori hanno un nome, segmentation fault, memory leak, comportamento indefinito, e imparare C significa in gran parte imparare a evitarli.

Dove gira davvero C

C non è una curiosità storica. Sta girando sul dispositivo su cui stai leggendo, e più di una volta.

  • Sistemi operativi. Il kernel Linux è composto da circa 30 milioni di righe di C. Anche grandi parti di Windows e del kernel di Apple sono in C.
  • Sistemi embedded. I microcontrollori di auto, termostati, dispositivi medici, router e lavatrici sono programmati in stragrande maggioranza in C. Quando l'intero chip ha 32 KB di memoria, C è spesso l'unica opzione realistica.
  • Database. SQLite, PostgreSQL, MySQL e Redis sono programmi C.
  • Runtime dei linguaggi. CPython, l'interprete Python di riferimento, è scritto in C. Lo sono anche MRI di Ruby, il motore Zend di PHP e il nucleo di Lua. Quando Python è "troppo lento", la soluzione di solito è un'estensione in C.
  • Strumenti e librerie. Git, curl, FFmpeg, OpenSSL, zlib, di nuovo SQLite: lo strato infrastrutturale dell'informatica è C.

Per questo conta anche l'interfaccia binaria delle applicazioni (ABI) di C: quasi ogni linguaggio può chiamare una funzione C. Python, Rust, Go, Java e JavaScript hanno tutti un modo per accedere alle librerie C. C è la lingua franca tra i linguaggi.

Perché imparare C

Ci sono due risposte oneste, e si rivolgono a persone diverse.

Se vuoi lavorare sul software di sistema, cioè kernel, driver, firmware embedded, database, C è il linguaggio di lavoro del settore, e la maggior parte degli annunci in quegli ambiti lo cita esplicitamente (spesso insieme a C++ o Rust). È difficile contribuire a Linux, a PostgreSQL o al codice di un microcontrollore senza leggere il C con disinvoltura.

Se vuoi migliorare nel linguaggio che usi già, C ti insegna cosa c'è sotto. Dopo il C sai perché l'indice di un array parte da zero, cos'è davvero una stringa, perché passare per valore un oggetto grande è costoso, cosa sono lo stack e lo heap e a cosa punta davvero un puntatore nullo. Questi concetti compaiono in ogni linguaggio; in C sono visibili invece che nascosti.

Questo programma è fatto di tre righe di C ed è anche una dimostrazione completa di cos'è una variabile: una scatola con un nome a un certo indirizzo. Nella maggior parte dei linguaggi non puoi nemmeno porti questa domanda.

C e C++

C++ è nato nel 1979 come "C con le classi" ed è cresciuto fino a diventare uno dei linguaggi più grandi che esistano: classi, template, eccezioni, overloading degli operatori, la STL, smart pointer e una libreria standard che fa sembrare minuscola l'intera specifica del C.

Il rapporto in pratica:

  • C++ ha mantenuto la sintassi del C, quindi if, for, while, gli operatori, i puntatori e gli array hanno lo stesso aspetto in entrambi.
  • La maggior parte del C ben scritto compila come C++, con qualche eccezione (C++ richiede per esempio un cast sul risultato di malloc).
  • Il codice C++ non è quasi mai C valido.

Se hai intenzione di imparare entrambi, partire dal C è un vantaggio concreto: C++ si basa direttamente sul modello di memoria del C, e le parti di C++ che confondono di più, cioè puntatori, riferimenti, semantica di copia, distruttori, sono tutte risposte a problemi che il C ti mostra in modo esplicito.

Tuttavia C non è un sottoinsieme di C++ in alcun senso ufficiale. Sono standard separati che evolvono separatamente, e il C moderno ha funzionalità che C++ non ha (gli inizializzatori designati arrivati con C99, i puntatori restrict e gli array a lunghezza variabile).

Quale C: le versioni dello standard

C è standardizzato, e la versione conta quando leggi codice più vecchio.

StandardAnnoDa conoscere per
C89 / C901989La base storica. Variabili dichiarate solo all'inizio di un blocco.
C991999Commenti //, variabili dichiarabili ovunque, bool tramite stdbool.h, long long
C112011Thread, operazioni atomiche, funzioni di libreria più sicure
C172018Una release di correzione bug di C11: oggi è il default più comune
C232024true/false/bool come parole chiave, nullptr, letterali binari

Questa documentazione fa riferimento a C17 e segnala le funzionalità da C99 in poi dove contano. I compilatori usano di default qualcosa di moderno, ma puoi essere esplicito:

gcc -std=c17 -Wall -Wextra hello.c -o hello

Cosa non ha C

Capire il C significa anche sapere cosa manca, perché quasi ogni domanda del tipo "come faccio a..." qui ha una risposta diversa rispetto a un linguaggio moderno.

  • Niente stringhe. Una stringa C è un array di char che termina con un byte zero. Concatenarne due significa chiamare una funzione e preoccuparsi che la destinazione sia abbastanza grande.
  • Niente collezioni. Niente liste, mappe o insiemi. Hai array di dimensione fissa e puntatori; una hash table la scrivi tu o la prendi da una libreria.
  • Niente eccezioni. Le funzioni segnalano un errore restituendo un valore speciale, come -1, NULL o un codice di stato, e chi chiama deve controllarlo.
  • Niente generics né overloading. Un nome di funzione corrisponde a una sola funzione. Ecco perché la libreria standard ha abs, labs e fabs per tre tipi diversi.
  • Niente namespace né moduli. Tutte le funzioni non static condividono un unico namespace globale, ed è per questo che le librerie C mettono un prefisso a tutto (sqlite3_open, png_read_info).
  • Niente garbage collector. Ogni malloc richiede un free corrispondente, e dimenticarlo causa un memory leak.

Nessuna di queste è una svista. Alcune sono meccanismi di runtime che C sceglie di non portarsi dietro (un garbage collector, lo srotolamento delle eccezioni, stringhe che crescono), e questo spiega in gran parte perché sta su un chip con 2 KB di RAM; altre, come namespace e generics, sono funzionalità dei linguaggi arrivate dopo la progettazione del C e lasciate fuori per mantenere il linguaggio piccolo.

Il buffer è di 32 byte perché sei tu ad aver deciso che bastavano. C non lo controllerà, e questa decisione riassume in una riga tutto il carattere del linguaggio.

C è difficile?

C è piccolo ma non perdona. Non c'è molta sintassi da memorizzare: puoi leggere l'intero linguaggio in una settimana. Quello che richiede tempo è la disciplina: tenere traccia di chi possiede ciascun pezzo di memoria, ricordare che una stringa è solo una sequenza di byte che termina con uno zero, controllare che un puntatore non sia nullo prima di seguirlo.

Gran parte della difficoltà del C non sta nei concetti ma nella mancanza di protezioni: il compilatore non ti salverà da una scrittura fuori dai limiti o da un puntatore pendente, quindi impari a essere preciso. (I puntatori in sé richiedono un vero sforzo la prima volta: è normale, e il capitolo sui puntatori li affronta con calma.) Questa precisione è un'abilità che ti porti dietro in ogni linguaggio che userai in seguito.

Domande frequenti

Cos'è il linguaggio di programmazione C?

C è un linguaggio di programmazione compilato e general purpose, creato da Dennis Ritchie ai Bell Labs nel 1972. Ti dà il controllo diretto della memoria e rispecchia da vicino ciò che la CPU fa davvero, ed è per questo che sistemi operativi, driver di dispositivo e database vengono ancora scritti in C.

A cosa serve oggi il linguaggio C?

Kernel di sistemi operativi (Linux, parti di Windows e macOS), firmware embedded in auto, elettrodomestici e microcontrollori, database come SQLite e PostgreSQL, runtime di linguaggi come CPython e Redis, e librerie critiche per le prestazioni che altri linguaggi richiamano.

Vale ancora la pena imparare C nel 2026?

Sì, per due motivi. È ancora il linguaggio della programmazione di sistema ed embedded, un settore ampio e ben pagato. E ti insegna come funzionano davvero memoria, puntatori e stack, conoscenze che ti rendono più bravo in qualsiasi altro linguaggio, perché la maggior parte è implementata in C.

Qual è la differenza tra C e C++?

C++ è nato come "C con le classi" e ha mantenuto gran parte della sintassi del C aggiungendo programmazione orientata agli oggetti, template, la libreria standard e molto altro. C è molto più piccolo: niente classi, niente eccezioni, niente generics. La maggior parte del codice C valido compila come C++, ma non il contrario.

Illustrazione dei linguaggi di programmazione di Coddy

Impara a programmare con Coddy

INIZIA