Avvertenza: questa non è una risposta tanto quanto una critica alla conversazione a cui "unkk user" ha collegato la sua risposta.
Il suo primo punto principale è il (presumibilmente) "standard in continua evoluzione". In realtà, gli esempi da lui forniti riguardano tutti i cambiamenti in C ++ prima che esistesse uno standard. Dal 1998 (quando è stato finalizzato il primo standard C ++) le modifiche al linguaggio sono state abbastanza minime - in effetti, molti direbbero che il vero problema è che avrebbero dovuto essere apportate ulteriori modifiche. Sono ragionevolmente certo che tutto il codice conforme allo standard C ++ originale sia ancora conforme allo standard attuale. Anche se è un po ' meno certo, a meno che qualcosa non cambi rapidamente (e abbastanza inaspettatamente) lo stesso sarà praticamente vero anche con il prossimo standard C ++ (teoricamente, tutto il codice che ha usatoexport
si romperà, ma praticamente non esiste nessuno; da un punto di vista pratico non è un problema). Mi vengono in mente poche altre lingue, sistemi operativi (o gran parte di qualsiasi altra cosa relativa al computer) in grado di presentare una simile richiesta.
Passa quindi a "stili in continua evoluzione". Ancora una volta, la maggior parte dei suoi punti sono abbastanza vicini alle sciocchezze. Cerca di caratterizzarsi for (int i=0; i<n;i++)
come "vecchio e sballato" e for (int i(0); i!=n;++i)
"nuovo calore". La realtà è che mentre ci sono tipi per i quali tali cambiamenti potrebbero avere un senso, per int
, non fa alcuna differenza - e anche quando potresti ottenere qualcosa, è raramente necessario per scrivere codice buono o corretto. Anche nella migliore delle ipotesi, sta costruendo una montagna da una talpa.
La sua prossima affermazione è che C ++ sta "ottimizzando nella direzione sbagliata" - in particolare, mentre ammette che usare buone librerie è facile, afferma che C ++ "rende quasi impossibile scrivere buone librerie". Qui, credo sia uno dei suoi errori più fondamentali. In realtà, scrivere buone librerie per quasi tutte le lingue è estremamente difficile. Come minimo, per scrivere una buona libreria è necessario comprendere un dominio del problema così bene che il codice funziona per una moltitudine di possibili applicazioni in (o relative a) quel dominio. La maggior parte di ciò che C ++ realmente fa è "alzare il tiro" - dopo aver visto quanto di meglio una biblioteca può essere, le persone sono raramente disposti a tornare a scrivere il tipo di dreck avrebbero altrimenti.programmatori davvero bravi scrivono parecchie librerie, che possono quindi essere usate (facilmente, come ammette) da "il resto di noi". Questo è davvero un caso in cui "non è un bug, è una funzionalità".
Non proverò a centrare tutti i punti in ordine (ciò richiederebbe delle pagine), ma salterò direttamente al suo punto di chiusura. Cita Bjarne dicendo: "L'ottimizzazione dell'intero programma può essere utilizzata per eliminare tabelle di funzioni virtuali inutilizzate e dati RTTI. Tale analisi è particolarmente adatta per programmi relativamente piccoli che non utilizzano collegamenti dinamici".
Lo critica affermando senza mezzi termini che "Questo è un problema davvero difficile", arrivando persino a confrontarlo con il problema dell'arresto. In realtà, non è niente del genere - in effetti, il linker incluso con Zortech C ++ (praticamente il primo compilatore C ++ per MS-DOS, negli anni '80) lo ha fatto. È vero che è difficile essere certi che tutti i dati eventualmente estranei siano stati eliminati, ma è comunque del tutto ragionevole fare un lavoro abbastanza giusto.
Indipendentemente da ciò, tuttavia, il punto molto più importante è che questo è assolutamente irrilevante per la maggior parte dei programmatori in ogni caso. Come sanno quelli di noi che hanno smontato un po 'di codice, a meno che non si scriva un linguaggio assembly senza librerie, i file eseguibili contengono quasi sicuramente una discreta quantità di "elementi" (sia codice che dati, in casi tipici) che si probabilmente non ne sono nemmeno a conoscenza, per non parlare del fatto che in realtà venga utilizzato. Per la maggior parte delle persone, il più delle volte, non importa, a meno che non si stia sviluppando per i sistemi embedded più piccoli, il consumo aggiuntivo di spazio di archiviazione sia semplicemente irrilevante.
Alla fine, è vero che questo sfogo ha un po 'più di sostanza dell'idiozia di Linus - ma questo gli dà esattamente il danno con deboli elogi che merita.
virtual
funzioni, giusto?