Dennis Ritchie progettò un linguaggio volutamente compatto, abbastanza vicino alla macchina da poter scrivere un sistema operativo, ma abbastanza indipendente dall’hardware da trasferire quel sistema su nuovi computer. Questa combinazione ha reso C e Unix due fondamenta dell’informatica moderna.
Parlare di Ritchie richiede però di distinguere i contributi. È il principale progettista di C. Unix nasce da un lavoro collettivo ai Bell Labs, avviato da Ken Thompson e sviluppato con Ritchie e altri ingegneri. La loro storia mostra come un linguaggio e un sistema operativo possano trasformarsi a vicenda.
Dennis MacAlistair Ritchie nasce nel 1941 a Bronxville, nello Stato di New York. Studia fisica e matematica applicata ad Harvard, dove scopre i computer. Nel 1967 entra nel centro di ricerca informatica dei Bell Labs.
Il laboratorio partecipa allora a Multics, ambizioso sistema time-sharing. Quando Bell Labs abbandona il progetto nel 1969, Ken Thompson sperimenta un sistema più piccolo su un PDP-7. Con Ritchie e altri colleghi, quel lavoro diventa Unix.
Le prime macchine dispongono di poca memoria e il software di sistema è spesso scritto in assembly. Questo offre un controllo preciso, ma lega il programma a un’architettura. Cambiare computer significa riscriverne una parte importante.
Da BCPL e B al linguaggio C
Thompson adatta inizialmente le idee di BCPL in un linguaggio chiamato B. È utile per alcuni compiti, ma il suo modello quasi privo di tipi si adatta male al PDP-11 e ai suoi diversi formati di dati. Ritchie evolve B introducendo i tipi e crea il «New B», che diventa C all’inizio degli anni Settanta.
C resta piccolo. Le sue costruzioni corrispondono abbastanza direttamente alle operazioni di un processore, mentre funzioni, strutture, puntatori e tipi consentono di organizzare un programma senza scrivere ogni istruzione in assembly.
Un puntatore rappresenta un indirizzo di memoria. Permette programmi di sistema efficienti e strutture dati flessibili, ma non protegge automaticamente dagli accessi fuori limite, dall’uso di memoria già liberata o dall’interpretazione errata dei dati. Forza e rischi del linguaggio derivano in parte dalla stessa scelta: fidarsi del programmatore.
Unix riscritto in C
Verso il 1973, il kernel Unix viene riscritto in gran parte in C. Alcune porzioni dipendenti dall’hardware restano in assembly, ma la maggior parte del sistema può ormai essere compilata per una nuova macchina con un adattamento limitato.
Il risultato è storico non perché nessun linguaggio di alto livello fosse mai stato usato per un sistema, ma perché Unix dimostra in modo convincente che un sistema operativo performante può diventare portabile. C beneficia poi della diffusione di Unix nelle università; Unix beneficia a sua volta della facilità con cui C consente di adattarlo.
Questa relazione modella anche il linguaggio. C non viene progettato in astratto e poi applicato al sistema: tipi, operatori e libreria evolvono a contatto con esigenze concrete. Molti strumenti Unix sono scritti nello stesso linguaggio del kernel, semplificandone il trasferimento tra macchine.
Il compilatore come strumento di portabilità
La portabilità non deriva soltanto dal testo del linguaggio. Dipende anche da un compilatore capace di tradurre le stesse costruzioni verso set di istruzioni differenti e da una libreria che isoli una parte dei servizi di sistema.
Ai Bell Labs, C evolve insieme ai suoi compilatori. Deve restare abbastanza semplice da essere implementato sulle macchine disponibili e offrire accesso alle loro caratteristiche utili. Per questo array e puntatori sono strettamente collegati, le strutture descrivono l’organizzazione dei dati in memoria e gli operatori corrispondono spesso a istruzioni poco costose.
Il risultato non è una totale indipendenza dall’hardware. Dimensione dei tipi, ordine dei byte e alcuni comportamenti possono variare. Un programma portabile deve rispettare le garanzie del linguaggio invece di presupporre i dettagli di una macchina. La distinzione tra ciò che lo standard garantisce e ciò che un’implementazione decide diventerà centrale nella storia di C.
La diffusione universitaria di Unix accelera un circolo virtuoso. Gli studenti dispongono del sistema, del suo codice e del suo linguaggio principale; sviluppano strumenti, portano Unix su altre macchine e trasferiscono queste pratiche nell’industria. C non si impone quindi solo per qualità astratte: viaggia con un intero ambiente di programmazione.
Un riferimento prima dello standard
Nel 1978 Brian Kernighan e Dennis Ritchie pubblicano The C Programming Language. Il libro, noto come K&R, combina una presentazione concisa, esempi e una descrizione che per anni funge da riferimento di fatto.
La moltiplicazione dei compilatori rende poi necessaria una norma formale. Il comitato ANSI X3J11 inizia i lavori nel 1983; lo standard statunitense esce nel 1989 e diventa ISO nel 1990. Precisa linguaggio e libreria cercando di preservare i programmi esistenti.
Ritchie non controlla dunque da solo l’evoluzione di C. Dopo la sua creazione, il linguaggio diventa un’infrastruttura condivisa, governata da standard e implementata su un’enorme varietà di processori.
Un’eredità tecnica a doppio volto
C influenza direttamente C++ e Objective-C. La sua sintassi segna anche Java, JavaScript, C#, Go e molti altri linguaggi, anche quando gestione della memoria e modello di esecuzione sono profondamente diversi.
La sua impronta maggiore resta negli strati bassi: kernel, driver, librerie di sistema, microcontrollori, database e compilatori. Un’interfaccia definita in C funge spesso da linguaggio comune tra componenti scritti con tecnologie differenti.
Questa presenza non rende C la scelta migliore in assoluto. Le sue garanzie limitate favoriscono vulnerabilità come buffer overflow ed errori di durata della memoria. Strumenti di analisi, regole di codifica e linguaggi più sicuri cercano di ridurre questi rischi. Comprendere l’influenza di Ritchie significa anche capire perché oggi l’industria protegge maggiormente operazioni che C espone direttamente.
Ritchie, Thompson e la cultura Unix
Ritchie contribuisce a Unix come progettista e programmatore, ma attribuire il sistema a una sola persona cancellerebbe il contesto dei Bell Labs. Ken Thompson ha un ruolo iniziale decisivo; Brian Kernighan, Douglas McIlroy e altri contribuiscono agli strumenti, alle idee e alla diffusione.
Ritchie e Thompson ricevono insieme il premio Turing nel 1983 per lo sviluppo della teoria generale dei sistemi operativi e, in particolare, per l’implementazione di Unix. Il riconoscimento congiunto riflette correttamente i loro contributi.
Ritchie prosegue la carriera ai Bell Labs e lavora poi sui sistemi Plan 9 e Inferno. Muore nel 2011. Il suo stile pubblico sobrio contrasta con l’ampiezza della sua eredità.
Perché Dennis Ritchie conta ancora
Ritchie ha contribuito a spostare una frontiera: il software di sistema non doveva più restare quasi interamente prigioniero dell’assembly e di una singola macchina. C ha fornito un livello di astrazione modesto ma decisivo, trasparente verso l’hardware e abbastanza stabile da favorire la portabilità.
La lezione resta attuale. Tra prestazioni e protezione, controllo e astrazione, compatibilità e progresso, ogni linguaggio di sistema riformula ancora i compromessi a cui C ha dato una risposta duratura.
Cronologia
- 1941: nascita a Bronxville, New York.
- 1963: laurea in fisica ad Harvard.
- 1967: ingresso ai Bell Labs.
- 1969: primi lavori su Unix con Ken Thompson e il team Bell Labs.
- 1971: Unix viene portato sul PDP-11.
- 1972: lo sviluppo di C assume una forma riconoscibile a partire da B.
- 1973: il kernel Unix viene riscritto in gran parte in C.
- 1978: pubblicazione di The C Programming Language con Brian Kernighan.
- 1983: Ritchie e Thompson ricevono il premio Turing.
- 1989: pubblicazione dello standard ANSI C.
- 1990: C diventa standard internazionale ISO.
- 2011: morte di Dennis Ritchie.
Domande frequenti
Dennis Ritchie ha creato Unix?
È uno dei principali sviluppatori, ma Unix è un’opera collettiva avviata da Ken Thompson ai Bell Labs. Ritchie ha avuto un ruolo fondamentale nello sviluppo e nella riscrittura in C.
Perché Ritchie ha creato C?
I linguaggi disponibili rispondevano male alle esigenze di Unix sul PDP-11. C doveva offrire tipi ed efficienza vicini all’hardware consentendo al contempo di spostare il codice tra architetture.
C è un linguaggio di basso livello?
Viene spesso definito di livello intermedio. Offre strutture di alto livello come funzioni e tipi, ma espone direttamente indirizzi di memoria e rappresentazione dei dati.
Perché la riscrittura di Unix in C fu importante?
Ridusse la dipendenza dall’assembly specifico di una macchina. Unix poté essere portato più facilmente, favorendone la diffusione e dimostrando la praticabilità dei sistemi portabili.
Quale ruolo ebbe Brian Kernighan?
Kernighan non progettò C, ma contribuì alla documentazione e alla diffusione. Il libro scritto con Ritchie servì da riferimento prima della standardizzazione.
Perché C è ancora usato nonostante i rischi?
Produce codice prevedibile, funziona su quasi tutte le architetture e si integra con moltissimi sistemi esistenti. Questi vantaggi comportano una maggiore responsabilità nella gestione della memoria e della sicurezza.