C++ è il linguaggio C ad oggetti?

L’altra settimana, durante una chiacchierata con un mio studente, ho scoperto che all’università ha programmato in linguaggio C per superare un esame, e che il C++ non è stato oggetto delle lezioni… e che in fondo – mi ha confessato – in fin dei conti non gli è dispiaciuto, giacché – ipotizzava – “il C++ altro non è che il linguaggio C ad oggetti” (sue testuali parole).

Strana considerazione… o meglio, storia già sentita (e non solo da studenti, ma anche da alcuni ex colleghi di lavoro nonché da insegnanti d’informatica), ma nei fatti non è così: questo poteva essere vero fino al 1998 (anno in cui C++ è diventato “standard ANSI“), ossia 25 anni fa!

E mi rincresce ancor di più notare che tra i molti che sostengono questo, ci sono persone tutto sommato ancora giovani, segno che i loro docenti hanno insegnato loro pressappòco quello che loro stessi hanno a loro volta appreso 20 anni prima… ergo, sforzo per tenersi aggiornati: zero.

Ora, se erogate corsi di programmazione ma nel 2023 non sapete nulla di C++11 o di C++17, oppure pensate che siano solo “advanced concepts”, forse è il caso di studiare e aggiornarsi, oppure – in virtù dell’Onestà intellettuale che dovrebbe animare la didattica e l’insegnamento verso le generazioni di studenti presenti e future con cui ci si interfaccia, e che spesso pendono letteralmente dalle labbra di noi insegnanti e consulenti informatici – se non se ne ha voglia o tempo, è probabilmente il caso di dimettersi.

Tanto per cominciare, nelle specifiche del linguaggio C si parla di oggetti: quindi non sono entità sconosciute a tale linguaggio:
Basic concepts – cppreference.com, Objects and alignment, Declarations and expressions create, destroy, access, and manipulate objects. Each object, function, and expression in C is associated with a type

Confrontate la stessa pagina con quella relativa al C++: Object – cppreference.com

A questo punto prendete le specifiche del C++ reference – cppreference.com
E’ interessante osservare come più dei 3/4 di queste riguardano la libreria standard, e come l’intera libreria sia sviluppata in termini di un paradigma che non è basato sull’OOP, ma sulla programmazione generica.

Osserviamo anche che la libreria standard non è un “addendum”, ma una parte delle medesime specifiche tecniche del linguaggio: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/n4659.pdf, il che significa che non è possibile distribuire un compilatore privo della libreria standard chiamandolo banalmente C++.

Se poi osserviamo come le specifiche stesse del “core language” si sviluppano, noteremo (C++ language – cppreference.com) che la parte dedicata alle classi è solo una piccola parte dell’intera specifica.

Morale: che il linguaggio C non sia “orientato agli oggetti” è vero, ma sostenere a spada tratta che non li abbia è decisamente un bias cognitivo. Con più di 25 anni di storia, C++ e C sono ormai linguaggi profondamente diversi, con modalità e approcci allo sviluppo algoritmico del tutto differenti. Descrivere l’uno in termini dell’altro significa creare seri problemi alla preparazione dei futuri sviluppatori. E non sono il solo a sostenerlo:
CppCon 2015: Kate Gregory “Stop Teaching C”
CppCon 2017: Bjarne Stroustrup “Learning and Teaching Modern C++”

Il linguaggio C è utilizzato principalmente per realizzare i sistemi operativi e le loro utility, piuttosto che i programmi di controller, di driver e/o di sistemi embedded, viceversa, il linguaggio C++ è usato prevalentemente per scrivere le applicazioni native ospitate sui sistemi operativi: tra queste troviamo gli interpreti dei linguaggi dinamici e dei linguaggi a compilazione intermedia, i browser (Chrome, Firefox ecc..), i web server (Apache o similari), i motori dei grandi database nonché molti dei moderni sistemi di simulazione.

Non c’è comunque un confine netto, è più una questione di consuetudine. Benché i due linguaggi abbiano in comune alcuni costrutti sintattici, tuttavia i loro idiomi sono completamente diversi, e in genere non sono intercambiabili a piacere. Ma se preferite un confronto diretto, accedete a questa pagina, e facendo scorrere, noterete a colpo d’occhio cos’è il linguaggio C++ rispetto al C.