Als ich vor 6-7 Jahren C ++ zum ersten Mal lernte, lernte ich im Grunde "C mit Klassen". std::vector
war definitiv ein fortgeschrittenes Thema, etwas, über das man lernen konnte, wenn man es wirklich wollte. Und es gab sicherlich niemanden, der mir sagte, dass Destruktoren genutzt werden könnten, um das Gedächtnis zu verwalten. Heute sehe ich überall RAII und SFINAE und STL und Boost und Modern C ++. Sogar Leute, die gerade erst mit der Sprache anfangen, scheinen diese Konzepte fast vom ersten Tag an zu lernen.
Meine Frage ist, ist dies einfach, weil ich nur das "Beste" sehe, dh die Fragen hier auf SO und auf anderen Programmierseiten, die Anfänger anziehen (gamedev.net), oder ist dies tatsächlich repräsentativ für die C ++ Community als Ganzes?
Wird modernes C ++ wirklich zum Standard? Wird es nicht so, wie die Experten es schreiben, sondern "so wie C ++ einfach ist"? Oder kann ich einfach nicht die Tausenden von Menschen sehen, die noch "C mit Klassen" lernen und ihre eigenen dynamischen Arrays schreiben, anstatt sie zu verwenden std::vector
, und die Speicherverwaltung durchführen, indem sie manuell new / delete aus ihrem Code der obersten Ebene aufrufen?
So sehr ich es auch glauben möchte, es scheint unglaublich, ob sich die C ++ - Community insgesamt in ein paar Jahren so stark entwickelt hat. Was sind Ihre Erfahrungen und Eindrücke?
(Haftungsausschluss: Jemand, der nicht mit C ++ vertraut ist, könnte den Titel falsch interpretieren und fragen, ob C ++ im Vergleich zu anderen Sprachen immer beliebter wird. Das ist nicht meine Frage. "Modern C ++" ist ein gebräuchlicher Name für einen Dialekt oder Programmierstil in C ++, benannt nach dem Buch. " Modernes C ++ - Design: Generische Programmierung und angewandte Entwurfsmuster ", und ich interessiere mich ausschließlich für dieses im Vergleich zu" altem C ++ ". Sie müssen mir also nicht sagen, dass die Zeit von C ++ vorbei ist und wir alle Python verwenden sollten;))
Antworten:
Ich denke, die Dinge haben sich so entwickelt.
Die erste Generation von C ++ - Programmierern waren C-Programmierer, die C ++ tatsächlich als C mit Klassen verwendeten. Außerdem war die STL noch nicht vorhanden, und genau das war C ++ im Wesentlichen.
Als die STL herauskam, brachte das die Dinge voran, aber die meisten Leute, die Bücher schrieben, Lehrpläne zusammenstellten und Klassen unterrichteten, hatten zuerst C gelernt, dann das zusätzliche C ++ - Zeug, also lernte die zweite Generation aus dieser Perspektive. Wie eine andere Antwort feststellte: Wenn Sie
std::for_each
gerne regelmäßig für Loops schreiben, bringt Ihnen die Änderung der Verwendung nicht viel, außer dem warmen, verschwommenen Gefühl, dass Sie die Dinge auf "moderne" Weise erledigen.Jetzt haben wir Ausbilder und Buchautoren, die das gesamte C ++ verwendet haben und ihre Anweisungen aus dieser Perspektive erhalten, wie beispielsweise das Accelerated C ++ von Koenig & Moo und das neue Lehrbuch von Stroustrup.
char*
Dann lernen wir also nichtstd::strings
.Es ist eine interessante Lektion darüber, wie lange es dauert, bis "Legacy" -Methoden ersetzt werden, insbesondere wenn sie eine Erfolgsbilanz der Effektivität aufweisen.
quelle
Absolut ja. Wenn Sie C ++ nicht in diesem "modernen C ++" - Stil programmieren, wie Sie es nennen, macht es für mich keinen Sinn, C ++ zu verwenden! Sie können auch einfach C verwenden. "Modern C ++" sollte meiner Meinung nach die einzige Möglichkeit sein, C ++ jemals zu programmieren, und ich würde erwarten, dass jeder, der C ++ verwendet und auf diese "moderne" Weise programmiert hat, mir zustimmt. Tatsächlich bin ich immer völlig schockiert, wenn ich von einem C ++ - Programmierer höre, der sich Dinge wie auto_ptr oder ptr_vector nicht bewusst ist. Für mich sind diese Ideen grundlegend und grundlegend für C ++, und so konnte ich es mir nicht anders vorstellen.
quelle
In den Tagen von Windows 3.1 war C der Standard. Als C ++ auf den Entwicklermarkt kam und später zum ANSI-Standard wurde, war es die neue Schärfe. Es hat das Akronym OOP und einige der grundlegenden Entwurfsmuster unter Verwendung von Polymorphismus populär gemacht.
Mit der größeren Akzeptanz von verwalteten Plattformen mit geringer Eintrittsbarriere wie C # /. NET gibt es weniger Gründe, C ++ zu verwenden. So viel von der Entwicklerbasis wird eine Wahl haben und seien wir ehrlich: C ++ ist ein Bär, den man für Anfänger lernen sollte. Mit C # können Sie einfach damit laufen.
Das lässt wirklich nur die Plattformen übrig, die C ++ und die eingefleischten C ++ - Evangelisten brauchen, um die Kunst weiter zu praktizieren. Dies ist die Community, die alle Abstraktionsebenen benötigt und will, die als "Modern C ++" gelten.
Also ja, ich glaube, dass "Modern C ++", wie Sie sagen, immer häufiger wird. Es ist jedoch bei einem anderen Publikum weit verbreitet als in der Vergangenheit.
quelle
Ich bin einer dieser Leute, die gelernt haben, wie man mit der STL arbeitet, und vom ersten Tag an viel über RAII und gute C ++ - Programmierpraktiken gehört haben. Sieht aus wie einige der am meisten empfohlenen Bücher zum Erlernen von C ++ heute (wie Accelerated C ++ und die Effective C ++ - Reihe ) Konzentrieren Sie sich auf die Verwendung von STL-Tools, anstatt Ihre eigenen Inhalte zusammenzufassen, und geben Sie viele "Regeln" für eine effektive (oder "moderne") Programmierung an.
Aber im Gespräch mit Freunden habe ich auch festgestellt, dass einige Unternehmen immer noch mit "C with Classes" arbeiten, nicht mit "Modern C ++". Vielleicht wird sich eines Tages die von den Autoren und Anwendern des "Modern C ++" vorgeschlagene Kultur durchsetzen :)
quelle
Ich denke, du hattest gerade eine schlechte Erfahrung.
Sie müssen sich Scott Meyers Effective C ++ - Bücher zulegen. Ich habe 1999 wütend mit C ++ angefangen. Mein Teamleiter hat mich dazu gebracht, Effective C ++ und More Effective C ++ zu lesen, bevor ich JEDEN Code einchecken durfte.
Die meisten seiner Beratung ist auf den Linien von „ Verwenden Sie dieses nicht verwenden Feature , aber wenn es sein muss, halten diese im Auge“
Wenn Sie seinem Rat folgen, schreiben Sie gutes oder "modernes" C ++.
Er hat jetzt auch ein Buch über STL, das ich aber nicht gelesen habe.
quelle
In meinen C ++ - Jobs habe ich festgestellt, dass die modernen Funktionen zunehmend verwendet werden, und immer mehr Leute haben mich in Telefonvorführungen und Interviews danach gefragt. Soweit ich das beurteilen kann, fangen sie an.
Ich habe C ++ ursprünglich als C mit Klassen gelernt. Obwohl die Sprache weit darüber hinaus fortgeschritten war, waren die Bücher, die ich las, und die Leute, mit denen ich arbeitete, fest in "altem C ++" verankert. RAII etwas, worüber die Leute nachdenken würden, anstatt es automatisch zu tun, und ich erinnere mich, dass ich einige der frühen Artikel über die Probleme der Ausnahmesicherheit gelesen habe.
Wie bereits erwähnt, gibt es jetzt neue Bücher. Viele der alten sind immer noch relevant, aber sie scheinen zunehmend voller Erklärungen zu sein, warum offensichtlich schlechte Ideen schlecht sind. (Ebenso ist es für moderne Leser schwer zu verstehen, wie revolutionär Freuds Vorstellungen von einem Unbewussten waren, da es jetzt konventionelle Weisheit ist.)
Stroustrup hat gerade ein Lehrbuch herausgebracht: Programmieren: Prinzipien und Praxis mit C ++ . Ich habe es gekauft, weil ich es noch nicht versäumt habe, gute Sachen aus einem Buch von Stroustrup zu lernen, aber die ersten Kapitel nicht hinter mich gebracht habe. Bisher kann ich nur sagen, dass ich die Art und Weise, wie er anfängt, gutheiße, und es ist zumindest eine gute Einführung in die Verwendung von C ++.
quelle
Während ich an dem Projekt arbeite, an dem ich derzeit beteiligt bin, gibt es viel C ++ - Code, der sich über einen bedeutenden Zeitraum (seit über 10 Jahren) entwickelt hat. Die Entwicklung, von der Sie sprechen, ist dort deutlich sichtbar: Der ältere Code ist häufig "C mit Klassen" - Rohzeiger,
char*
Zeichenfolgen und Verwendung der zugehörigen C-Funktionen, Arrays usw.; Neuerer Code verwendet intelligente ATL-Zeiger und dergleichen, um Ressourcen zu verwalten, bleibt jedoch die meiste Zeit bei handcodierten Schleifen, und Iterator ist ein seltener Anblick. und der neueste ist voll von STL-Containern, Algorithmen,shared_ptr
(einschließlich benutzerdefinierter Löscher zum Verwalten von Handles usw.), stark generierte Funktions- und Klassenvorlagen usw. Die meisten herkömmlichen Codierungstechniken "C mit Klassen", wie z. B. nicht gekapselte Rohzeiger mit manueller Lebensdauerverwaltung, werden heutzutage in Codeüberprüfungen sehr verpönt. Demnach scheint Ihre Beobachtung korrekt zu sein.Die jüngste Entwicklung scheint eine Modeerscheinung für C ++ 0x-Lambdas zu sein - was eine positive Seite hat, da sie auch das Gleichgewicht zugunsten der Verwendung von Standardalgorithmen gegenüber handcodierten Schleifen neigt, da Sie jetzt Ihren gesamten Code inline haben können auch Algorithmen.
quelle
Ich würde nicht sagen, dass std :: vector heutzutage als "modern" gilt. Es ist wirklich einfach.
Generell habe ich den Eindruck, dass die Leute einige Erfahrungen mit dem modernen C ++ - Stil gesammelt und sich ein wenig ernüchtert haben. Um nur ein einfaches Beispiel zu nennen: STL for_each war interessant, aber in der Praxis bringt es nicht viel Wert über eine einfache C-Schleife. Das Debuggen ist schwieriger und bietet manchmal nicht die beste Leistung. Auch die Konstrukte für die funktionale Programmierung in der aktuellen STL sind im Allgemeinen sehr umständlich, insbesondere wenn Sie Erfahrung mit einer echten funktionalen Sprache wie ML haben.
quelle
Nach meiner Erfahrung (spanische Universität) ist es leider die Norm, Sprachen nicht an sich zu betrachten. Sie verwenden die einfachsten Sprachen, um Programmieren zu unterrichten (dh Java), da dies für Lehrer und Schüler einfach sein soll, und verwenden dann C für die Betriebssystemklassen und dergleichen.
C ++ wird nur geringfügig eingeführt (jedenfalls in jedem Kurs), nur um ein C mit Klassen zu versehen. Sie kommen nicht in Boost oder sogar STL. Ich denke, dass es sowohl für Lehrer als auch für Schüler kostspielig ist, mit allen Eigenschaften und Denkweisen von C ++ Schritt zu halten. Wie viele C ++ - Programmierer hier kennen genug von allen Boost-Bibliotheken, um sie zu verwenden, um eine bessere Lösung zu finden oder sie zu entwerfen? Man muss ein Interesse daran haben, mit all den neuen Bibliotheken und Redewendungen Schritt zu halten.
Wie gesagt, es scheint jedoch, dass das Programmieren im Allgemeinen (und die Programmiersprachen im Besonderen) nicht zu ernst genommen werden, da es eine zeitliche Aufgabe zu sein scheint, wenn sie einen Job beginnen, und dann vergessen, wie man programmiert, wenn sie in den USA aufsteigen Unternehmensbaum. Viele Unternehmen hier und die Universität selbst haben das Gefühl, dass die Programmierung von jedem durchgeführt werden kann.
Wenn Sie dieser Philosophie folgen, wird C ++ für die meisten Menschen, die ich kenne, immer "C mit Klassen" sein.
Grüße,
quelle
Nach meiner Erfahrung hängt dies stark vom Alter des Softwareprodukts / -projekts ab. Die meisten mir bekannten neuen Projekte verwenden modernes C ++ (RAII, STL, Boost). Es gibt jedoch viele C ++ - Projekte, die älter als 10 Jahre sind, und Sie sehen dort kein modernes C ++.
Denken Sie auch daran, dass einige der beliebtesten STL-Implementierungen bis vor vielleicht 5 Jahren ziemlich kaputt waren (MSVC <7.0 und GNU <3.00).
quelle
Ich denke, das größte Hindernis, auf das ich gestoßen bin, ist die Unterstützung von Toolchain, insbesondere bei plattformübergreifenden Projekten. Bis vor einigen Jahren war es üblich, Build-Notizen zu sehen, in denen stand: "Die x-Plattform benötigt STLport, um zu funktionieren, weil ihr Compiler überlastet ist." Sogar jetzt sehe ich Probleme mit Leuten, die versuchen, mehrere Abhängigkeiten von Drittanbietern zu verwenden, die an verschiedene Versionen von BOOST gebunden sind. Dies macht das Verknüpfen unmöglich, was bedeutet, dass Sie zurückgehen und Ihre Deps von Grund auf neu erstellen müssen.
Jetzt, da fast jeder MSVC ++ 6 nicht mehr verwendet, liegt das STLport-Chaos hinter uns. Sobald TR1 jedoch nicht mehr verfügbar ist, kehren wir zu "Welche Versionen welcher Umgebungen unterstützen es und machen es richtig" zurück, und dies wird die Akzeptanz erneut verlangsamen.
Ich arbeite an einem Projekt, das 1992 in C (nicht in C ++) begonnen wurde. Die Bereitstellung moderner Praktiken in der gesamten älteren Codebasis wäre unmöglich. Ebenso arbeite ich an einem anderen Projekt, das dem neuesten Stand der C ++ - Sprache viel näher kommt.
quelle
Viele Teams, in denen ich war und von denen ich gehört habe, betrachten das große "Verwenden wir Ausnahmen?" Frage. Dies ist Code für "Verwenden wir modernes C ++?"
Wenn Sie keine Ausnahmen verwenden, können Sie nicht die volle Leistung der Sprache und ihrer Bibliotheken nutzen.
Viele ältere Codebasen sind jedoch ausnahmslos, und es wird als schwierig empfunden, Ausnahmen in eine Codebasis zu integrieren, die sie nicht erwartet, oder in ein Team, das nicht weiß, wie sie verwendet werden sollen. In solchen Fällen lautet die Antwort oft 'nein'.
Nach meiner Erfahrung braucht modernes C ++ jemanden, der eine Leidenschaft für das Team hat und der nichts weniger ertragen kann, um darauf zu drängen. Es muss auch die Einwände derer überwinden, die möchten, dass es eher dem Legacy-Code ähnelt.
Ich glaube zwar nicht, dass alte C ++ - Codebasen sehr schnell verschwinden, aber ich glaube, dass es mehr dieser leidenschaftlichen Menschen auf der Welt gibt als vor fünf Jahren. Sie stehen vor dem gleichen harten Kampf wie vor fünf Jahren, aber es ist wahrscheinlicher, dass sie verwandte Geister finden.
quelle
Bevor Sie eine solche Frage beantworten können, müssen Sie sich darauf einigen, was "modern" ist. Dies ist unwahrscheinlich, da "Modern" ein schlecht definiertes Wort ist und für verschiedene Menschen unterschiedliche Bedeutungen hat. Der Titel von Alexandrescus Buch (Modern C ++ Design) hilft auch nicht wirklich, da es sich größtenteils um ein Buch über Template Metaprogramming handelt, das ein spezifischer Bereich von C ++ ist, aber keineswegs der einzige.
Für mich "Modern C ++"! = "Template Metaprogramming". Ich würde sagen, dass die Funktionen von C ++ über C in folgende Kategorien fallen:
Keines davon ist besonders modern, da es alle fast 10 Jahre oder länger her ist. Die meisten dieser Funktionen sind nützlich und ermöglichen es Ihnen, in vielen Anwendungsfällen produktiver als Straight C zu sein. Ein guter Programmierer sollte und wird sie alle in einem Projekt mit angemessener Größe verwenden, aber eines dieser Dinge ist nicht wie das andere:
Vorlagen-Metaprogrammierung.
Die kurze Antwort auf die Metaprogrammierung von Vorlagen lautet einfach Nein. Leider ist es für manche Leute aufgrund des Buches gleichbedeutend mit "Moderner C ++ - Programmierung", aber am Ende schafft es mehr Probleme als es löst. Wenn C ++ keine besseren generischen Programmiermechanismen wie Reflektion entwickelt, ist es für die generische Programmierung schlecht geeignet, und höhere Sprachen wie Python eignen sich besser für diese Anwendungsfälle. Aus diesem und vielen anderen Gründen finden Sie in der C ++ - FQA
quelle
Das beste Buch zum Lernen von C ++. "Accelerated C ++" von Koenig & Moo lehrt, was Sie als modernes C ++ bezeichnen. Ich denke, die meisten Leute verwenden es heutzutage. Für diejenigen von uns, die C ++ schon eine ganze Weile verwenden (in meinem Fall seit Mitte der 80er Jahre), ist modernes C ++ eine große Erleichterung von den mühsamen Aufgaben, eigene Arrays, Strings und Hash-Tabellen zu schreiben (Wiederholung ad nauseam).
quelle
Ich habe mir tatsächlich C ++ - Jobs angeschaut und "moderne" Bibliotheken werden immer häufiger in Jobbeschreibungen verwendet. MFC, eine ziemlich "alte" C ++ - Bibliothek, wird weniger verwendet.
quelle
Die Standardisierung der Sprache Ende der neunziger Jahre war der erste Schritt. Sie ermöglichte es den Compilerherstellern, sich auf die "Standard" -Funktionen zu konzentrieren, und ermöglichte es der Sprache, einige der rauen Kanten zu korrigieren, die während des Standardisierungsprozesses auftraten.
Dies ermöglichte wiederum die Entwicklung von Frameworks basierend auf Standardfunktionen der Sprache und nicht auf Funktionen, die von einer bestimmten Compiler-Implementierung bereitgestellt wurden. Die Boost-Bibliothek ist in dieser Hinsicht besonders wichtig. Dies ermöglichte auch, dass die Neuentwicklung auf früheren Arbeiten basiert und somit Lösungen für komplexere Probleme ermöglicht.
Eine bemerkenswerte Änderung ist hier, wie frühere Frameworks auf dem Begriff der Basisklassen und abgeleiteten Klassen basierten (eine Laufzeitfunktion). Die meisten erweiterten Funktionen basieren jedoch häufig stark auf "rekursiven" Vorlagen (eine Funktion zur Kompilierungszeit).
Die STL hat ihre Vor- und Nachteile, aber sie hat den Test der Zeit überstanden, wenn Sie etwas wollen, das funktioniert und einfach ist. Die STL hat sicherlich etwas, das Ihnen beim Start hilft. Es macht keinen Sinn, das Rad neu zu erfinden (außer aus didaktischen Gründen).
Computerhardware hat seit den 1990er Jahren ebenfalls große Sprünge gemacht, dann sind Speicher und CPU keine Einschränkung mehr für den Compiler. Die meisten theoretischen Optimierungen aus Büchern sind nun möglich.
Die nächsten Schritte der Sprache sind die Unterstützung der Multi-Core-Programmierung, die Teil des 0x-Standardaufwands ist.
quelle
Ja und nein. Sicherlich wird es für neue Projekte immer beliebter. Es gibt jedoch immer noch Hindernisse für die Adoption, die praktisch und nicht politisch sind und die andere nicht erwähnt haben. Es gibt viele kommerzielle C ++ - Bibliotheken, die ABIs von alten Compilern verwenden, die die in Modern C ++ gezeigten Funktionen nicht richtig unterstützen, und viele Unternehmen verlassen sich auf diese Bibliotheken. Sun Studio unter Solaris kann beispielsweise ohne die Verwendung von STLport nicht mit Boost arbeiten. Für jede kommerzielle Bibliothek eines Drittanbieters, die Sie verwenden möchten, ist jedoch die Sun-Version der STL erforderlich. Gleiche Geschichte mit GCC 2.95 und Redhat Enterprise Linux.
quelle
Es ist erstaunlich, wie wenig Aufwand erforderlich ist, um c ++ stabiler zu machen. Das Warnsystem ist vorhanden, aber es entwickelt sich nicht viel weiter. Es ist noch einfacher, sich in einen Fuß zu schießen als vor 10 Jahren. Ich weiß nicht warum, aber C ++ ist immer noch meine Lieblingssprache. :) :)
quelle