Home
Storia ed evoluzione di C++

10 Maggio 2023

Storia ed evoluzione di C++

di

L’evoluzione di C++ negli anni lo ha portato a diventare un punto di riferimento assoluto per i programmatori esperti e le applicazioni più importanti.

Nascita e crescita di uno standard della programmazione

Affrettati lentamente
(festina lente).
– Ottavio, Cesare Augusto

Ho inventato C++, ne ho scritto le prime definizioni e ho creato la sua prima implementazione. Ho scelto e formulato i criteri di progettazione di C++, progettato le principali caratteristiche del linguaggio e sviluppato o contribuito allo sviluppo di molte delle prime librerie, e per 25 anni sono stato responsabile dell’elaborazione delle proposte di estensione nel comitato degli standard di C++.

C++ è stato ideato per offrire i costrutti di Simula per l’organizzazione dei programmi insieme all’efficienza e alla flessibilità del C per la programmazione dei sistemi. Simula è la fonte dei meccanismi di astrazione di C++, e da qui proviene il concetto di classe (con classi derivate e funzioni virtuali). I template e le eccezioni, tuttavia, arrivarono in seguito a far parte di C++, provenendo da altre fonti di ispirazione.

L’evoluzione di C++ è sempre avvenuta nell’ambito del suo utilizzo. Ho passato molto tempo ascoltando gli utenti, richiedendo i pareri di programmatori esperti e, ovviamente, scrivendo codice. In particolare, i miei colleghi presso gli AT&T Bell Laboratories sono stati fondamentali per la crescita di C++ nel corso dei primi dieci anni.

Questa sezione offre una breve panoramica, che non si prefigge di menzionare tutte le singole caratteristiche del linguaggio e tutti i componenti della libreria, e non entra nei dettagli. Cerco di mantenere un collegamento tra i costrutti standard e le persone che li hanno proposti e migliorati. C++ non è l’opera di un comitato anonimo e senza volto, né di un presunto onnipotente dittatore a vita; si tratta invece del frutto del lavoro di molte persone dedicate, esperte e impegnate.

La maggior parte della documentazione prodotta nell’ambito degli standard ISO di C++ è disponibile online.

Cronistoria di C++

Il lavoro che ha condotto alla nascita di C++ è iniziato nell’autunno del 1979 con il nome C with Classes. Segue una cronologia semplificata.

  • 1979. inizio del lavoro sul C with Classes. Il set iniziale di caratteristiche include classi e classi derivate, controllo dell’accesso pubblico/privato, costruttori e distruttori, e dichiarazioni di funzioni con controllo dell’argomento. La prima libreria supporta task concorrenti senza prelazione e generatori di numeri casuali.
  • 1984. Il C with Classes viene rinominato C++. C++ a quel punto aveva acquisito funzioni virtuali, sovraccaricamento di funzioni e operatori, riferimenti, e le librerie dei flussi I/O e dei numeri complessi.
  • 1985. Prima versione commerciale di C++ (14 ottobre). La libreria comprendeva flussi I/O, numeri complessi e task (scheduling senza prelazione).
  • 1985. Esce The C++ Programming Language (TC++PL, 14 ottobre).
  • 1989. Esce The Annotated C++ Reference Manual (the ARM).
  • 1991. Esce C++ Programming Language, Second Edition, che presenta la programmazione generica con uso di template e gestione degli errori basata sulle eccezioni, incluso l’idioma generale per la gestione delle risorse Resource Acquisition Is Initialization.
  • 1997. Esce C++ Programming Language, Third Edition che introduce C++ ISO, con namespace, dynamic_cast e molti miglioramenti dei template. La libreria standard aggiunge il framework STL di contenitori e algoritmi generici.
  • 1998. Standard ISO di C++.
  • 2002. Inizio del lavoro su una revisione dello standard, informalmente chiamata C++0x.
  • 2003. Viene pubblicata una bug-fix release dello standard ISO di C++.
  • 2011. Standard ISO di C++11 che offre inizializzazione uniforme, semantiche di spostamento, tipi dedotti dagli inizializzatori (auto), range-for, template variadici, espressioni lambda, alias dei tipi, un modello di memoria adatto per la concorrenza, e molto altro. La libreria standard aggiunge thread, lock, espressioni regolari, tabelle hash (unordered_map), puntatori per la gestione delle risorse (unique_ptr e shared_ptr), e altro ancora.
  • 2013. Prime implementazioni complete di C++11.
  • 2013. The C++ Programming Language, Fourth Edition presenta C++11.
  • 2014. Standard ISO di C++14 che completa C++11 con template di variabili, separatori di cifre, lambda generiche e alcuni miglioramenti della libreria standard. Vengono completate le prime implementazioni di C++14.
  • 2015. Partenza del progetto The C++ Core Guidelines.
  • 2017. Standard ISO di C++17 che offre una gamma di nuove caratteristiche, tra cui garanzie dell’ordine di valutazione, associazione strutturata, espressioni fold, una libreria per i file system, algoritmi paralleli, e tipi variant e optional. Vengono completate le prime implementazioni di C++17.
  • 2020. Standard ISO di C++20 che offre module, concept, coroutine, intervalli, formattazione in stile printf(), calendari, e molte altre caratteristiche secondarie. Vengono completate le prime implementazioni di C++20.

