Il linguaggio C nasce nei Bell Labs tra il 1969 ed il 1973 grazie a Dennis Ritchie che fa evolvere il linguaggio New B, evoluzione a sua volta di B, scritto dal collega Ken Thompson e usato per la scrittura delle primissime versioni di UNIX.
Dennis Ritchie
Il nome C viene accreditato al fatto che molte delle sue caratteristiche derivavano del precedente linguaggio B, ma restano in piedi anche alcune ipotesi “meno tecniche” come, ad esempio, quella che identifica nella lettera “C” l’iniziale di Compiler oppure quella di Cat, l’animale preferito di Ritchie.
Anche sul motivo ufficiale che ha spinto alla creazione del C (e dello stesso Unix) esistono diverse scuole di pensiero. Una delle più accreditate (sembra direttamente da Thompson e Ritchie) è per puro divertimento, visto che si voleva portare su PDP-7 (e poi su PDP-11) una serie di giochi che funzionavano su uno dei mainframe dei laboratori Bell. Il problema era l’assenza di un OS sufficientemente flessibile per lo scopo, così come non esisteva un linguaggio di programmazione che permettesse agevolmente l’operazione.
Così Thompson comincia a lavorare su UNIX (in assembler), mentre Ritchie si concentra prima sun New B e poi sul C che diventa sufficientemente potente per essere utilizzato per la riscrittura del kernel UNIX, rendendolo uno dei primi a non essere scritto in assembly, dopo Multics (scritto in PL/I) e TRIPOS e AmigaOS (BCPL).
Nella seconda metà degli anni ‘70 il linguaggio si diffonde anche su architetture Honeywell 635 e IBM 360/370, grazie al lavoro ad opera del ricercatore Johnson, che sviluppa il compilatore PPC in abbinamento alla nascita delle prime librerie (un certo Lesk sviluppò il “portable I/O package”, rinominato “standard I/O library”).
Ritchie e Thompson
La popolarità del linguaggio cresce esponenzialmente dopo il 1978 con la pubblicazione, da parte di Brian Kernighan e Dennis Ritchie, dello storico libro The C Programming Language, noto anche come “Libro Bianco”, in cui il linguaggio viene sviscerato in tutti i suoi aspetti
The C Programming Language
La chiave del suo successo sono poche e semplici istruzioni, che spesso ricalcano l’assembly delle CPU e sono traducibili direttamente con una singola istruzione di linguaggio macchina, rendendolo così particolarmente efficiente. Un ruolo centrale è rivestito dal “puntatore”, uno strumento per l’accesso diretto alla memoria hardware.
Se è vero che il C è decisamente vicino al linguaggio macchina, d’altra ha una struttura logica definita e leggibile e, soprattutto, il controllo sui tipi, che manca completamente in assembly. Inoltre la sintassi sua sintassi consente di scrivere istruzioni complesse e potenti in poche righe di codice. Grazie alla particolare efficienza del codice prodotto dai sui compilatori, il C viene utilizzato per riscrivere la maggior parte del codice del sistema UNIX, riducendo l’uso dell’assembly ad un piccolo gruppo di funzioni
Chiaramente questa sua spiccata propensione verso l’hardware non lo rende particolarmente appetibile per i neofiti, soprattutto per programmatori provenienti da linguaggi come il Pascal dove, ad esempio, i puntatori sono un qualcosa di sconosciuto.
Negli anni ‘80 i compilatori C sono basati principalmente sul PPC di Johnson, ma ne nascono molti indipendenti non conformi ad esso, cosa che comunque favorisce la diffusione del linguaggio. Per porre un freno a questo proliferare di dialetti, nel 1983 nasce il comitato X3J11, all’interno dell’American National Standards Institute (ANSI), al fine di stabilire le specifiche standard del C.
Per una nuova versione delle specifiche del linguaggio bisogna attendere circa 6 anni (1989) con la formalizzazione dell’ANSI X3.159-1989 Programming Language C, noto più semplicemente come ANSI C. Nel medesimo periodo anche un’altra importante opera di standardizzazione si cimenta nell’ambizioso obiettivo di definire in modo standard l’interfaccia tra linguaggio e sistema operativo. Prendendo spunto proprio dall’ANSI89, viene creata la “Portable Operating System Interface” (POSIX) ad opera dell’IEEE (Institute of Electrical and Electronics Engineers) che definisce, inoltre, i concetti di thread, socket, estensioni real-time e molto altro, in modo unico e indipendente dall’implementazione.
Nel 1990, l’ANSI C, con alcune piccole modifiche, venne adottato dall’International Organization for Standardization (ISO) con il nome di ISO/IEC 9899:1990. Dopo il processo di standardizzazione dell’ANSI, le specifiche del linguaggio C rimangono relativamente congelate fino al 1995 quando viene approvata la Normative Amendment 1.
Nel 1999, lo standard viene sottoposto ad una importante revisione, che porta alla pubblicazione ISO 9899:1999, alias C99, adottato come standard ANSI nel Marzo del 2000. Ad oggi l’ultima revisione è l’ANSI/ISO C11, pubblicata l’8 dicembre 2011, che però gode ancora di un supporto limitato da parte dei compilatori.
Tra le software house impegnate nella promozione del C, non può ovviamente mancare Microsoft che, nel 1983, presenta il Microsoft C 1.0, basato sul Lattice C (il primo compilatore C per PC IBM, nato per Amiga, e disponibile per un numero decisamente ampio di sistemi). La versione per DOS è particolarmente importante poiché, grazie ad essa, viene effettuato il porting di una serie rilevante di applicativi da CP/M, scritti in BDS C. Lo step di rilievo successivo è il rilascio (1985) della versione MS C 3.0, la prima interamente sviluppata da Microsoft ed utilizzata per lo sviluppo di Windows.
Le next release aggiungono il debugger CodeView (C 4.0), il primo compilatore a 32bit per processori i80386 (C 5.0), un primo supporto al C++ (C 6.0, 1989) fino ad arrivare all’ultima versione non “visual”, la C/C++ 7.0 (1992), che supporta nativamente il C++ e introduce le MFC (Microsoft Foundation Classes) 1.0 (Microsoft Foundation Classes) per lo sviluppo di interfacce grafiche.
Parallelamente nasce QuickC (1987) che porta con se l’IDE ormai standard della serie “Quick”, compatibile con lo standard ANSI C e la versione 5 del Microsoft C. Neanche a dirlo, il diretto competitor è ancora una volta Borland con il proprio Turbo C (omologo del Tubo Pascal) cosa che spinge Microsoft ad offrire la propria soluzione per 99$. Questa versione è comunque più limitata rispetto al fratello Microsoft C, soprattutto nella massima memoria utilizzabile, nella velocità del compilatore e nelle feauture di ottimizzazione del codice.
Nel complesso le tre versioni “Quick” (Basic, Pascal e C) dimostrano che già nella seconda metà degli anni ‘80 il big di Redmond intuisce la necessità di uniformare i propri ambienti che, anche restando separati tra loro, cercano di assomigliarsi quanto più possibile per permettere agli sviluppatori cross-language di lavorare con ambienti familiari.