Premessa
Negli anni mi è capitato tante volte di dover leggere codice C++ ma non ho mai avuto modo di approfondirlo per davvero: come molti ho sempre pensato che “se capisco C allora posso capire anche C++”. Effettivamente, questa teoria si è dimostrata valida permettendomi di analizziare il codice sorgente di software che utilizzo ogni giorno come Node.js o MongoDB (tutti e due scritti in C++).
Conosco un po’ di linguaggi e ne ho studiati molti di più di quelli che uso: perché allora non avevo mai studiato veramente C++? Forse perché la sua cattiva reputazione di linguaggio difficile, insicuro e obsoleto lo precede, e quindi studiarlo dovrebbe essere una fatica inutile.
La scorsa estate, però, ho deciso di colmare questa lacuna e, dopo vari approcci fallimentari con due diversi (e noiosi) volumi sull’argomento, mi sono imbattuto in C++ Crash Course di Josh Lospinoso.
Appena aperto il volume, le prime parole che ho trovato sono:
“C++ is a complicated language.” This is a reputation C++ has earned across a number of decades of use, and not always for the right reasons. […] The biggest problem C++ has is its reputation, and the second biggest problem is the lack of high-quality educations materials for learning it.
Esattamente la sintesi della mia esperienza.
Il contenuto del libro
Nelle prime pagine del libro vengono raccontate le peripezie che C++ ha dovuto affrontare, e superare, tra la fine degli anni 90 e i primi anni del 2000 per riuscire ad arrivare a noi oggi (è stato creato nel 1983 da Bjarne Stroustrup e nel 1998 è diventato uno standard - ISO/IEC 14882). Scopriamo così che il linguaggio ha ormai un ciclo di rilasci ben definito e pianificato (ogni tre anni: C++17, C++20, C++23, C++26, …) in modo da permettere a tutto l’ecosistema di aggiornarsi (es. compilatori, documentazione, libri…).
Alla prefazione iniziale ne segue un’altra intitolata “An Overture to C Programmers”: si tratta di venti pagine di panoramica del linguaggio dedicate agli sviluppatori C per fargli comprendere i vantaggi a lungo termine dell’apprendimento di C++. D’altronde, chi meglio di chi già è esperto di C può diventare velocemente produttivo con C++?
Il resto del libro è diviso in due grandi parti: la prima che si occupa del core del linguaggio e la seconda che spazia tra le librerie e i framework più utilizzati in C++ (es. Boost).
La prima parte è pensata per essere letta in modo sequenziale, perché inizia in modo tradizionale dedicando i primi capitoli al setup del compilatore e all’esplorazione dei tipi principali presenti nel linguaggio per procedere poi in modo sempre più spedito sfruttando quanto già spiegato. Nel terzo capitolo si passa direttamente al mondo dei puntatori e delle referenze che, tra tutti, rappresentano gli argomenti meno compresi da chi lavora con linguaggi che ne permettono l’uso; la trattazione è esaustiva e chiara per non lasciare spazio a dubbi o incomprensioni. Si passa poi al mondo degli oggetti, al loro ciclo di vita e ai vari tipi di polimorfismo supportari dal linguaggio. Negli ultimi tre capitoli della prima parte sono affrontati gli operatori, gli statement e le funzioni.
La prima parte rappresenta circa i 2/5 del volume ed è quella che fornisce gli strumenti per poter passare a quella successiva.
La seconda parte del libro si apre parlando di testing per proseguire poi con gli smart pointer (un argomento molto interessante per gli sviluppatori che vengono da linguaggi con la gestione automatica della memoria). Nei capitolo successivi sono spiegate le utilità (optional, pair, tuple, …) disponibili nel linguaggio, i container (non quelli Docker ma array, vettori, …) gli iteratori, le stringhe, gli stream, il filesystem, gli algoritmi, la concorrenza e il parallelismo, e la programmazione di rete (con Boost Asio). L’ultimo capitolo del libro è dedicato a come scrivere intere applicazioni affrontando tutte le tematiche del caso (parametri, cleanup, …).
La seconda parte rappresenta i 3/5 del volume ed è qui che vengono mostrate le vere potenzialità offerte da C++ e dal suo ecosistema.
È inutile riportare qui un indice più dettagliato degli argomenti trattati perché sono veramente tanti; è possibile però consultarlo direttamente sul sito dell’editore per farsi un’idea più precisa di quello che c’è al suo interno.
Il libro spiega come scrivere C++ moderno, in particolar modo usando tutte le novità introdotte fino alla versione C++17. Dove necessario vengono fatti approfondimenti per chiarire alcuni meccanismi storicamente noti e le differenze con quelli contemporanei mostrati nel libro che, nella maggior parte dei casi, sono molto più semplici da usare.
Sono presenti oltre 500 esempi di codice che mostrano utilizzi pratici di quello che viene spiegato a parole: questi esempi sono concisi e focalizzati esclusivamente sull’argomento in questione. Quando necessario sono mostrate tabelle, grafici e note: ognuno di questi elementi viene usato con il solo fine di chiarire l’argomento trattato o aggiungere dei dettagli importanti. Nonostante la dimensione del volume, lo spazio è sfruttato al massimo senza sprechi. Solo nel primo capitolo sono presenti alcuni piccoli screenshot per mostrare l’interazione con gli IDE; per tutto il resto del volume c’è soltanto codice, tanto codice.
Come dice il sottotitolo, questo libro è una “fast-paced introduction” (introduzione frenetica) a C++ ma, nonostante questa affermazione, le spiegazioni sono approfondite e dettagliate. Alla fine di ogni capitolo sono presenti riferimenti a altri libri per approfondire ulteriormente gli argomenti trattati e degli esercizi per mettere alla prova le conoscenze acquisite.
Leggerlo
La lettura del libro è scorrevole ma non richiede poco tempo visto la dimensione del volume e la vastità degli argomenti trattati. Per una lettura ragionata e con l’obiettivo di imparare il linguaggio non vi basterà qualche settimana ma avrete bisogno di mesi.
Pagina dopo pagina, se non conoscete già il C++ moderno, scoprirete un linguaggio veramente potente che farà sembrare la maggior parte degli altri linguaggi poco più che giocattoli.
La promessa di un’introduzione veloce e che non ha annoia ha un prezzo, ed è la necessità di seguire il libro con molta attenzione, mettendo in pratica quanto letto il prima possibile così da assimilarlo e comprenderlo.
Vale la pena leggerlo per chi non usa o non conosce C++?
Sì.
Passare attraverso le quasi 800 pagine (per 1,22 kg di peso) è un percorso che può avere solo due conclusioni: la prima è l’abbandono prematuro, l’altra è il raggiungimento dell’ultima pagina con la grande soddisfazione che ne consegue.
Probabilmente non lo leggerete una sola volta anzi, è certo che poi lo riprenderete in mano più volte per rileggere un capitolo o un punto in particolare che vi darà problemi durante la scrittura (o lettura) del codice. Questo accadrà sicuramente perché C++ è un linguaggio vasto e pieno di peculiarità che non è possibile ricordare leggendo il libro una sola volta e senza praticare.
Un altro valido motivo per leggerlo è comprendere cosa permette di fare un linguaggio che non mette limiti a quello che lo sviluppatore può fare: lasciandoci il controllo su ogni aspetto dell’esecuzione, diventiamo noi gli unici responsabili di quello che succede. Conoscere (o scoprire) questi meccanismi toglie il velo di magia da quello che fanno molti dei linguaggi con GC o sistemi automatici di protezione della memoria. Allo stesso modo ci permette di capire come il C++ permetta di raggiungere un livello di prestazioni molto più elevato della maggior parte degli altri linguaggi.
Se anche non pensate di utilizzare il C++ ogni giorno, la lettura del volume porta con sé notevole un bagaglio di conoscenze che vi tornerà utile per comprendere meglio il software che usate e realizzate ogni giorno (anche se non scritto in C++).
A chi è rivolto
Il libro è volutamente rivolto a sviluppatori che conoscono già almeno un altro linguaggio e che conoscono bene i concetti dei linguaggi di programmazione.
Per chi ha conoscenze limitate di sviluppo o per chi è alle prime armi con la programmazione, il volume potrebbe non essere pienamente compreso.
Se avete una conoscenza base/discreta di C, il libro sarà un impegnativo, ma bellissimo, viaggio.
A chi è consigliato
La dimensione del volume impone che il lettore abbia tempo, molto tempo da dedicare all’argomento. Non è quindi consigliato a chi vuole tutto e subito: nonostante l’approccio pratico e veloce, ci vorrà tempo per assimilarlo (ma questo è legato proprio all’argomento e non al volume). Non è nemmeno la lettura giusta per rilassarvi dopo cena o mentre siete in treno circondati da persone che parlano.
Se invece siete incuriositi di capire perché molti dei software che utilizziamo ogni giorno sono fatti in C++ (database, server, game engine, applicazioni di sistema…) o volete semplicemente capire come sviluppare applicazioni altamente performanti e efficienti, allora è un libro che fa per voi. A patto di investire sufficiente tempo ed energia nel seguire il percorso che il volume propone.
È consigliato anche a tutti quelli che vogliono andare oltre i luoghi comuni di Internet sull’argomento e dei linguaggi che ne parlano male con la sola ambizione di sostituirlo.
Note
Nella primavera 2025 arriverà la seconda edizione aggiornata con le novità introdotte nelle ultime versioni del linguaggio (C++20).
Esiste un’introduzone più snella a C++, scritta dal creatore del C++, chiamata C++ Guida alla scoperta del linguaggio aggiornata a C++20. Si tratta di un libro diverso, più leggero e meno impegnativo, che ha come unico obiettivo quello di fornire una panoramica del linguaggio (il titolo originale è infatti “A Tour of C++). Se siete indecisi potrebbe essere una buona idea leggerlo prima di passare a questo.
Titolo | C++ Crash Course |
Autori: | Josh Lospinoso |
ISBN | 9781593278885 |
Editore | Packt (2019) |
Recensito | da Alessandro Miliucci a ottobre 2024 |