Nel corso del suo sviluppo, C++11 era noto come C++0x. Come spesso accade nel caso di vasti progetti, siamo stati eccessivamente ottimisti sulla data di completamento. Verso la fine, scherzando dicevamo che la x in C++0x era esadecimale, e in questo modo C++0x diventava C++0B. In compenso, il comitato ha consegnato puntualmente C++14, C++17 e C++20, come hanno fatto i principali fornitori di compilatori.

I primi anni

Inizialmente ho progettato e implementato il linguaggio con l’obiettivo di distribuire i servizi di un kernel UNIX su multiprocessori e reti locali (ora noti come multicore e cluster). A tal fine, dovevo specificare con precisione le parti di un sistema e come comunicavano tra loro. Simula sarebbe stato ideale per questo scopo, tranne che per l’aspetto relativo alle prestazioni. Dovevo anche occuparmi direttamente dell’hardware e fornire meccanismi di programmazione concorrente ad alte prestazioni, per cui il C sarebbe stato ideale, salvo che per la debolezza nel supporto alla modularità e al controllo dei tipi. Il risultato derivante dall’aggiunta di classi in stile Simula al linguaggio C, ossia il C with Classes, è stato usato per importanti progetti che hanno messo a dura prova i suoi costrutti per la scrittura di programmi che usassero il minimo del tempo e dello spazio. A questo linguaggio mancavano ancora il sovraccaricamento degli operatori, i riferimenti, le funzioni virtuali, i template, le eccezioni e moltissimi altri dettagli. Il primo utilizzo di C++ all’esterno di un’organizzazione di ricerca iniziò nel luglio 1983.

Il nome C++ venne coniato da Rick Mascitti nell’estate del 1983 e da me scelto in sostituzione di C with Classes. Il nome rappresenta la natura evolutiva dei cambiamenti rispetto al C; ++ è l’operatore di incremento del C. Il nome abbreviato C+ è un errore di sintassi, ed è stato usato anche come nome di un linguaggio senza alcun legame. Gli esperti della semantica del C considerano C++ inferiore a ++C. Il linguaggio non venne chiamato D in quanto si trattava di un’estensione del C, perché non cercava di rimediare ai problemi eliminando caratteristiche e perché esistevano svariati aspiranti successori del C chiamati D.

Leggi anche: Piccolo vocabolario di programmazione

C++ è stato fondamentalmente progettato affinché io e i miei amici potessimo evitare di programmare in assembler, in C o nei diversi linguaggi di alto livello all’epoca in voga. Il suo scopo principale era rendere la scrittura di buoni programmi più semplice e più piacevole per il singolo programmatore. Nei primi anni, non esisteva alcuna pianificazione preliminare di C++: progetto, documentazione e implementazione procedevano simultaneamente. Non c’era neppure un progetto C++, né un comitato del progetto C++. Nel corso del tempo, C++ si è evoluto per far fronte ai problemi incontrati dagli utenti e come risultato delle discussioni tra i miei amici, i miei colleghi e me.

Costruttori e distruttori

