venerdì 12 dicembre 2014

Modern C++ - Prefazione

Benvenuta/o e grazie per esser giunta/o qui sulle pagine di The Secrets of Ubuntu / Lubit Blog.
Da oggi inizia una serie di appuntamenti, a cadenza settimanale (o almeno ci provo), grazie anche a Luigi Bit3Lux per avermi accolto nel suo blog, su uno dei linguaggi di programmazione piú discussi ed importanti nella storia dell'informatica, ovvero C++.
Questo linguaggio, considerato di origini oserei dire "preistoriche", vista la sua data di nascita (1979 - "C with Classes", 1983 - ridenominato ufficialmente in "C++"), nato dalla geniale mente di Bjarne Stroustrup e basato sull'ancora piú vetusto C (1969-1973 - Dennis Ritchie), è alla base di tutto ció  che utilizziamo in ambito informatico oggigiorno: sistemi operativi, software di grafica, giochi, smartphones, internet of things, siti web (ad esempio, anche Facebook utilizza C++ ) ed è il precursore di linguaggi moderni e considerati piú alla moda (es. Python, Java, Ruby, Go).

Perché insistere con C++ se ci sono linguaggi piú moderni? Una delle tante possibili risposte è la seguente: C++ (insieme a C) risulta ancora oggi uno dei linguaggi di programmazione orientato alle prestazioni e all'efficienza del software creato. Il kernel Linux basicamente è sviluppato in C, ma è possibile utilizzare anche alcune strutture/metodologie di C++: non si esclude che in futuro possa esser riscritto interamente in C++. Inoltre, C++ è uno standard de facto (la standardizzazione è avvenuta nel 1998).
Certamente, il linguaggio in sé, proprio come i linguaggi naturali, si è evoluto nel tempo e il 2011 ha segnato una data importante nella storia, poiché un nuovo standard, denominato C++11, è stato rilasciato e con esso si sono aggiunte tantissime novitá che hanno non solo portato piú funzionalitá, ma consentono allo sviluppatore di scrivere codice piú performante e piú semplice, quasi sulla falsa riga dei linguaggi moderni. Sulla base di questo fondamentale aggiornamento, costato anni di lavoro, uno degli autori piú conosciuti del settore, Scott Meyers, ha coniato il termine Modern C++, adottato ormai da quasi la totalitá della community per riferirsi a questo nuovo modo di approcciarsi al linguaggio.
Nel 2014 è stato rilasciato un nuovo aggiornamento, definito C++14, non ancora supportato dagli strumenti di sviluppo allo stato attuale. Pertanto, come riferimento per questo corso, si utilizzerá C++11, supportato ampiamente da strumenti di sviluppo aggiornati per tutti i sistemi operativi (Windows, Linux, MacOS X).

Compito di questa serie di appuntamenti è quella di avvicinare neofiti alla programmazione in Modern C++ e magari fornire una rinfrescata a chi giá conosce il linguaggio. Il corso non è focalizzato esclusivamente sul puro e duro linguaggio in sè, ma su uno degli esistenti ecosistemi che guidano alla creazione di progetti piú o meno complessi: impareremo ad usare tools e librerie quali CMake, git, Qt5 e (se c'è tempo e spazio) OpenCV.

Non sará argomento del corso l'installazione del sistema operativo. Il sistema operativo di riferimento sará Lubit Eagle 4.0, ma una qualsiasi distribuzione derivata da Ubuntu va benissimo.

Poiché molte delle risorse e librerie propongono nomi e documentazione prettamente in inglese, si suggerisce una conoscenza basilare della lingua inglese.

Detto questo, mi farebbe piacere comunque ricevere feedback e magari idee su progetti da presentare e sviluppare insieme; volta per volta vi chiederó di compilare un piccolo questionario (tempo di compilazione: meno di 30 secondi) circa la comprensione, la qualitá del corso, idee future.

Alla prossima puntata :-)



