martedì 21 luglio 2015

C++ che passione

  Seguo il C++ da anni. Non ho mai avuto il coraggio fino ad ora di consigliarne l'uso in dei progetti in produzione, a meno che non mi fosse espressamente richiesto.
Si tratta di un linguaggio potentissimo e terribilmente complicato da imparare.

  Rimanere compatibile (provarci almeno) con dei sorgenti scritti quasi 40 anni fa, ha "arricchito" il linguaggio a tal punto che la stessa azione si può compiere a volte in 4 o più modi diversi, però soltanto un modo è il migliore, gli atri sono da conoscere solo per capire cosa fa il vecchio codice esistente...

  Prendo per esempio i puntatori.
  Sono una delle prime cause di errore. I puntatori puri oggi, dopo la pubblicazione del C++ 14, sono suggeriti come "evil", il diavolo da evitare come la peste.
Quindi abbiamo:
  • I puntatori puri * che provengono dal C e sono da evitare.
  • I riferimenti & che sono un po' più comodi ma non risolvono il problema della memoria mai rilasciata
  • Gli smart pointers (shared_ptr e weak_ptr) per i quali spesso si sconglia l'utilizzo, perché creano il problema di condividere la proprietà di un oggetto e non si sa, se questo possa essere effettivamente tolto
  • Lo unique_ptr che pare essere la panacea di tutti i mali, la risposta al problema del memory leak, però non può essere copiato, ma solo spostato...
  E' interessante notare come un vettore non possa contenere dei riferimenti, ma solo puntatori puri...si possono usare gli shared_ptr, ma li trovo un po' complicati. Oggi non saprei dire con certezza se i puntatori puri siano da evitare sempre nei progetti nuovi.

  A differenza di quanto avviene in Java o in .Net, dove un pesantissimo garbage collector cerca di ripulire la memoria non più utilizzata, gli smart pointers del C++ richiedono al programmatore di porsi il problema di chi è il proprietario del dato. Lo smart pointer rilascerà la memoria, quando sarà rilasciato il proprietario... è un nuovo approccio, a mio avviso semplice e geniale, per eliminare l'overhead del GC, croce e delizia dei programmatori, soprattutto neofiti, ma croce e basta dei sistemisti...

  Il problema fondamentale con il C++ secondo me non è tanto che il tempo di apprendimento sia lungo, che la curva di apprendimento sia ripida o che costi tantissimo formare il personale, il vero problema con il C++ è che ti costringe a PENSARE. Non si può programmare meccanicamente, non c'è posto per le scimmiette ammaestrate che "vanno", che "producono" codice ripetuto e da buttare via dopo 6 mesi... Con il C++ ci vuole un thread in testa che continuamente ti dica: "stai facendo veramente la cosa giusta?"

  Si può spendere un sacco di tempo su poche righe di codice, ho scritto spendere, non buttare...