Storia del Linguaggio di programmazione C Cervone Vincenzo TEC/0054 Università degli Studi di Napoli Parthenope SICSI V CICLO classe A042 Storia del linguaggio C La nascita del linguaggio C e’ strettamente collegata a quella del sistema operativo UNIX, in quanto è stato sviluppato su questo sistema operativo anzi, lo stesso sistema operativo ed i suoi programmi, sono scritti in C. Nonostante ciò, il linguaggio C non è legato solo alla programmazione dei sistemi operativi, ma con esso possono essere scritti (e sono stati scritti) grossi programmi di calcolo, word-processing e database. Il linguaggio C nasce dall’evoluzione programmazione. Vediamo quali: Università degli Studi di Napoli Parthenope di alcuni linguaggi di SICSI V CICLO classe A042 Evoluzione storica del C • Algol 60 Progettato da un comitato internazionale all'inizio del 1960. • CPL Combined Programming Language, sviluppato a Cambridge e all'università di Londra nel 1963. • BCPL Basic Combined Programming Language, sviluppato a Cambridge da Martin Richards nel 1967. • B Sviluppato da Ken Thompson, Bell Labs, nel 1970. • C Sviluppato da Dennis Ritchie, Bell Labs, nel 1972. • Poi nel 1973 fu formato il comitato dell'American National Standards Institute (ANSI) con lo scopo di creare l'ANSI C, una standardizzazione del linguaggio C. Università degli Studi di Napoli Parthenope SICSI V CICLO classe A042 1960 - ALGOL 60 L'Algol 60 fu progettato da un comitato internazionale all'inizio del 1960 alcuni anni dopo l'introduzione del FORTRAN. Questo nuovo linguaggio all'epoca era complesso ed ebbe una grande influenza sul progetto dei futuri linguaggi di programmazione. I suoi autori prestarono molta attenzione alla regolarità della sintassi, alla struttura modulare e ad altre caratteristiche di solito associate ai linguaggi strutturati ad alto livello. Sfortunatamente, l'Algol 60 non si diffuse mai veramente negli Stati Uniti, a parere di molti per l'astrazione e la genericità del linguaggio. Università degli Studi di Napoli Parthenope SICSI V CICLO classe A042 1963 - CPL Il CPL (Combined Programming Language) è un linguaggio di programmazione sviluppato congiuntamente dall'Università di Cambridge e dall'Università di Londra fu pesantemente influenzato dall'ALGOL. Gli inventori del CPL intendevano riportare i concetti introdotti dell'Algol 60 alla realtà dei computer veri. Però, come l'Algol 60, il CPL era difficile da imparare e da implementare e per questo fu anch'esso un fallimento. Università degli Studi di Napoli Parthenope SICSI V CICLO classe A042 1966 - BCPL Il BCPL (Basic Language) è Combined Programming un linguaggio di programmazione sviluppato da Martin Richards dell'Università di Cambridge, in seguito alle difficoltà che aveva incontrato nell'utilizzo del suo predecessore, il CPL. Il primo compilatore venne implementato mentre Richards si trovava al MIT, nella primavera del 1967. Il linguaggio venne presentato per la prima volta al 1969 Spring Joint Computer Conference. L'architettura del BCPL influenzò pesantemente il linguaggio B, da cui Dennis Ritchie in seguito sviluppa il C. Università degli Studi di Napoli Parthenope Martin Richards SICSI V CICLO classe A042 1966 - BCPL Le caratteristiche di pulizia, potenza e portabilità rendono semplice la realizzazione di compilatori compatti (si vocifera che alcuni compilatori potessero funzionare anche con soli 16 KB di memoria). Alcuni sistemi operativi vennero scritti, completamente o in parte, utilizzando BCPL (ad esempio il TRIPOS o l'AmigaOS). Università degli Studi di Napoli Parthenope SICSI V CICLO classe A042 1966 - BCPL La principale caratteristica che particolarmente portabile risiedeva logicamente diviso in due parti: rendeva il compilatore nel fatto che esso era la prima parte (frontend) si occupava di analizzare il codice sorgente e di generare un codice intermedio (O-code) per una macchina virtuale, la seconda (backend) traduceva l'O-code nel codice per la CPU bersaglio, su cui il programma doveva girare. In questo modo, quando era necessario scrivere un compilatore per una nuova CPU, era sufficiente riscrivere il backend. Questa tecnica divenne in seguito molto comune (ad esempio in Pascal o Java), ma il BCPL fu il primo linguaggio a specificare una macchina virtuale a questo scopo. Università degli Studi di Napoli Parthenope SICSI V CICLO classe A042 1966 - BCPL Il linguaggio si caratterizza per avere un unico tipo di dati, il tipo word (un numero fisso di byte, di solito scelto per allinearsi con la parola della macchina). L'interpretazione del dato veniva fatta in base al tipo di operatori utilizzati. Ad esempio, utilizzando il segno di addizione +, i dati venivano sommati come se si trattasse di numeri interi, mentre l'operatore ! (di dereferenziazione) trattava i dati come puntatori. Allo scopo di rendere la cosa possibile, l'implementazione del BCPL non prevedeva il type checking. Nel 1979 esistevano implementazioni di BCPL per almeno 25 diverse architetture, oggi il BCPL è stato interamente soppiantato dal C. Il BCPL è il linguaggio in cui si dice sia stato scritto il primo programma hello world. Università degli Studi di Napoli Parthenope SICSI V CICLO classe A042 La filosofia del BCPL può essere riassunta in queste righe, liberamente tradotte dal libro "BCPL, the language and its compiler": “La filosofia del BCPL non è quella del tiranno che pensa di sapere come vanno fatte le cose e detta ciò che è permesso e ciò che non lo è: piuttosto il BCPL è un servo che offre i suoi servigi al meglio delle sue possibilità, senza lamentarsi, anche quando si trova di fronte ad un'apparente contraddizione. Si assume che il programmatore sappia sempre quello che sta facendo: egli non è costretto a sottostare a rigidi vincoli.” Università degli Studi di Napoli Parthenope SICSI V CICLO classe A042 1970 - B Kenneth Thompson, quando progettò il linguaggio B per una prima implementazione di UNIX, stava cercando di semplificare ulteriormente il CPL. Egli riuscì a creare un linguaggio molto scarno che si adattava bene a essere utilizzato sull'hardware di cui disponeva. Tuttavia, sia per il BCPL sia per il B si esagerò troppo nella ottimizzazione, ottenendo così linguaggi limitati, utili solo per trattare alcuni tipi di problemi. Kenneth Thompson Università degli Studi di Napoli Parthenope SICSI V CICLO classe A042 Subito dopo che Ken Thompson ebbe implementato il linguaggio B, fu presentata una nuova macchina, chiamata PDP-11. UNIX e il compilatore B furono subito trasferiti sulla nuova macchina. Anche se la PDP-11 era una macchina più grande della precedente PDP-7, rimaneva ancora abbastanza piccola rispetto agli standard attuali: aveva soltanto 24 K di memoria, dei quali 16 K erano utilizzati dal sistema, e 512 K di disco fisso. Un PDP-7 come quello usato da Thompson per programmare il primo UNIX Si pensò di riscrivere UNIX in B, ma il linguaggio B era lento per il suo progetto interpretativo. C'era anche un altro problema: il B era orientato alla parola, ma la PDP-11 era orientata al byte. Per questi motivi, nel 1971 si cominciò a lavorare a un successore del B, chiamato C. Università degli Studi di Napoli Parthenope SICSI V CICLO classe A042 1972 - C Un collaboratore di Ken Thompson, Dennis Ritchie, restituì alcune generalità del BCPL al linguaggio B, con lo scopo di sviluppare una nuova versione, che venne ovviamente denominata "C". La potenza e flessibilità del C apparve subito evidente e per questo il sistema operativo di Unix, scritto in assembly, venne riscritto immediatamente in C. Dennis Ritchie Fino alla fine degli anni '70, il C invase molti college e università per il suo stretto legame con Unix e la disponibilità di un compilatore. Presto molte organizzazioni indipendenti iniziarono ad usare una loro versione di C, creando notevoli problemi di compatibilità. Università degli Studi di Napoli Parthenope SICSI V CICLO classe A042 Il C viene classificato come linguaggio ad alto livello, la scrittura delle istruzioni cioè, era indipendente dalla architettura del calcolatore su cui le istruzioni stesse saranno eseguite. Università degli Studi di Napoli Parthenope Ken Thompson con Dennis Ritchie SICSI V CICLO classe A042 Il grande successo del C è dovuto a diversi fattori: • La felice scelta del modo di astrazione dall'hardware, che pur essendo del tutto logico e generico rimane molto vicino all'hardware stesso. Infatti, il linguaggio C si basa su poche istruzioni chiave molto semplici, che spesso (come gli operatori di autoincremento, autodecremento e aritmetici con assegnazione) ricalcano l'assembly delle CPU e sono traducibili direttamente con una singola istruzione di linguaggio macchina; • Il ruolo centrale dato al concetto di puntatore. Questo viene generalizzato fino a concidere con l'indirizzamento indiretto, un modo di accedere alla memoria hardware, caratteristico di tutte le moderne CPU. Ciò rende il C un linguaggio particolarmente efficiente. Università degli Studi di Napoli Parthenope SICSI V CICLO classe A042 Rispetto al linguaggio assembly il C ha in più di una struttura logica definita e leggibile, funzioni in stile Pascal e soprattutto il controllo sui tipi, che manca completamente in assembly. La grammatica e la sintassi del C sono molto libere e flessibili, permettendo di scrivere istruzioni complesse e potenti in poche righe di codice (ma anche istruzioni assolutamente criptiche e illeggibili). In definitiva, il successo del C fu decretato dall'essere un linguaggio creato da programmatori esperti, per essere usato da programmatori esperti. Steve Johnson nella metà degli anni ‘70 scrisse un compilatore C trasportabile su sistemi diversi dal PDP-11 e da allora il C cominciò ad essere utilizzato come linguaggio in altri sistemi operativi come MS-DOS e CPM/80. Università degli Studi di Napoli Parthenope SICSI V CICLO classe A042 (1973 - 1980) Il primo compilatore che ebbe una certa diffusione era presente nella versione 6 (V6) di Unix per computer PDP-11 e solamente nel 1978 con il passaggio alla V7, Unix ed il C furono portati su macchine diverse dal PDP-11, e precisamente su Interdata 8/32 e VAX 11/780, quest’ultima con una nuova architettura a 32 bit. Università degli Studi di Napoli Parthenope SICSI V CICLO classe A042 Negli anni '80 i compilatori erano basati principalmente sul pcc di Johnson, ma nacquero molti compilatori indipendenti che non erano conformi al pcc, ma che permisero la diffusione del C praticamente su tutte le macchine più popolari; per questo il comitato ANSI (American Standards Institute) X3J11, nel 1983, iniziò a sviluppare uno standard per il linguaggio C, aggiungendo importanti caratteristiche ed ufficializzando molte caratteristiche presenti nei diversi compilatori. Università degli Studi di Napoli Parthenope SICSI V CICLO classe A042 Nel medesimo periodo ci fu un'altra importante standardizzazione che mirava a definire l'interfaccia tra linguaggio e sistema operativo. Prendendo spunto proprio dall'ANSI89, fu creata la "Portable Operating System Interface" (POSIX) ad opera dell'IEEE (Institute of Electrical and Electronics Engeneers) che definisce, inoltre, i concetti di thread, socket, estensioni realtime e molto altro, in modo unico e indipendente dall'implementazione Università degli Studi di Napoli Parthenope SICSI V CICLO classe A042 Questa grande libertà , la complessità sintattica del linguaggio (che come abbiamo visto contiene poche istruzioni di base) e il ruolo centrale dei puntatori, che è necessario usare praticamente fin dai primi programmi, ne fanno viceversa un linguaggio ostico e sconsigliabile ai neofiti, che cadono quasi subito in una serie di trappole che, se pure ovvie per un esperto, sono molto difficili da individuare ad un occhio inesperto. Università degli Studi di Napoli Parthenope SICSI V CICLO classe A042 Grazie alla particolare efficienza del codice prodotto dai sui compilatori, il C venne utilizzato per riscrivere la maggior parte del codice del sistema UNIX, riducendo l'uso dell'assembly ad un piccolo gruppo di funzioni. La sua importanza tuttavia, crebbe solo dopo il 1978 con la pubblicazione da parte di Brian Kernighan e Dennis Ritchie del libro The C Programming Language nel quale il linguaggio venne definito in modo preciso. Università degli Studi di Napoli Parthenope SICSI V CICLO classe A042 1980 - C++ Il C++ è un'estensione del C, sviluppato da Bjarne Stroustrup all'inizio degli anni '80, presso i Bell Laboratories. Il C++ fornisce una serie di funzioni che potenziano il C, ma, cosa ancora più importante, fornisce le capacità di gestione della programmazione di tipo object-oriented, con ampio utilizzo delle classi. Università degli Studi di Napoli Parthenope SICSI V CICLO classe A042 Il linguaggio C++ venne utilizzato all'esterno del gruppo di sviluppo di Stroustrup nel 1983 e, fino all'estate del 1987, il linguaggio fu soggetto a una naturale evoluzione. Uno degli scopi principali del C++ era quello di mantenere piena compatibilità con il C. L'idea era quella di conservare l'integrità di molte librerie C e l'uso degli strumenti sviluppati per il C. Università degli Studi di Napoli Parthenope SICSI V CICLO classe A042 Grazie all'alto livello di successo nel raggiungimento di questo obiettivo, molti programmatori trovano la transizione al linguaggio C++ molto più semplice rispetto alla transizione da altri linguaggi (ad esempio il FORTRAN) al C. Il C++ consente lo sviluppo di software su larga scala. Grazie a un maggiore rigore sul controllo dei tipi, molti degli effetti collaterali tipici del C, divengono impossibili in C++. Università degli Studi di Napoli Parthenope SICSI V CICLO classe A042 Il miglioramento più significativo del linguaggio C++ è il supporto della programmazione orientata agli oggetti (Object Oriented Programming: OOP). Per sfruttare tutti i benefici introdotti dal C++ occorre cambiare approccio nella soluzione dei problemi. Ad esempio, occorre identificare gli oggetti e le operazioni ad essi associate e costruire tutte le classi e le sottoclassi necessarie. Università degli Studi di Napoli Parthenope SICSI V CICLO classe A042 Nonostante negli anni il C sia stato implementato sia con lo standard ANSI, che in maniera proprietaria, grazie a questi strumenti il C è diventato (ed è tutt'oggi) il linguaggio più utilizzato al mondo, almeno fino all'avvento del C++ (chiamato originariamente "C con classi") che è stato anche la spinta del miglioramento nel tempo del C attraverso lo standard ANSI, di cui è stata rilasciata un'ultima versione denominata ANSI99, che è supportata dalle ultime versioni del gcc. Università degli Studi di Napoli Parthenope SICSI V CICLO classe A042 Il C ed il suo UNIX hanno influenzato tutto il mondo dell'informatica, considerando che da esso sono scaturiti colossi come SCO e Sun Microsytem, e prodotti come Linux e BSD. Università degli Studi di Napoli Parthenope SICSI V CICLO classe A042