Il primissimo progetto di C++ includeva dichiarazioni di funzioni con controllo del tipo dell’argomento e conversioni implicite, classi con la distinzione public/private tra interfaccia e implementazione, classi derivate, costruttori e distruttori. Utilizzai le macro per fornire una parametrizzazione primitiva. Verso la metà del 1980 iniziò l’uso non sperimentale di questo linguaggio. Più avanti nello stesso anno fui in grado di presentare un set di funzionalità del linguaggio che supportavano un set coerente di stili di programmazione. In retrospettiva, considero molto significativa l’introduzione di costruttori e distruttori. Nella terminologia dell’epoca:

Una “funzione new” crea l’ambiente di esecuzione per le funzioni membro;
la “funzione delete” fa l’opposto.

Poco dopo, la funzione new e la funzione delete vennero rinominate costruttore e distruttore.

È questa l’origine delle strategie di C++ per la gestione delle risorse (causa di una richiesta di eccezioni) e la chiave di molte tecniche per rendere il codice utente conciso e chiaro. Se a quel tempo vi fossero altri linguaggi che supportavano costruttori multipli in grado di eseguire codice generale, non ne ero (e non ne sono) a conoscenza. I distruttori erano una novità di C++.

La versione commerciale

La versione commerciale di C++ è stata rilasciata nell’ottobre 1985. A quel punto, avevo aggiunto inlining, const, sovraccaricamento delle funzioni, riferimenti, sovraccaricamento degli operatori] e funzioni virtuali. Tra tutte queste caratteristiche, la più controversa era il supporto al polimorfismo in fase di esecuzione nella forma di funzioni virtuali. Ne conoscevo già da Simula il valore, ma mi era impossibile convincere gran parte dei programmatori di sistema, che avevano la tendenza a considerare con sospetto le chiamate a funzione indirette, e chi era abituato ad altri linguaggi che supportavano la programmazione orientata agli oggetti aveva difficoltà a credere che le funzioni virtual fossero abbastanza veloci da essere utili nel codice di sistema.

Al contrario, molti programmatori con un background di programmazione orientata agli oggetti hanno avuto (e molti ancora hanno) difficoltà ad abituarsi all’idea che le chiamate di funzioni virtuali si utilizzino solo per esprimere una scelta che va fatta in fase di esecuzione. La resistenza alle funzioni virtuali può essere correlata a una resistenza all’idea che si possano ottenere sistemi migliori attraverso una struttura più regolare del codice supportata da un linguaggio di programmazione. Molti programmatori C sembrano convinti che ciò che conta davvero sia una completa flessibilità e un’attenta elaborazione individuale di tutti i dettagli di un programma. La mia opinione era (ed è) che abbiamo bisogno di tutto l’aiuto che possiamo ottenere da linguaggi e strumenti: la complessità intrinseca dei sistemi che stiamo cercando di costruire è sempre al limite di ciò che possiamo esprimere.

Le prime documentazioni descrivevano C++ come segue:

C++ è un linguaggio di programmazione che:

  • è meglio del C;
  • supporta l’astrazione dei dati;
  • supporta la programmazione orientata agli oggetti.

Si noti che non ho detto che C++ è un linguaggio di programmazione orientato agli oggetti. La definizione supporta l’astrazione dei dati si riferisce a information hiding (occultamento delle informazioni), classi che non fanno parte delle gerarchie di classi e programmazione generica. All’inizio, la programmazione generica era inadeguatamente supportata dall’uso delle macro. Template e concetti vennero introdotti molto più avanti.

Nomi importanti

Gran parte della progettazione di C++ è stata fatta sulle lavagne dei miei colleghi. Nei primi anni, sono stati fondamentali i riscontri ricevuti da Stu Feldman, Alexander Fraser, Steve Johnson, Brian Kernighan, Doug McIlroy e Dennis Ritchie.

Nella seconda metà degli anni Ottanta, ho continuato ad aggiungere nuove funzionalità del linguaggio in risposta ai commenti degli utenti e seguendo i miei obiettivi generali per C++. Tra questi i più importanti erano i template e la gestione delle eccezioni, considerati come sperimentali nel momento in cui iniziò il lavoro per gli standard.

