Die C++-Bashing-Saison ist zurück

Die C++-Bashing-Saison ist zurück

Es scheint, dass es da draußen eine Menge Abneigung und Hass auf C++ gibt. Das ist nicht neu – das war schon immer so. Aber in letzter Zeit rückt dieses Thema in der Programmiergemeinschaft mehr in den Fokus, und ich verstehe nicht einmal warum. Schließlich ist C++ heute sicherlich eine weniger wichtige Sprache als noch vor ein paar Jahren, da mehr Anwendungen in dynamischen Sprachen wie Python geschrieben werden und neue Sprachen wie C# auf Kosten von C++ an Popularität und Marktanteilen gewonnen haben /P>

Proggit-Ruhm

Proggit, der Programmierbereich von reddit.com, ist heutzutage wahrscheinlich der beliebteste Ort für allgemeine Programmierdiskussionen. Jeden Tag werden Dutzende von Themen angesprochen, und die bekannteren können in nur wenigen Stunden leicht Hunderte von Kommentaren generieren.

Traditionell wurde Proggit von vielen als ein brüskierter Ort angesehen, an dem Sprachfanatiker wohnen und jedem raten, Haskell und Lisp zu lernen. IMHO ist das nicht der richtige Eindruck. Vielleicht bekommen diese Sprachen mehr Proggit-Anteil als ihre tatsächliche Verwendung, aber das heißt noch lange nicht, dass "echte" Probleme dort nicht diskutiert werden. Wie das Bashing von C++.

Hier ist eine kurze Sammlung aktueller Diskussionen mit den ursprünglichen Artikeln, die sie gestartet haben:

Ein Redditor fragte vor zwei Monaten, ob er verrückt sei, C++ zu mögen. Hier ist ein sehr schönes Zitat aus einer der Antworten:

Peter Seibel, der Autor von Coders at Work fragte die meisten der von ihm interviewten Star-Programmierer nach C++, bekam viele negative Meinungen und sehr wenige positive (und selbst diese ziemlich zurückhaltende). Proggit-Diskussion.

Und natürlich gibt es da noch den berühmten Post von Linus Torvalds in der Git-Mailingliste, der C++ gemein bashing. Proggit hatte viele Threads zu diesem Thema, aber dieser Gigant mit fast 1000 Kommentaren ist wahrscheinlich der bemerkenswerteste. Es wurde vor ein paar Wochen noch einmal diskutiert, mit den gleichen Grundstimmungen.

Warum ist C++ also so schlecht?

Ein Kollege aus Israel namens Yossi Kreinin hat eine ganze Website zusammengestellt, die sich den Mängeln von C++ widmet:die C++ FQA - "Frequently Questioned Answers". Ein Wort der Warnung – wenn Sie bald eine große Menge C++-Code schreiben müssen, lesen Sie nicht die FQA – Sie könnten wirklich enttäuscht werden.

Auch die FQA wurde schon des Öfteren diskutiert, und obwohl sie manchmal etwas zu hart ist, sind die dort gemachten Beobachtungen insgesamt richtig. Im Laufe der Jahre wurden nur sehr wenige Korrekturen vorgenommen. C++ hat viele Fehler.

Mein persönlicher Beitrag:Das Schlimmste an C++ ist meiner Meinung nach, dass es extrem ist schwer verständlicher Code, der von anderen geschrieben wurde. Hier, ich habe es gesagt. Nicht die Vorlagen, nicht die Ausnahmen, nicht die Speicherverwaltung und nicht die Diamantvererbung. Ja, all diese Funktionen sind nicht perfekt und hätten besser gestaltet werden können, aber sie sind überschaubar. Das Lesen des Codes anderer ist das größte Problem. Und da C++-Anwendungen selten ein Ein-Mann-Job sind (viel weniger als in den dynamischeren und daher produktiveren Sprachen), ist das Lesen von Code ein wichtiger Teil der Arbeit eines C++-Programmierers, und das Lesen von C++-Code ist verdammt schwer. Möchten Sie C++-Code lesen, der von großartigen Programmierern geschrieben wurde? Versuchen Sie, die Quelle von boost zu lesen , oder der Code von Andei Alexandrescu - viel Glück! Möchten Sie C++-Code lesen, der von armen Programmierern geschrieben wurde? Mach dir nicht einmal die Mühe.

Linus Torvalds sagt in seiner Tirade gegen C++ ausdrücklich, dass er C benutzt, um C++-Code-Beiträge von anderen Leuten zu vermeiden (na ja, er hat stärkere Worte verwendet...)

Die Lesbarkeit des Codes ist einer der Hauptgründe, warum ich Python gegenüber Perl bevorzuge. Perl ist meistens eine gute Sprache, aber von anderen geschriebener Perl-Code neigt dazu, unlesbar zu sein. Glücklicherweise gibt es großartige Alternativen zu Perl - zum Beispiel Python und Ruby.

Bei C++ liegt das Problem tiefer. Ja, es ist komplex und erlaubt es, unlesbaren Code zu schreiben, aber das allein macht es noch nicht zu einer schlechten Sprache. Im Gegensatz zu Perl gibt es jedoch kein real Alternative zu C++.

Aber was ist die Alternative, C?

