La storia di C: il linguaggio nato per Unix che ha cambiato l'informatica

Da Bell Labs e Dennis Ritchie ai sistemi operativi, ai microcontrollori e ai linguaggi moderni: come C è diventato una delle fondamenta del software.

5 min di letturaStoria dei linguaggi

Luigi Iadicola, Programmatore - Napoli

In questo articolo

Prima di C, programmare vicino all'hardware significava spesso scegliere tra due estremi: il controllo quasi assoluto dell'assembly e la maggiore comodità dei linguaggi di alto livello. All'inizio degli anni Settanta, nei Bell Labs, da questa tensione nacque un linguaggio destinato a cambiare il modo in cui costruiamo il software.

Prima di C: BCPL, B e la ricerca di un linguaggio per i sistemi

La storia di C non comincia direttamente con C. Tra i suoi antenati c'è BCPL, progettato da Martin Richards negli anni Sessanta. Ken Thompson ne riprese diverse idee per creare B, un linguaggio utilizzato nei primi lavori su Unix ai Bell Labs.

B era compatto e adatto alle macchine dell'epoca, ma l'arrivo del PDP-11 mise in evidenza alcuni limiti. Serviva qualcosa che mantenesse la semplicità di B aggiungendo un sistema di tipi e strumenti più adatti alla programmazione di sistema.

Dennis Ritchie e la nascita di C

Tra il 1969 e il 1973 Dennis Ritchie sviluppò C ai Bell Labs, con il periodo più intenso della sua evoluzione intorno al 1972. Non nacque come esercizio accademico isolato: cresceva insieme a Unix e rispondeva a problemi reali.

Questa origine è fondamentale per capire C. Il linguaggio doveva permettere di manipolare memoria e dati con grande precisione, produrre programmi efficienti e, contemporaneamente, evitare di scrivere un intero sistema operativo direttamente in assembly.

Quando Unix incontrò C

Uno dei passaggi decisivi arrivò quando parti sempre più importanti di Unix furono riscritte in C. Era una scelta notevole per l'epoca: i sistemi operativi erano strettamente associati all'hardware sul quale venivano sviluppati.

Usare un linguaggio relativamente portabile significava poter trasferire molto più facilmente il sistema su macchine differenti. C e Unix finirono così per crescere insieme: Unix contribuì alla diffusione di C e C rese Unix molto più portabile.

1978: il libro che definì una generazione

Nel 1978 Brian Kernighan e Dennis Ritchie pubblicarono The C Programming Language. Il libro, conosciuto semplicemente come K&R, divenne uno dei testi più influenti della storia della programmazione.

Per anni il cosiddetto “K&R C” rappresentò il riferimento pratico del linguaggio. Anche uno degli esempi di codice più famosi della storia, il classico programma che stampa “hello, world”, è indissolubilmente legato a questa tradizione.

Dalla pratica allo standard: ANSI C e C89

La diffusione portò inevitabilmente a implementazioni e comportamenti differenti. Negli anni Ottanta iniziò quindi il lavoro di standardizzazione. Nel 1989 arrivò lo standard ANSI X3.159-1989, da cui deriva il nome C89; poco dopo il linguaggio venne adottato anche come standard ISO.

La standardizzazione trasformò una pratica consolidata in una specifica condivisa e diede agli sviluppatori una base più stabile per scrivere software portabile tra compilatori e piattaforme differenti.

C99: il linguaggio continua a evolversi

Nel 1999 arrivò C99, una revisione importante che introdusse e formalizzò numerose funzionalità. Tra queste troviamo i commenti con //, dichiarazioni più flessibili, inline, nuovi tipi interi e altre migliorie che rendevano il linguaggio più pratico senza cambiarne la filosofia fondamentale.

Da C11 a C17

C11, pubblicato nel 2011, portò altre novità significative, tra cui strumenti per la programmazione concorrente, gli atomici e ulteriori miglioramenti alla libreria e al sistema dei tipi. C17 fu invece principalmente una revisione correttiva: consolidò lo standard precedente senza rivoluzionare il linguaggio.

C23 e un linguaggio che non vuole diventare un altro linguaggio

L'evoluzione è proseguita con C23, formalizzato nello standard ISO/IEC 9899:2024. Il C moderno acquisisce nuove comodità e corregge limiti storici, ma conserva un principio riconoscibile: offrire astrazioni relativamente sottili e lasciare al programmatore un controllo molto diretto sulla macchina.

Perché C ha influenzato così tanti linguaggi?

L'eredità di C va molto oltre i programmi scritti direttamente in C. La sua sintassi e molte delle sue convenzioni sono riconoscibili in C++, Java, C#, JavaScript e in numerosi altri linguaggi.

Parentesi graffe, operatori, espressioni e strutture di controllo che oggi sembrano quasi naturali a milioni di programmatori devono molto alla famiglia sintattica costruita attorno a C.

Il paradosso di C: semplice da leggere, difficile da dominare

C ha relativamente pochi costrutti fondamentali, ma questo non significa che sia semplice da usare correttamente. Puntatori, aritmetica degli indirizzi, gestione manuale della memoria, undefined behavior e limiti degli array richiedono una comprensione precisa di ciò che accade sotto le astrazioni.

È proprio questo uno dei motivi per cui studiare C rimane interessante anche quando non diventerà il linguaggio principale di un progetto: costringe a confrontarsi con memoria, stack, heap, rappresentazione dei dati, compilazione e rapporto tra software e hardware.

Dove vive C oggi

C continua a essere presente in sistemi operativi, kernel, firmware, microcontrollori, runtime, librerie, database e software embedded. Non domina ogni categoria di sviluppo e non è necessariamente la scelta migliore per ogni nuovo progetto, ma una quantità enorme dell'infrastruttura digitale moderna poggia ancora su codice C o su concetti che C ha contribuito a rendere universali.

Un linguaggio di cinquant'anni che continua a stare sotto i nostri programmi

La parte più interessante della storia di C non è soltanto la sua longevità. È il modo in cui un linguaggio progettato per risolvere problemi concreti su macchine degli anni Settanta è riuscito a diventare uno dei punti di riferimento dell'informatica moderna.

Molti sviluppatori possono trascorrere una giornata intera scrivendo PHP, Java, C#, JavaScript, Python o altri linguaggi senza compilare una singola riga di C. Eppure, scendendo abbastanza in profondità nello stack, è molto probabile incontrarlo.

C non è semplicemente sopravvissuto alla propria epoca. In buona parte, ha contribuito a costruire quella successiva.

Hai lo stesso problema in azienda?

Raccontami cosa non va e da quando. Guardo la situazione con te prima di proporre qualsiasi intervento.

RaccontameloRispondo entro un giorno lavorativo.
Condividi:LinkedIn

Ricevi il prossimo articolo

Una mail per ogni articolo nuovo, nient'altro. Ti disiscrivi con un clic dal link in fondo a ogni email.