Per quanto riguarda la progettazione dei template, sono stato costretto a decidere tra flessibilità, efficienza e controllo dei tipi anticipato. All’epoca, nessuno era in grado di ottenere contemporaneamente tutte e tre queste caratteristiche. Per poter competere con il codice in stile C per applicazioni di sistema complesse, ho ritenuto di dover scegliere le prime due proprietà. A posteriori, penso di aver effettuato la scelta corretta, e l’ininterrotta ricerca per un migliore controllo dei tipi per i template ha portato ai concetti di C++20. La progettazione relativa alle eccezioni era incentrata sulla loro propagazione multilivello, sul passaggio di informazioni arbitrarie a un gestore degli errori e sull’integrazione tra eccezioni e gestione delle risorse con l’utilizzo di oggetti locali con distruttori per rappresentare e rilasciare risorse. Chiamai grossolanamente questa tecnica fondamentale Resource Acquisition Is Initialization, che presto venne ridotto da altri nell’acronimo RAII.

Ho generalizzato i meccanismi di ereditarietà di C++ in modo che supportassero classi base multiple. Questo principio venne chiamato ereditarietà multipla e ritenuto difficile e controverso. L’ho considerato molto meno importante dei template o delle eccezioni. L’ereditarietà multipla delle classi astratte (spesso dette interfacce) è ora universale nei linguaggi che supportano il controllo dei tipi statici e la programmazione orientata agli oggetti.

Aspetti evolutivi di C++

Il linguaggio C++ si è evoluto di pari passo con alcuni costrutti chiave della libreria. Per esempio, ho progettato le classi complex, vector, stack e (I/O) stream insieme con i meccanismi di sovraccaricamento degli operatori. Le prime classi string e list vennero sviluppate da Jonathan Shopiro e da me nell’ambito del medesimo lavoro. Le classi string e list di Jonathan furono le prime a essere usate ampiamente come parti di una libreria. Abbiamo dovuto purtroppo aspettare fino al 2011 (30 anni!) per ottenere il supporto alla concorrenza standardizzato e universalmente disponibile. Le coroutine fanno parte di C++20. Lo sviluppo del costrutto dei template è stato influenzato da una gamma di template vector, map, list e sort ideati da Andrew Koenig, Alex Stepanov, me e altri.

La più importante innovazione nella libreria standard del 1998 è stata l’STL, un framework di algoritmi e contenitori, frutto del lavoro di Alex Stepanov (con Dave Musser, Meng Lee e altri), sulla base di oltre dieci anni di lavoro sulla programmazione generica. L’STL ha avuto un’enorme influenza sulla community C++ e non solo.

C++ si è evoluto in un ambiente con una moltitudine di linguaggi di programmazione sia affermati che sperimentali (per esempio Ada, Algol 68 e ML). All’epoca utilizzavo senza problemi circa 25 linguaggi diversi, che hanno influito su C++. Tuttavia, le influenze determinanti sono sempre derivate dalle applicazioni che ho incontrato. Era una mia precisa politica che l’evoluzione di C++ fosse orientata al problema piuttosto che imitativa.

Gli standard ISO di C++

La crescita esponenziale dell’uso di C++ ha provocato alcuni cambiamenti. A un certo punto, nel corso del 1987, risultò chiaramente come fosse inevitabile una standardizzazione formale di C++ e che dovevamo quindi iniziare a gettarne le basi. Il risultato fu uno sforzo consapevole di mantenere il contatto tra gli implementatori dei compilatori C++ e i loro utenti principali. Questo avvenne tramite scambio di documenti, email e incontri di persona alle conferenze su C++ e altrove.

Gli AT&T Bell Labs offrirono un importante contributo a C++ e alla sua community allargata, consentendomi di condividere le bozze delle revisioni del manuale di riferimento di C++ con implementatori e utenti. Dato che molti di loro lavoravano per aziende potenzialmente concorrenti di AT&T, non è da sottovalutare la rilevanza di questo contributo. Un’azienda meno illuminata avrebbe potuto causare problemi di frammentazione del linguaggio, semplicemente non facendo nulla. Invece avvenne che un centinaio circa di persone, appartenenti a dozzine di organizzazioni diverse, ebbero la possibilità di leggere e commentare quello che divenne il manuale di riferimento generalmente riconosciuto e la documentazione di base per la standardizzazione ANSI di C++. Si possono trovare i loro nomi in The Annotated C++ Reference Manual (ARM).