12 commenti:

  1. Splendido, una occasione unica per apprendere e continuare a sognare... Grazie :-)

    RispondiElimina
  2. Ottimo, segnalo subito ai miei lettori.
    E se fai le cose semplici riuscirò a seguirti anch'io ;-)

    RispondiElimina
  3. Graziee.. è da anni che uso linux e mi affascina capire come funziona il mondo della programmazione...

    RispondiElimina
  4. Si è no. Per la bocca dei loro stessi autori python è stato influenzato più che altro da Modula e Ruby da perl e Smalltalk.
    Facebook usa il C++ ma usa anche tantissimo php. (o meglio una propria versione HipHop).
    Grazie a jit sempre più evoluti qualsiasi linguaggio va più o meno bene specie in campo desktop dove la maggior parte del tempo il software lo passa in idle.
    Le "grandi performance" del C++ le puoi anche perdere velocemente a seconda del framework... prendi QT: ha un runtime peso, ha tutte i metodi virtuali e genera un sacco di codice in più per il meccanismo signals <-> slots.
    Il C++ oggi? Per me solo in determinati ambienti. Tipo i giochi. Anzi il motore che poi per la logica in molti usano lua / squirrel / un qualsiasi altro linguaggio di scripting.

    RispondiElimina
    Risposte
    1. Grazie del feedback Michelangelo!
      Vero, Facebook usa tanto PHP, ma usa HipHop PHP, ovvero un codice PHP generato da C++.
      Qt è pesante per il runtime ma al tempo stesso l'asincronicitá e la gestione dei thread offre spunti interessanti.

      Elimina
    2. Diciamo un codice C++ generato da PHP... un "codice PHP generato da C++" avrebbe pochissimo senso :-) ma sicuramente volevi scrivere un codice PHP che genera C++
      Mi pare lo facesse anche il visualbasic 5 di generare del codice C++ intermedio, il compilatore poi è arrivato con la versione 6 giusto in tempo per morire grazia .NET
      Ma di metacompilatori ce ne sono a partire da google che ne usa 2: gwt da java a javascript e j2objc: da java ad objective-c, etc...
      Ma non è che sono contro il C++ ci mancherebbe altro.. è che ormai per lavoro e passione mi sono specializzato diciamo in python e js. (E una puntina di PHP volendo).

      Elimina
  5. > kernel Linux di Lubit è sviluppato in C/C++
    Non è corretto. Il kernel di Linux è in C; viene utilizzata qualche estensione di GCC, ma senz'altro non è scritto in C++.
    E' una questione a lungo dibattuta (e sono sicuro che ritornerà in auge l'argomento); ma al momento si è deciso che il linguaggio sia C. Vedere http://harmful.cat-v.org/software/c++/linus per avere un idea di cosa si pensa dell'idea di scrivere il kernel di Linux in c++.

    RispondiElimina
    Risposte
    1. Si puó continuare ad usare C++ per scrivere moduli kernel in C (per questo ho scritto C/C++), usando la parola chiave

      extern "C"
      {
      //codice da interpretare in C e non in C++
      }

      Elimina
    2. Sul fatto che si possa non c'è dubbio; si può tutto. In giro si trovano anche esempi. Ma è stato scritto una cosa diversa: "il kernel Linux di Lubit è sviluppato in C/C++ ". Questo non è vero.
      Non è vero perché nei sorgenti ufficiali di linux non c'è C++. Il kernel di Linux è sviluppato in C. E non è un caso ma una scelta (sulla quale peraltro ho un opinione un po' più sfumata); vedi il link della mia risposta di prima.

      Anche usando 'extern "C"', non vai molto lontano. Un programma C++ ha bisogno di un supporto di librerie esterne (vedi libstdc++), che difficilmente si riuscirebbe a linkare al kernel: try..except, new, delete sono solo un esempio.
      Forse riesci ad usare le classi; ma anche in quel caso non so quanto ci si guadagni: un pattern usato regolarmente in Linux è quello di avere delle strutture con dei puntatori a funzione.
      Concettualmente sembrano richiamare il modello classi con metodi virtuali. Ma ci sono delle differenze: in C++ richiamare un metodo virtuale richiede due passaggi, perché i metodi non sono "Impacchettati" nella classe stessa ma in una tabella a parte ("vtable"). La classe contiene solo un puntatore alla vtable; per cui per avere l'indirizzo della funzione devi effettuare *due* de-referenziazioni.
      Invece usando "struct" e puntatori a funzione devi de-referenziare solo una volta. Questo risparmio per gli sviluppatori del kernel di Linux è molto importante; ed è questa attenzione a questo livello di ottimizzazione che li allontana dal C++: temono di perdere questo controllo così fino.

      Ripeto per non essere frainteso: un conto è dire che si *può* sviluppare in C++ il del kernel di Linux. Questa affermazione è senz'altro vera, e se ben ricordo qualcuno qualcosa ha fatto (ma non sono riuscito a trovare riferimenti). Un altro conto è dire che il il kernel di linux è scritto in C++. Questa non è corretta; l'unica accenno a una qualche forma di OOP è l'uso di puntatori a funzione all'interno di struct..


      P.S. Ad essere pedanti un file in C++ all'interno del kernel di linux esiste: ./scripts/kconfig/qconf.cc. Ma è solo un front end per la configurazione prima della compilazione. Non viene usato in alcun modo all'interno del kernel.

      Elimina
    3. Capisco il tuo punto di vista. L'affermazione, grammaticalmente parlando, é fuorviante. Il kernel in sè è sviluppato interamente in C, ma alcuni moduli sono stati sviluppati in C++, specialmente i piú recenti. Inoltre, esiste giá da tempo il progetto di porting del kernel interamente in C++, considerato da Linus Torvalds una sorta di salto generazionale, riducendo la complessitá del kernel ed aumentandone la mantenibilitá.
      I lavori sono ancora all'inizio, ma sembrano promettenti: http://bosslinux.in/bossmool
      Ad ogni modo, grazie del contributo e dell'aver fatto notare l'incorrettezza dell'espressione. Fa sempre bene avere feedbacks :)

      Elimina
    4. Al di là del progetto bossmol che è esterno e che non mi sembra abbia avuto tutto questo seguito, quali sarebbero i moduli sviluppati in C++ ? Sarei anche interessato a leggere l'intervista in cui Torvalds parla bene del C++; l'ultima che ho letto non era proprio in questi termini

      Elimina