Und hier liegt das große Dilemma . Ja, C++ wird heutzutage weniger benötigt. Viele Anwendungen (oh, glückliche Seelen!) können durch die Verwendung von Python, Ruby oder etwas Ähnlichem erreicht werden. Viele Anwendungen (insbesondere für Windows) werden in C# geschrieben. Aber für einige Arten von Anwendungen scheinen C und C++ die einzigen praktikablen Optionen zu sein. Es gibt wirklich viele Beispiele, aber nehmen Sie etwas beliebtes - µTorrent - eine erstaunliche Menge an Funktionalität, nützliche GUI, schnell und schlank, kommt als eigenständige .exe mit einem Gewicht von weniger als 300 KB. µTorrent ist in C++ geschrieben und Sie könnten es mit keiner anderen Sprache jemals so schnell und klein machen. C++ und C sind die einzigen Optionen, die Sie hier haben.

Ein weiteres Beispiel ist etwas wie Photoshop – können Sie sich überhaupt vorstellen, eine Anwendung dieser Größe und dennoch erstklassiger Leistung zu schreiben, die auf mehreren Plattformen läuft, in etwas anderem als C oder C++? Firefox ist ein weiteres Beispiel, geschrieben in C++. Webserver sind normalerweise in C geschrieben. Wenn Sie absolut die meiste Leistung aus einer Anwendung herausholen müssen, bleiben C und C++ die einzig wirklich praktikable Wahl. Unabhängig davon, wie viel Optimierungs-IQ in die JVM gesteckt wird, C und C++ ermöglichen es Ihnen, Code zu schreiben, der "nah am Metall" ist, und daher werden sie für die kritischen, manuell optimierten Codeabschnitte sicherlich schneller sein.

Und das große Problem, das größte Dilemma entsteht, wenn man sich zwischen den beiden entscheiden muss.

C wird viel weniger geschmäht als C++, und das zu Recht. Die Sprache ist viel einfacher und hat daher viel weniger Juckreiz zu kratzen. Und das Lesen von C-Code ist sicherlich einfacher als das Lesen von C++-Code.

Aber wer startet heutzutage ein neues Projekt in C, es sei denn, es handelt sich um einen OS-Kernel, der auf einem eingebetteten Gerät laufen muss, oder Linus Torvalds ist im Team?

Schließlich können Sie C++ nehmen und es als besseres C schreiben. Ist es nicht eine Schande, all diese Annehmlichkeiten von C++ mit einfachem C neu zu implementieren? OK, verwenden wir einfach diesen netten String und Vektor Klassen, anstatt unsere eigenen zu schreiben. Und, oh, dieses ADT, das wir hier haben, ist besser als Klasse geschrieben. Et cetera, und sehr schnell fängst du an, partielle Template-Spezialisierungen zu hacken und über die dynamischen Umwandlungen deiner mehrfach vererbten Klassenhierarchien nachzudenken.

Wo hörst du auf? Welche Teilmenge von C++ wählen Sie aus und bleiben dabei, um es wirklich zu einem „besseren C“ zu machen? Lassen Sie mich dieses Zitat noch einmal einfügen:

Für jemanden sind die guten Teile von C++ Ausnahmen und RAII. Zum anderen sind es Templates und STL-Container. Jeder wählt seine eigene Teilmenge aus, und niemand scheint sich einig zu sein, welche Teilmenge besser/sicherer/verständlicher ist.

So beginnen alle Religionskriege.

Persönliche Erfahrung

Vor ein paar Jahren war mein Hauptberuf das Programmieren von C++. Ich befand mich in demselben Dilemma wie das oben beschriebene und habe tatsächlich ein paar C-Anwendungen in C++ neu implementiert. Ich war insgesamt zufrieden mit dem Prozess, aber ich begann, die Angst vor der Sprache zu spüren. Dies erreichte einen Höhepunkt, als ich Modern C++ Design durchsah von Andrei Alexandrescu - Mir wurde klar, dass ich wahrscheinlich nie schlau genug sein werde, um C++ mit all seinen Macken und dunklen Ecken wirklich zu verstehen.

Etwas später hatte ich die angenehme Erfahrung, C++-Code mit Qt zu schreiben. Laut Hörensagen ist Qt im Inneren ziemlich kompliziert und hackig, aber was es nach außen präsentiert, ist pure Freude in Bezug auf das API-Design. Das Schreiben von C++-Code mit Qt hat Spaß gemacht und war sehr produktiv.

Seitdem habe ich nicht viel C++ geschrieben. Ich habe C für eingebettete Geräte geschrieben, wo C die einzige Wahl war, also hatte ich das Dilemma nicht. Ich habe eine einfache Windows-GUI-Anwendung mit C++ und der Win32-API geschrieben. Da die Anwendungen klein waren, wurde mein Code nicht aufgebläht und ich genoss es, einfach eine Map erstellen zu können von string zu Vektor wenn ich es brauchte - es in C zu codieren wäre viel schmerzhafter. Aber hauptsächlich habe ich Perl und Python verwendet, letzteres ziemlich erfolgreich für nicht-triviale Windows-Anwendungen mit GUIs und Netzwerken,

Was die Zukunft betrifft, so hoffe ich, mich nicht entscheiden zu müssen. Ehrlich gesagt hoffe ich, dass ich C++ oder C nicht für nicht eingebettete Anwendungen verwenden muss. Wo immer ich mit höheren Sprachen wie Python auskomme, werde ich die Gelegenheit beim Schopf packen. Aber wenn ich dem Dilemma gegenüberstehe, werde ich mich wahrscheinlich für C++ entscheiden und wieder versuchen, mich an die kleinste Teilmenge zu halten, die erforderlich ist, um die Aufgabe abzuschließen, ohne im komplexen Sumpf stecken zu bleiben.