Il comitato X3J16 ANSI venne convocato nel dicembre 1989 su iniziativa di Hewlett-Packard, DEC e IBM con il supporto di AT&T. Nel giugno 1991, questa standardizzazione ANSI (nazionale americana) di C++ divenne parte di un impegno di standardizzazione ISO (internazionale) di C++. Il comitato ISO per C++ è chiamato WG21. Dal 1990 in poi, questi comitati congiunti per gli standard di C++ hanno costituito il forum principale per l’evoluzione di C++ e per il perfezionamento della sua definizione. Ho sempre fatto parte di questi comitati; in particolare, come responsabile del gruppo di lavoro per le estensioni (in seguito chiamato evolution group) dal 1990 al 2014, ero direttamente responsabile per la gestione delle proposte di modifiche significative a C++ e per l’aggiunta di nuove funzionalità del linguaggio. Nell’aprile 1995 venne prodotta una bozza iniziale dello standard per la revisione pubblica. Il primo standard ISO di C++ standard (ISO/IEC 14882-1998) è stato ratificato con un voto nazionale 22-0 nel 1998. Una bug-fix release di questo standard venne pubblicata nel 2003, per questo a volte può capitare di sentirlo chiamare C++03, ma si tratta essenzialmente dello stesso linguaggio e libreria standard di C++98.

C++11, per anni conosciuto come C++0x, è frutto dell’impegno del WG21. Questo comitato ha lavorato con procedure e processi autoimposti sempre più onerosi, che hanno probabilmente portato a una specifica migliore (e più rigorosa), ma hanno anche limitato l’innovazione. Una bozza iniziale dello standard per la revisione pubblica venne prodotta nel 2009. Il secondo standard ISO di C++ (ISO/IEC 14882-2011) è stato ratificato con un voto nazionale 21-0 nell’agosto 2011.

Una delle ragioni del lungo intervallo di tempo tra i due standard consiste nel fatto che la maggior parte dei membri del comitato (me compreso) avevano l’errata convinzione che le regole ISO prevedessero un periodo di attesa dopo l’emissione di uno standard prima che si potesse iniziare a lavorare su nuove funzionalità. Di conseguenza, un serio impegno per sviluppare nuove caratteristiche del linguaggio non ebbe inizio prima del 2002. Altre ragioni includono le aumentate dimensioni dei linguaggi moderni e delle loro librerie di base. In termini di pagine di testo degli standard, il linguaggio aumentò circa del 30 percento e la libreria standard circa del 100 percento. Gran parte di questo incremento fu dovuto da specifiche più dettagliate, piuttosto che da nuove funzionalità. Inoltre, il lavoro su un nuovo standard di C++ richiedeva ovviamente estrema attenzione per non compromettere il codice precedente con modifiche incompatibili. Ci sono miliardi di righe di codice C++ in uso che il comitato non doveva intaccare. La stabilità nel corso dei decenni è una funzionalità essenziale.

Il momento di C++11

C++11 ha portato a notevoli aggiunte alla libreria standard e al completamento del set di funzionalità necessarie a uno stile di programmazione che è una sintesi di quei paradigmi e idiomi che si erano dimostrati efficaci in C++98.

Gli obiettivi generali per C++11 erano:

  • rendere C++ un linguaggio migliore per la programmazione dei sistemi e la creazione di librerie;
  • rendere C++ più semplice per l’insegnamento e l’apprendimento.

Uno sforzo significativo è stato dedicato a rendere la programmazione dei sistemi concorrenti sicura rispetto ai tipi (type-safe) e portabile, e ciò ha comportato un modello di memoria e un supporto per la programmazione senza lock (lock-free). Questo lavoro è stato svolto da Hans Boehm, Brian McKnight e altri nel gruppo di lavoro per la concorrenza. Abbiamo inoltre aggiunto la libreria thread.

Dopo C++11, fu raggiunto un ampio consenso sul fatto che 13 anni tra uno standard e l’altro fossero davvero troppi. Herb Sutter propose che il comitato adottasse una politica di emissione puntuale a intervalli regolari, il modello treno. Io ho sostenuto con forza un intervallo breve tra gli standard per ridurre al minimo la possibilità di ritardi, causato dall’insistenza di qualcuno per avere più tempo e consentire così l’inclusione di ancora una sola funzionalità essenziale.

Ci accordammo su un ambizioso programma di 3 anni, con l’idea di alternare minor release e major release.

