Il C
Arriviamo all’inizio degli anni 70, l’hardware diventa sempre più potente e la richiesta di software cresce giorno dopo giorno, ma non esiste ancora un
linguaggio ad alto livello che soddisfi qualsiasi richiesta di software. Fino al 1972, “l’ora zero” del linguaggio C: in un laboratorio della AT&T Bell Dennis Ritchie fa girare un primo prototipo del C su un DEC PDP-11 con sistema operativo UNIX. Il C fu il risultato dello sviluppo di due linguaggi di programmazione più vecchi: il B (sviluppato da Ken Thompson) e il BCPL (sviluppato da Martin Richards). Per anni il linguaggio C fu strettamente legato al sistema operativo UNIX (infatti, dopo la progettazione del C, tutte le successive versioni di UNIX furono scritte in questo linguaggio, e ancora oggi i sistemi Unix-based, fra cui Linux e *BSD, sono scritti in C). Nel 1989, alla luce dei vari “stili” del C formatisi, l’ANSI (American National Standards Institute) mise a punto l’ANSI C, una versione standard del C priva di ambiguità che è ancora oggi il riferimento per la stragrande maggioranza dei compilatori.
La novità del C, ed anche il motivo di tutto il suo successo, è che il C è un linguaggio di programmazione sviluppato dai programmatori stessi, e non da un’istituzione governativa o da un’università, per i programmatori stessi: questo rende il C il linguaggio dei programmatori. Unita a questa caratteristica, c’è la versalità del C: un linguaggio usato tanto per semplici programmini didattici, tanto per sviluppare codice di sistema o software per sistemi embedded: è un linguaggio che si presta ad un’infinità di usi, grazie anche ad una libreria davvero vastissima. Il C infatti, a differenza degli altri linguaggi di programmazione, ha pochissime keyword (parole riservate), ma un vasto insieme di funzioni presenti nella libreria standard (dalla gestione dell’I/O alle funzioni matematiche, dalla manipolazione dei file alla gestione della memoria) e un gran numero di librerie esterne sviluppate dai programmatori e facilmente integrabili nei propri progetti (dagli strumenti per la creazione di interfacce grafiche (GUI), alla gestione delle espressioni regolari, alla programmazione di rete, e così via).
È un linguaggio ad alto livello che consente però l’interazione a livello molto più basso con la macchina. È infatti possibile dal C allocare e deallocare direttamente aree di memoria (questa è vista da molti come un sinonimo di potenza del linguaggio, ma come è noto da un grande potere derivano grandi responsabilità), accedere direttamente a indirizzi di I/O in modo da leggere e scrivere dati su una periferica (questo rende il C il linguaggio privilegiato per la scrittura dei driver), e perfino inserire nel proprio codice spezzoni di codice Assembly (in una sintassi detta inline Assembly). Per questi motivi molti preferiscono definire il C un linguaggio a medio livello.