C++14 è stata di proposito una minor release che mirava a completare C++11. Questo rispecchia il fatto che, con una data fissa di release, ci saranno funzionalità che sappiamo di voler includere, ma che non riusciremo a consegnare in tempo. Inoltre, una volta diffusone l’uso, inevitabilmente verranno alla luce lacune nel set di funzionalità.

Le release più recenti

C++17 avrebbe dovuto essere una major release. Con il termine major intendo che contiene funzionalità che cambieranno il modo in cui pensiamo alla struttura del nostro software e al modo in cui lo progettiamo. Secondo questa definizione, C++17 è stato al massimo una medium release. Includeva molte estensioni minori, ma le funzionalità che avrebbero comportato cambiamenti radicali (per esempio concetti, moduli e coroutine) erano o non ancora pronti o anche bloccati perché oggetto di controversie e per carenza di indicazioni direttive. Di conseguenza, C++17 include qualcosa per tutti, ma niente che modifichi in maniera significativa la vita di un programmatore C++ che avesse già appreso gli insegnamenti di C++11 e di C++14.

C++20 offre le funzionalità principali necessarie e da tempo promesse, quali moduli, concetti, coroutine, range e molte altre minori. Si tratta di un miglioramento decisivo per C++, come lo era stato C++11. È diventato ampiamente disponibile verso la fine del 2021.

C++, di Bjarne Stroustrup

Tutto quello che serve sapere sulla versione 20 dello standard su cui si basa il linguaggio di programmazione C++.

Il comitato per gli standard ISO di C++, il SC22/WG21, attualmente conta circa 350 membri, di cui circa 250 hanno partecipato all’ultimo incontro di persona prima della pandemia, a Praga, nel corso del quale è stato approvato C++20 con un voto unanime di 79-0, in seguito ratificato da una votazione nazionale di 22-0. Ottenere quel livello di consenso in un gruppo così ampio e differenziato è davvero impegnativo. I rischi includono il cosiddetto design by committee, eccesso di funzionalità, mancanza di coerenza nello stile e decisioni miopi. Compiere passi avanti verso un linguaggio più semplice da usare e più coerente è molto complicato. Il comitato ne è consapevole e cerca di contrastare queste difficoltà. A volte ci riusciamo, ma è molto difficile evitare le complessità che si insinuano nel lavoro dalle utili funzionalità secondarie, dalle mode e dal desiderio degli esperti di occuparsi direttamente di rari casi particolari.

Gli standard e lo stile

Uno standard dice cosa funzionerà, e come. Non dà indicazioni su cosa costituisce un uso valido ed efficace. Esistono differenze significative tra la comprensione dei dettagli tecnici delle funzionalità di un linguaggio di programmazione e l’utilizzo efficace di queste in combinazione con altre funzionalità, librerie e strumenti per produrre un software migliore. Con migliore intendo più manutenibile, meno propenso agli errori e più veloce.

Dobbiamo sviluppare, divulgare e supportare stili di programmazione coerenti. Dobbiamo inoltre sostenere l’evoluzione del codice precedente verso questi stili più moderni, efficaci e coerenti.

Con la crescita del linguaggio e della sua libreria standard, è diventato cruciale il problema della diffusione di stili di programmazione efficaci. Convincere vasti gruppi di programmatori a lasciare qualcosa che funziona per qualcosa di meglio è un compito molto arduo. C’è ancora chi vede C++ come un C con qualche minore aggiunta, e chi considera gli stili di programmazione orientata agli oggetti degli anni Ottanta del secolo scorso, basati su enormi gerarchie di classi, come l’apice dello sviluppo. Molti hanno ancora difficoltà a utilizzare adeguatamente il moderno C++ in ambienti con grande quantità di codice vecchio C++. Per contro, ci sono molti che, presi dall’entusiasmo, eccedono nell’uso di nuovi costrutti. Per esempio, alcuni programmatori sono convinti che sia vero C++ solo il codice in cui si utilizzi in maniera massiccia la metaprogrammazione template.

Una modernizzazione ambiziosa

Che cos’è il Modern C++? Nel 2015, ho cercato di rispondere a questa domanda sviluppando un insieme di linee guida per la programmazione sorrette da motivazioni articolate. Mi resi conto ben presto di non essere l’unico alle prese con questo problema e, insieme a persone provenienti da varie parti del mondo, in particolare da Microsoft, Red Hat e Facebook, diedi inizio al progetto C++ Core Guidelines. Si tratta di un progetto ambizioso, che mira alla completa sicurezza dei tipi e delle risorse, come base per un codice più semplice, veloce, sicuro e manutenibile. Le linee guida sono integrate, oltre che da specifiche regole di programmazione con relative motivazioni, da strumenti di analisi statica e da una piccola libreria di supporto. Considero un progetto di questo genere necessario affinché l’intera community C++ arrivi a beneficiare dei miglioramenti nelle funzionalità del linguaggio, nelle librerie e negli strumenti di supporto.

Uso di C++

C++ è un linguaggio di programmazione attualmente molto diffuso. Il numero dei suoi utenti è cresciuto rapidamente da uno nel 1979 a circa 400 mila nel 1991; questo significa che il numero degli utenti è raddoppiato ogni 7,5 mesi circa per più di un decennio. Ovviamente, il tasso di crescita è rallentato dopo il picco iniziale, ma è attendibile stimare che ci fossero circa 4,5 milioni di programmatori in C++ nel 2018, e probabilmente un milione in più nel 2022. Gran parte dell’aumento avvenne dopo il 2005, quando si interruppe l’esplosione esponenziale della velocità dei processori e di conseguenza crebbe l’importanza delle prestazioni del linguaggio. Una tale diffusione di C++ venne raggiunta senza alcuna azione formale di marketing e senza una community di utenti organizzata.

C++ è soprattutto un linguaggio industriale, ovvero è più rilevante nell’industria che nell’istruzione o nella ricerca sui linguaggi di programmazione. Si sviluppò nei Bell Labs ispirato dalle varie e stringenti esigenze delle telecomunicazioni e della programmazione di sistemi (inclusi driver di dispositivi, reti e sistemi embedded). A partire da qui, l’uso di C++ si è diffuso praticamente in tutti i settori industriali: microelettronica, applicazioni web e infrastrutture, sistemi operativi, finanza, medicina, industria automobilistica, settore aerospaziale, fisica delle particelle, biologia, produzione di energia, machine learning, video game, grafica, animazione, realtà virtuale e molto altro ancora. Viene usato soprattutto per problemi che richiedono le capacità combinate di C++ di utilizzare efficacemente l’hardware e di gestire la complessità, e sembra proprio che questo tipo di applicazioni continui ad aumentare.

Il modello di C++

Il linguaggio C++ può essere sintetizzato come un insieme di funzionalità che si sostengono a vicenda:

  • un sistema di tipi statici con pari supporto per i tipi incorporati e per i tipi definiti dall’utente;
  • semantica dei valori e dei riferimenti;
  • gestione sistematica e generale delle risorse (RAII);
  • supporto a un’efficace programmazione orientata agli oggetti;
  • supporto alla programmazione generica flessibile ed efficace;
  • supporto alla programmazione in fase di compilazione;
  • uso diretto delle risorse della macchina e del sistema operativo;
  • supporto alla concorrenza attraverso le librerie (spesso implementate con l’uso di tipi intrinseci).

I componenti della libreria standard forniscono un ulteriore fondamentale supporto a questi obiettivi di alto livello.

Questo articolo richiama contenuti da C++.

Immagine di apertura di Alexandru Acea su Unsplash.

L'autore

  • Bjarne Stroustrup
    Bjarne Stroustrup è l'ideatore del linguaggio di programmazione C++. Autore noto a livello internazionale e professore alla Columbia University, in passato ha lavorato per AT&T Bell Labs, Texas A&M University e Morgan Stanley. Ha ricevuto numerosi riconoscimenti, tra cui il Charles Stark Draper Prize for Engineering della National Academy of Engineering.

Iscriviti alla newsletter

Novità, promozioni e approfondimenti per imparare sempre qualcosa di nuovo

Gli argomenti che mi interessano:
Iscrivendomi dichiaro di aver preso visione dell’Informativa fornita ai sensi dell'art. 13 e 14 del Regolamento Europeo EU 679/2016.

Libri che potrebbero interessarti

Tutti i libri

C++

Guida alla scoperta del linguaggio aggiornata a C++20

33,25

35,00€ -5%

di Bjarne Stroustrup