Warum sollte ich C ++ 11 lernen, nachdem ich C und C ++ gekannt habe? [geschlossen]

28

Ich bin ein Programmierer in C und C ++, obwohl ich mich nicht an beide Sprachen halte und eine Mischung aus beiden schreibe. Manchmal ist es natürlich besser, Code in Klassen zu haben, möglicherweise mit Überladung des Operators oder Vorlagen und der ach so tollen STL. Manchmal ist die Verwendung eines einfachen C-Funktionszeigers viel besser lesbar und klarer. So finde ich Schönheit und Praktikabilität in beiden Sprachen. Ich möchte nicht in die Diskussion "Wenn Sie sie mischen und mit einem C ++ - Compiler kompilieren, ist es keine Mischung mehr, es ist alles C ++" einsteigen. Ich denke, wir alle verstehen, was ich unter Mischen verstehe. Außerdem möchte ich nicht über C vs C ++ sprechen, diese Frage dreht sich alles um C ++ 11.

C ++ 11 führt, wie ich finde, wesentliche Änderungen an der Funktionsweise von C ++ ein. Es wurden jedoch zahlreiche Sonderfälle, Ausnahmen und Unregelmäßigkeiten eingeführt, die das Verhalten verschiedener Features unter verschiedenen Umständen ändern und die Mehrfachvererbung sowie Bezeichner, die als Schlüsselwörter fungieren, und Erweiterungen einschränken von String-Literalen, Lambda-Funktionsvariablenerfassung usw.

Ich weiß, dass irgendwann in der Zukunft, wenn Sie C ++ sagen, jeder C ++ 11 annehmen würde. Ähnlich wie wenn Sie heutzutage C sagen, meinen Sie höchstwahrscheinlich C99. Das bringt mich dazu, C ++ 11 zu lernen. Wenn ich weiterhin Code in C ++ schreiben möchte, muss ich diese Funktionen möglicherweise irgendwann verwenden, nur weil meine Kollegen dies getan haben.

Nehmen Sie zum Beispiel C. Nach so vielen Jahren lernen und schreiben immer noch viele Menschen Code in C. Warum? Weil die Sprache gut ist. Was gut bedeutet, ist, dass viele der Regeln befolgt werden, um eine gute Programmiersprache zu erstellen. C ist also nicht nur mächtig (was leicht oder schwer ist, fast alle Programmiersprachen sind es), sondern es ist auch regelmäßig und hat, wenn überhaupt, nur wenige Ausnahmen. C ++ 11 glaube ich jedoch nicht. Ich bin nicht sicher, ob die in C ++ 11 eingeführten Änderungen die Sprache verbessern.

Die Frage ist also: Warum sollte ich C ++ 11 lernen?


quelle
3
Ich verstehe, dass es in diesem Forum keinen C ++ 11-Rant geben sollte und stimme dem voll und ganz zu: Jeder Entwickler hat das Recht, seinen persönlichen Geschmack in Bezug auf Programmiersprachen und Tools zu haben. Es gibt jedoch ein viel praktischeres Problem für mich: Ich bin ein C ++ - Entwickler und ich mag C ++ 11 nicht, werde gezwungen sein, C ++ 11 zu verwenden oder nicht mehr auf dem Markt zu sein / in eine andere Sprache zu wechseln ein paar Jahren?
Giorgio
Nun, ich habe ein bisschen darüber nachgedacht, natürlich gibt es modernere Basissprachen wie die Programmiersprache D oder Go. Diese könnten für Ihre Problemdomäne geeignet sein, einfacher konsistenter sein, usw. Jedoch Marktanteil. Keiner der Hauptakteure in der Branche unterstützt D und sogar Go scheint eines von Googles "Experimenten" zu sein. Die Motivation hinter C + +11 sollten die nützlichen Verbesserungen sein, mit denen Sie besser lesbaren, sichereren und schnelleren Code schreiben können, sowie die breite Unterstützung der Branche.
Nils
@giorgio, in den letzten zwei Jahren habe ich C ++ nicht mehr so ​​oft verwendet wie vorher (hauptsächlich, weil ich wusste, wie religiös C ++ - Fans sind und Antworten auf diese Frage lasen), aber ich habe trotzdem auch in einer C ++ - Bibliothek gearbeitet, die ich gerne benutzte verwendet C ++ 11 für. Meine Erfahrung war folgende: C ++ 11 adressiert eine Menge beschissener Ecken von C ++, und das ist bewundernswert und verbessert es in der Tat. Die Art und Weise, wie es funktioniert, hat seine eigenen beschissenen Ecken (siehe den ursprünglichen unbearbeiteten Beitrag). Diese beschissenen Ecken scheinen jedoch nicht im Weg zu sein, wenn Sie Dinge auf "normale Weise" tun (z. B. kein Lambda für die zukünftige Verwendung aufbewahren).
@giorgio, was ich meine ist, C ++ 11 mag am Anfang schlecht aussehen, tatsächlich sieht C ++ selbst schrecklich aus, aber wenn Sie mit C ++ einverstanden sind, würden Sie wahrscheinlich auch C ++ 11 mögen. Vermeiden Sie es einfach, seine beschissenen Teile zu berühren, und Sie können es tatsächlich genießen.
@anon: Eine Möglichkeit, die beschissenen Teile einer Sprache loszuwerden, besteht darin, mit der Vergangenheit zu schneiden und eine neue Sprache zu beginnen, wie es Apple mit Swift tut (um nur eines von zahlreichen Beispielen zu nennen). Die Anbindung an Legacy-Code kann durch separate Kompilierung erfolgen. Das Problem mit C ++ ist, dass es auf unbestimmte Zeit erweitert wird, wahrscheinlich weil es von einer Community von Fans unterstützt wird, die religiös glauben, dass C ++ die einzig wahre Sprache ist. Fazit: Ich fand C ++ 03 ein bisschen beschissen, aber es hat sich bewährt, vor allem dank Bibliotheken wie Qt und Boost. Andererseits werde ich meine Hände von C ++ 11 lassen.
Giorgio

Antworten:

24

Sie sollten es lernen, wenn Sie denken, dass Sie es in Zukunft wissen müssen, um einen Job zu bekommen. Wenn Sie zuversichtlich sind, dass Sie als C / C ++ [und was auch immer Sie sonst noch wissen] in der Belegschaft marktfähig bleiben, lernen Sie es nicht. Wenn Ihr Chef Sie auffordert, C ++ 11 zu verwenden, sagen Sie "Nein, das mache ich nicht". Wenn er dich feuert, geh woanders arbeiten. Lernen Sie C ++ 11, wenn Sie davon ausgehen, dass Sie bald keine zufriedenstellende Beschäftigung mit den Fähigkeiten finden werden, die Sie derzeit kennen.

Wollte meine Begründung klarstellen: Ich bin nicht Anti-C ++ 11. Wenn Sie nur sagen, Sie könnten die Frage des OP auf "Warum sollte ich X lernen" verallgemeinern. Ich habe nie ML, Schema oder Haskell gelernt, weil ich einen Job bei C und C ++ habe. Ich bin mir sicher, dass diese Sprachen für jemanden nützlich sind, aber sie sind für mich nicht von Vorteil, wenn ich sie gerade lerne. Wenn mir jemand gutes Geld zum Programmieren in ML anbietet, könnte ich versuchen, es zu lernen.

Timmah
quelle
3
Wenn Sie ein "C / C ++" - Entwickler sind und Ihr Chef Sie auffordert, C ++ 11 zu verwenden, sollten Sie das nicht einfach Ihrem Arsenal hinzufügen? Ich bin damit einverstanden, dass Sie nicht Ihre ganze Zeit damit verbringen sollten, Sprachen zu lernen, nur um sie zu lernen, aber wenn Ihr Chef sagt: "Lerne das", ist es wahrscheinlich eine gute Idee, es zu lernen. Es macht Sie auch marktfähiger, anstatt bei Ihrer nächsten Bewerbung erklären zu müssen, dass Sie wegen Insubordination entlassen wurden.
Panzercrisis
Haskell ... Komisch, weil Lambdas langsam in C ++ aufgenommen werden. : P
rbaleksandar
85

Es ist einfach. Mit C ++ 11 wird Code erheblich einfacher, übersichtlicher und schneller zu schreiben.

nullptrist eine große Verbesserung gegenüber dem alten 0. Es ist typsicher und konvertiert nicht, wenn es nicht anders sein sollte 0. Es ist eine gute Sache, nullptrdie nicht in eine konvertieren wird int. Es macht keinen Sinn, dass das überhaupt passiert. Wissen Sie, was das C ++ - Komitee bei seinen Überlegungen herausgefunden hat #define NULL nullptr? Sachen wie char c = NULL;. Wie schrecklich ist das? Der einzige Grund, warum es hier eine Ausnahme gibt, ist, dass booles sich um einen ganzzahligen Typ handelt, was völlig falsch ist - aber das gab es schon in C ++ und in C. Die Tatsache, dass nullptrkeine Konvertierung durchgeführt wird, ist gut , es ist großartig und Sie sollten es lieben.

Oder wie wäre es mit rWertreferenzen und variadischen Vorlagen? Schnellerer, allgemeinerer Code. Das ist ein totaler Gewinn genau dort.

Wie wäre es mit den Bibliotheksverbesserungen? Sachen wie function, unique_ptrund shared_ptrsind so viel besser als das, was es vorher war, ist es unmöglich , zu argumentieren , dass die C ++ 03 viel besser war.

#define adding_func(x, y) ((x)+(y))

Nicht einmal entfernt gleichwertig. Makros sind aus sechs Milliarden Gründen schlecht. Ich werde sie hier nicht alle zitieren, aber es ist bekannt, dass Makros für so ziemlich alle Zwecke vermieden werden sollten, für die sie möglicherweise vermieden werden können. Was wirst du tun, wenn es ist?

#define add_twice(x) (x + x)

Oh warte, ich hoffe du hast nicht zugenommen oder so x. Wofür die Template-Funktionsversion absolut immun ist. Ich hoffe auch, dass Sie zum Beispiel Namespaces nicht mögen .

Dann öffnen Sie sich einer Welt undefinierten Verhaltens für die Verwendung externer Variablen, deren Gültigkeitsbereiche bereits abgeschlossen sind.

In einer funktionalen API, z. B. STL-Algorithmen, ist die Referenz in Ordnung. Wenn es sich um einen gespeicherten Rückruf handelt, müssen Sie nach Wert erfassen. Unabhängig davon, welche Dokumentation Sie zu der Funktion haben, sollte klar angegeben werden, welche erforderlich ist. Die Tatsache, dass der Code in einem Lambda geschrieben ist, spielt keine Rolle für das Problem, auf lokale Variablen zu verweisen. Wenn Sie ein reguläres Funktionsobjekt übergeben, haben Sie genau die gleichen Probleme. Und es ist kein Problem. Überhaupt. Weil es von Natur aus offensichtlich ist, wann Sie auf lokale Variablen verweisen können und wann nicht.

Nehmen Sie zum Beispiel C. Nach so vielen Jahren lernen und schreiben immer noch viele Menschen Code in C. Warum?

Es gibt viele Menschen, die sich morgens nicht die Zähne putzen. Es gibt viele Mörder, Vergewaltiger und Prostituierte. Und Politiker. Menschen, die Selbstmord begehen. Würden Sie argumentieren, dass dies diese Aktivitäten gut oder nützlich macht? Natürlich nicht. Es ist ein logischer Irrtum, dass es gut oder nützlich sein muss, nur weil es jemand getan hat.

C wird noch aus drei Gründen geschrieben: weil C ++ eine zu implementierende Hündin ist, zum Beispiel im eingebetteten Modus oder im Kernel-Modus; weil ältere Codebasen in C geschrieben sind und das Upgrade zu viel kosten würde, obwohl dies angesichts der hervorragenden C-Interop von C ++ auch fraglich ist; und weil die Leute, die es schreiben, nicht wissen, wie man programmiert. Das ist es. Es gibt keinen anderen Grund, C zu schreiben.

Wenn Sie C oder das alte C ++ verwenden, werden Sie nicht viele Ausnahmen finden.

Wie wäre es mit den pathetischen Arrays im C-Stil, für ein einfaches Beispiel? Die Anzahl der Menschen, die Arrays und Zeiger nicht direkt in den Kopf bekommen können, ist obszön. Ganz zu schweigen von der Tatsache, dass die C-Standard-Bibliothek unglaublich unsicher ist.

Ihre Kernargumente sind voller logischer Irrtümer und Missverständnisse.

DeadMG
quelle
7
> Die Tatsache, dass nullptr nicht konvertiert, ist gut, großartig und Sie sollten es lieben. OK Ihre Meinung, aber beruhigen Sie sich eine Weile darüber, was jemand anderes LIEBEN sollte, bitte ... Der nächste Schritt ist der Talibanismus von C ++ - Anwälten!
Emilio Garavaglia
5
Ich denke, der spätere Teil Ihrer Antwort ist eher der Grund, warum C ++ C vorgezogen werden sollte. Das steht außer Frage. "C-Bibliotheken sind unsicher" - wie um alles in der Welt beantwortet dies die Frage? Ich meine, man sollte natürlich die neuen Funktionen von C ++ 11 kennen lernen, aber C und C ++ sind NICHT dazu gedacht, die gleichen Dinge zu tun. Wenn C ++ eine Hündin ist, die auf niedriger Ebene implementiert werden muss, sind dies auch C #, Java, Python und so weiter, weil sie nicht dazu gedacht waren, so niedrig zu laufen. Nur weil C ++ zu nativem Code kompiliert wird, können Sie OO und das damit verbundene Page Thrashing nicht für kritischen Code auf Kernel-Ebene verwenden.
Yati Sagade
11
@Shahbaz, natürlich musst du ein bisschen mehr über Programmiersprachen lernen (z. B. Typensysteme, lexikalisches Scoping usw.), alle deine Kommentare sind völlig nicht synchron. Beginnen Sie mit diesem Buch: amazon.com/Theories-Programming-Languages-John-Reynolds/dp/…
SK-logic
5
@yati: C ++ hat das gleiche Modulsystem wie C. Member-Funktionen werden als einfache alte C-Funktionen implementiert. Virtuelle Funktionen werden genauso implementiert wie das Laden von Funktionen aus einer DLL. Daran ist nichts verkrüppelt. Und ja, das trifft auf jeden Fall zu. Zunächst einmal ist Ihre Überzeugung, dass Unix das Beste ist, subjektiv. Es ist 5% Marktanteil schlägt anders vor. Und zweitens, auch wenn ich Unix ohne Ende verehre, wird ein Beispiel keinen Trend setzen. Gleiches gilt für die anderen von Ihnen angeführten Beispiele. Welche Beispiele? Sie sind bedeutungslos. C ++ ist für Prozeduren genauso geeignet wie C.
DeadMG
8
@yatisagade C ++ ist eine Multiparadigmasprache, die virtuelle Funktionen nicht für alle erzwingt, und meine Programme in C ++ sind ähnlich. Teile davon verwenden objektorientiertes Design, Teile davon sind funktional usw., je nachdem, was dieses bestimmte Teilproblem am besten löst. Ich schätze C ++ für das Hinzufügen des objektorientierten Stils, und ich schätze C ++ 11 für die stark erweiterte Unterstützung für die funktionale Programmierung.
David Stone
29

C ++ 11 ist keine neue Sprache. Es ist nur eine Erweiterung / Modifikation von C ++, die Sie bereits kennen. C ++ 11 besteht wie jede andere Programmiersprache aus Funktionen. Viele von ihnen waren von früher da, einige von ihnen sind neu. Aber Ihre Frage ist wirklich, sollte ich alle Funktionen der Sprache lernen (in diesem Fall C ++ 11) oder mich nur mit 90% davon vertraut machen?

IMO, auch wenn Sie nicht alle Sprachen verwenden, sollten Sie zumindest nachlesen, was die neuen Funktionen für Sie tun. Viele von ihnen wurden eingeführt, um das Schreiben von Bibliotheks- / Framework-Code (insbesondere von Vorlagen) zu vereinfachen (z. B. bevor eine perfekte Weiterleitung in C ++ 11 nicht möglich war). Wenn Sie diese Funktion jedoch noch nie benötigt haben, haben Sie die Chance gewonnen bemerken nicht, dass diese Funktionen in C ++ 11 hinzugefügt wurden.

Auf der anderen Seite, wenn Sie zuvor Bibliotheks- / Kerncode geschrieben haben, der einige STL / Boost-Funktionen imitiert, und sich durch die Sprache eingeschränkt fühlen, weil Sie dann zu 95% eine sehr coole, elegante Lösung gefunden haben Sie wurden gestoppt, weil Sie herausgefunden haben, dass die Sprache einfach nicht das unterstützt, was Sie wollen. Sie werden die wirklich großartige Leistung von C ++ 11 erkennen. Seitdem unser Team ein Upgrade auf VS2010 durchgeführt hat (und wir dabei Boost entdeckt haben), konnte ich verrückten, großartigen Code entwickeln, der vor Dingen wie Verweisen auf R-Werte und Weiterleitung von Vorlagenparametern einfach unmöglich wäre.

Auch Dinge wie Lambda mögen fremd aussehen, aber sie führen kein neues Konstrukt ein. Stattdessen machen sie das, was wir früher hatten, so viel einfacher zu schreiben. Zuvor musste jede Lambda-Funktion eine eigene Klasse sein. Jetzt ist es nur {... code ...}. Liebe es.

Der Schlüssel ist, sich diese Funktionen nicht anzuschauen und zu überlegen, wie entmutigend die Liste ist. Verwenden Sie stattdessen C ++ wie gewohnt, und wenn Sie auf ein Szenario stoßen, in dem diese neuen C ++ 11-Funktionen nützlich sind (mehr als 90% der Benutzer werden diesen Punkt nie erreichen), werden Sie sehr glücklich sein, dass die Erweiterung funktioniert auf die sprache wurde eingegangen. Im Moment würde ich vorschlagen, dass Sie nur genug über die Sprache lernen, um zu wissen, was es gibt, und nicht unbedingt, wie Sie alles verwenden.

DXM
quelle
7
@ Shahbaz - Ich denke, Sie vermissen immer noch die Absicht, warum namenlose Funktionen hinzugefügt wurden. Und "Variablen verwenden, ohne sie als Eingabe zu verwenden" wird Closure genannt und ist in vielen anderen Hochsprachen verfügbar. Wenn Sie viel Template-Code mit functor-Objekten geschrieben haben, würden Sie mit C ++ 11 Lambda-Funktionen mit offenen Armen begrüßen. Stellen Sie es sich so vor ... Wenn der Compiler Maschinencode generiert, gibt es keine Template-Funktion oder Klasse. Sie werden alle "instanziiert", um vor diesem Punkt konkrete Klassen / Funktionen zu erstellen. Lambdas sind das gleiche, wenn es um Stateful geht ...
DXM
5
... Funktoren. Anstatt die Leute eine Menge Code schreiben zu lassen, einen für jeden Funktortyp und jedes Abschlusselement, das Sie übergeben möchten, können Sie in C ++ 11 eine Verknüpfungssyntax angeben und eine gesamte interne Funktorklasse wie folgt automatisch instanziieren es instanziiert Vorlagen. Denken Sie auch hier daran, dass die meisten dieser Funktionen in 98% des Codes auf Anwendungsebene nicht verwendet werden. Sie wurden jedoch hinzugefügt, um Bibliotheken wie STL / Boost so viel leistungsfähiger und einfacher zu implementieren / warten / debuggen
DXM
10
@ Shahbaz: Okay, du verstehst keine Lambda-Funktionen oder Verschlüsse. Das klingt plausible. Die Tatsache, dass sie in vielen verschiedenen Sprachen verwendet werden, sollte nahelegen, dass sie nützlich sind, unabhängig davon, ob Sie sie verstehen oder nicht, und dass Sie sie verstehen sollten, bevor Sie sie zu sehr kritisieren.
David Thornley
8
@ Shahbaz: Wenn Sie glauben, dass Closures globalen Variablen ähnlich sind, verstehen Sie Closures nicht. (Hinweis: Globale Variablen verursachen Probleme, da sie durch jede Funktion geändert werden können.) Wenn Sie das Konzept von Lambdas und nicht die Implementierung verstanden hätten, würden Sie dies nicht auf die Verwechslung von Klassen und Code zurückführen. Alles im C ++ Standard gibt es aus Gründen, die eine große Anzahl intelligenter Menschen überzeugten. Sie müssen den Gründen nicht zustimmen, aber ohne sie zu kennen, kritisieren Sie sie aus Unwissenheit.
David Thornley
6
@ Shahbaz, es gibt absolut keine Ähnlichkeit zwischen Closures und Globals. Lies dies: en.wikipedia.org/wiki/Lambda_calculus und um dein Gehirn in die Luft zu jagen
SK-logic
18

Ist es so schwer, eine Funktion zu schreiben, dass Sie den Inhalt der Funktion in den Code schreiben müssen, ohne ihm einen Namen zu geben?

Wenn Sie dies tun, scrollen Sie nach oben oder öffnen eine neue Quelldatei und fügen dort die Definition der Funktion hinzu. Dann müssen Sie zurückgehen und weiterarbeiten, was Sie bis zu einem gewissen Grad ablenkt.

Wenn andere Leute Ihren Code lesen, ist ein Lambda in manchen Fällen möglicherweise selbstdokumentierender, anstatt zu sagen: "Oh, was macht diese Funktion?" und wenn Sie zu seiner Deklaration springen, können Sie sich einfach ansehen, was er an seiner eigenen Stelle tut.

Es gibt ein nettes Gespräch von Herb Sutter über Lambdas, vielleicht kann er dich besser überzeugen:

http://channel9.msdn.com/events/PDC/PDC10/FT13

Warum schreibst du den Code nicht einfach dort hin, anstatt ihn zu einer Lambda-Funktion zu machen?

Weil Sie dies nicht tun können, wenn Sie STL-Algorithmen oder eine Funktion verwenden, für die Sie eine Funktion übergeben müssen.

#define addition_func (x, y) ((x) + (y))

Es gibt keine Möglichkeit, diese Verwendung anstelle von Lambdas zu rechtfertigen. Sie können Ihren Code nicht überall mit Makros füllen. Makros und Funktionen haben unterschiedliche Zwecke, und eines ist im Allgemeinen kein Ersatz für das andere.

template<class Lhs, class Rhs>
auto adding_func(const Lhs &lhs, const Rhs &rhs)
                -> decltype(lhs+rhs) {return lhs + rhs;}

Ich stimme zu, das ist hässlich. Ich erinnere mich jedoch, dass ich sagte: "Warum zum Teufel sollte ich die Art dieses Ausdrucks herausfinden, obwohl der Compiler darauf schließen kann?" in vielen Fällen. Dies kann in diesen Momenten sehr hilfreich sein.

Um zusammenzufassen:

Obwohl die neuen Funktionen von C ++ 11 in ihrer Syntax hässlich erscheinen, glaube ich, dass man sich in kurzer Zeit an sie gewöhnen kann. Jedes neue Sprachkonstrukt ist zunächst schwer zu lernen; Stellen Sie sich das erste Mal vor, als Sie gelernt haben, eine ganze Klasse zu schreiben: Setzen Sie die Deklaration in die Header-Datei, nicht vergessen Sie das zusätzliche Semikolon am Ende, setzen Sie die Definitionen in die Quelldatei, einschließlich der Header-Datei, und stellen Sie dabei sicher, dass es einen Schutz zum Verhindern gibt mehrfache Einschlüsse, nicht zu vergessen der Gültigkeitsbereichs-Auflösungsoperator in den Member-Funktionsdeklarationen und so weiter ...

Aber ich bin mir ziemlich sicher, dass Sie sich nach dem Schreiben einiger Klassen daran gewöhnen und nicht über die Komplexität dieses Prozesses nachdenken: Weil Sie wissen, dass eine Klasse Ihre Arbeit als Programmierer viel einfacher macht und Sie das Hilfsprogramm Die Einnahmen aus diesem neuen Konstrukt sind viel größer als der Nutzwertverlust während des Versuchs, die Sprache zu lernen . Ich denke, dies kann der Grund sein, warum man versuchen sollte, C ++ 11 zu lernen oder auf ähnliche Weise zu verwenden.

laut und klar
quelle
Argumente über Selbstdokumentation und weniger Scrollen usw. Ich bin mir ziemlich sicher, dass entgegengesetzte Argumente wie "Überfüllungscode", "Zugriffsbeschränkung" usw. verwendet wurden, um zu argumentieren, warum Funktionen außerhalb der Klasse verboten werden müssen. Ich denke, die Leute müssen mehr Erfahrung sammeln, um zu entscheiden, was besser ist. Mir scheint, dies ist entweder ein fehlgeschlagenes Experiment oder ein schlechtes Design. Ich bin mehr davon überzeugt, nicht die Laborratte in diesem Experiment zu sein.
Shahbaz
Wenn die Syntax hässlich aussieht, nehmen Sie zum Beispiel diese beiden: bool is_alive;und bool thisSpecialObjectOfMineIsAlive;. Beide machen dasselbe, aber der zweite sieht wirklich hässlich aus. Warum? Weil ich fälschlicherweise dachte, dass das Setzen von mehr Informationen es klarer macht, aber es hat das Gegenteil bewirkt. Stroustrup meinte es gut, indem er uns Features gab, aber er machte es einfach nicht gut aussehend. Für mich zeigt dies ein schlechtes Design.
Shahbaz
3
gut aussehend! = gut und schlecht aussehend! = schlecht.
DeadMG
@ Shahbaz: Ich denke, Lambdas sind großartige Konzepte (und es gibt sie schon seit vielen Jahren in Sprachen wie Lisp). Ich benutze sie oft in Haskell. Ich bin mir weniger sicher, dass sie in Sprachen wie C ++, Java usw. passen. Sie fühlen sich für mich wie ein nachträglicher Einfall an: etwas, das später hinzugefügt wurde, weil Lambdas populär geworden sind. Warum wurden sie nicht von Anfang an in diesen Sprachen eingeführt? Hatten Stroustrup und Goslin noch nie von Lisp gehört?
Giorgio
8

Tatsächlich hat das OP einige Punkte, was die meisten Antworten betrifft. Aber sie haben eine "ferne" Sicht. C ++ (einschließlich C-Teilmenge) hat eine lange Geschichte, in der im Laufe der Zeit eine Reihe von Funktionen hinzugefügt wurden, von denen einige mehr oder weniger häufig verwendet und - durch ihre Verwendung und Fehler - in andere und andere perfektioniert wurden.

Manchmal kommt es vor, dass nach der Einführung eines neuen Features ein altes Feature nicht mehr benötigt wird oder im Widerspruch dazu steht. Eine "saubere" Sprache sollte so wie sie ist selbstkonsistent sein und nicht mehr benötigte Funktionen sollten entfernt werden.

Aber das Hinzufügen zerstört nichts. Durch Entfernen (oder Ändern) wird vorhandener Code beschädigt, der sich noch in der Produktion befindet. Unabhängig davon, welche Funktion Sie hinzufügen, müssen Sie darauf achten, vorhandenen Code nicht zu beschädigen (insbesondere nicht unbemerkt zu beschädigen , damit er andere Aufgaben ausführt als beabsichtigt ).

Musst du das alles lernen? Ja, weil alle Funktionen früher oder später - im Guten oder im Schlechten - genutzt werden. Ob dies eine gute Sache für die "Qualität" der Sprache ist (zugeben, dass es ein objektives Maß dafür gibt), ist eine andere Geschichte: Wie lange sollte die Abwärtskompatibilität erhalten bleiben? Es ist schwer eine Antwort zu finden, wenn jemand 3 Jahre sagt und einige andere sagen 50.

Die Alternative, um C ++ "normaler" zu halten, ist ... häufiger zu brechen, mit einem Neustart von Grund auf. Es wird aber kein C ++ mehr geben.

Es gibt auch Versuche, dies zu tun (denken Sie zum Beispiel an D: viel orthogonaler als C ++ (sogar 11) tatsächlich ist), aber wie beliebt sind sie? Einer der Gründe für die Schwierigkeit, Schwung zu bekommen, ist die Inkompatibilität mit vielen vorhandenen Codes, die noch ausgeführt werden müssen.

C ++ 11 ist für mich eindeutig ein Kompromiss zwischen neuen Anforderungen und Abwärtskompatibilität. Dies führte zu einer gewissen "Verwirrung" der Spezifikationen und der Implementierung. Bis die Kosten für dieses "Chaos" geringer sind als die Kosten für Inkompatibilität ... müssen Sie diesen Kompromiss einhalten.

Wenn Sie es nicht mehr ertragen können, ... ziehen Sie besser eine andere jüngere Sprache in Betracht. C ++ kann in diesem Sinne einfach nicht vereinfacht werden. Nicht in diesem Alter.

Emilio Garavaglia
quelle
Ich stimme auch zu. Und als Entwickler finde ich es sehr beunruhigend, eine Sprache zu haben, die sich ständig ändert (die ich immer wieder lernen muss). Wenn Sie eine neue Sprache entwickeln, sollten Sie einen neuen Anfang machen und einen anderen Namen verwenden. Wenn Sie möchten, dass es mit altem Code zusammenarbeitet, gibt es dafür eine separate Kompilierung. Daher verstehe ich die Politik, eine vorhandene Sprache zu ändern, indem ich die neuesten Funktionen einbeziehe, die in Mode gekommen sind, wirklich nicht. Wie schon gesagt: Weiterentwicklung bedeutet nicht automatisch Fortschritt.
Giorgio,
"C ++ kann in diesem Sinne einfach nicht vereinfacht werden. Nicht in diesem Alter.": Warum folgen dann andere Programmiersprachen (zB C, Ada, ...) nicht dem gleichen Weg? Vielleicht, weil sie eine eigene Nische von Anwendungen haben und nicht für alle möglichen Anwendungsbereiche das Werkzeug sein sollen .
Giorgio
@giorgio: ja ... du hast wahrscheinlich recht im "pragmatischen" sinne. Aber in der Theorie ... Ich erinnere mich an einige gute Tage, in denen Pascal die "unterrichtende Bezugssprache" und Ada die "Alles Programmiersprache Möchtegern" war.
Emilio Garavaglia
Ich habe auch Programmieren in Pascal gelernt. Soweit ich weiß, hat Ada mehrere Revisionen durchlaufen, aber das grundlegende Design der Sprache wurde nicht untergraben. Das gleiche gilt für C und Pascal. Wenn man eine wirklich neue Sprache entwickeln will, sollte man mutig genug sein, eine klare Linie zu setzen und etwas Neues zu beginnen, wie D, Java, C #. Mein Problem mit dem aktuellen Pfad, den C ++ einnimmt, ist, dass er (unnötigerweise) zu komplex wird. Wenn die Prinzipien von KISS und YAGNI für das Softwaredesign gelten, warum sollten sie dann nicht auch für das Design von Programmiersprachen gelten?
Giorgio
@ Giorgio: oh ... sie gelten ... genau wie du gesagt hast. Wenn Sie der Meinung sind, dass C # oder D eine bessere Wahl getroffen haben als ein "ausgekochtes" C ++ (meine Interpretation Ihres Gefühls), verwenden Sie sie einfach anstelle von C ++. Mit der Zeit stirbt C ++ langsam ab. Momentan sehe ich, dass C ++ 11 dem "gekochten" C ++ 03 eine neue Chance gibt und D noch etwas fehlt, um die Startbarriere zu durchbrechen. Wirtschaft und Unternehmensinteressen spielen auch eine Rolle bei der Finanzierung und Förderung der Entwicklung. Theoretisch haben Sie recht, aber die reale Welt ist komplexer.
Emilio Garavaglia
7

Auch wenn Sie sich dazu entschließen, die neuen C ++ 11-Funktionen zu ignorieren, profitieren Sie dennoch davon, da sie von der C ++ Standard Library verwendet werden. In C ++ 98 beispielsweise war das Vorhandensein einer Variablen des Typs vector<string>aufgrund der Anzahl der Kopien, die erstellt werden mussten, wenn der Vektor größer wurde, potenziell eine Leistungsstörung. Mit dem Move-Konstruktor von C ++ 11 ist dies kein Problem. Tatsächlich wünschte ich mir, C ++ 11 hätte uns mehr neue Funktionen gebracht, nicht weniger - insbesondere in der Standardbibliothek.

Nemanja Trifunovic
quelle
6

Nach so vielen Jahren lernen und schreiben immer noch viele Menschen Code in C. Warum? Weil die Sprache gut ist.

Erstens lernen die meisten Schüler heutzutage Java oder .NET, nicht C. Zweitens verwenden die Leute C immer noch, nicht nur wegen seiner Vorteile als Sprache, sondern hauptsächlich, weil es eine riesige Menge vorhandener Software gibt, die in C geschrieben ist und dies erfordert gepflegt und erweitert werden, und da in vielen Fällen (zB Embedded-Plattformen) ein C-Compiler alles ist, was es gibt. Übrigens sind dies einige der Gründe, warum immer noch COBOL geschrieben wird.

Es ist sehr selten, dass ein Programmierer in der Branche anfängt, an einem brandneuen Projekt zu arbeiten, das nicht an eine vorhandene Codebasis gebunden ist, und weiterhin alleine arbeitet. Der Grund für das Erlernen von C ++ 11 ist, dass Sie wahrscheinlich mit Code umgehen müssen, der von anderen Personen geschrieben wurde und die neuen Funktionen verwendet. Außerdem wurden die hinzugefügten Funktionen aus einem bestimmten Grund hinzugefügt. Sobald Sie sie gelernt und benutzt haben, werden Sie sie vielleicht zu schätzen wissen.

Dima
quelle
Sie haben meinen Satz unvollständig zitiert. Wie ich im folgenden Satz sagte, goodbedeutet dies, dass Regeln für eine gute Gestaltung der Programmiersprache befolgt werden. Ich weiß nicht, wo Sie studieren, aber ich kenne 4 oder 5 Länder, und alle beginnen mit C Programmieren zu lernen. Wie ich bereits sagte, gibt es bei C fast keine Ausnahmen (etwas, das in Java anders ist, kann man kaum machen) finde ein Konstrukt, das keine Ausnahme hat).
Shahbaz
1
@ Shahbaz: Ich habe vollständige Sätze zitiert. Sie haben einen Kausalzusammenhang hergestellt, und ich sagte, dass er bestenfalls unvollständig ist. Zum Glück lerne ich nicht mehr. :) Davon habe ich genug gemacht. Ich lebe in den USA und als ich vor über 15 Jahren aufs College ging, war C die Einführungssprache. Heutzutage beginnen die meisten US-Schulen jedoch mit Java, und es gibt nicht so viele junge Programmierer, die C.
Dima
5
@ Shahbaz: Ich sehe das Problem mit Sprachregeln, die Ausnahmen haben, nicht wirklich. Ja, C ist eine viel einfachere Sprache als C ++. Andererseits erleichtert C ++ das Schreiben von einfacherem Code. Um einfacheren Code zu schreiben, benötigen Sie mehr Sprachfunktionen. Das macht die Sprache komplexer. Ich mag Dinge wie Klassen, Referenzen, RAII, Vorlagen, Konstruktoren, Destruktoren, Ausnahmen und Namespaces. Aber Sie sagten, Ihre Frage betraf nicht C vs C ++, deshalb habe ich in der Antwort nicht darüber geschrieben.
Dima
5
  • Assembly wurde erstellt, weil die Leute nicht gerne Maschinencode schreiben
  • C wurde erstellt, weil die Leute nicht gerne Assembly schreiben
  • C ++ wurde erstellt, weil die Leute nicht gerne C schreiben
  • C ++ 11 wurde erstellt, weil die Leute nicht gerne C ++ schreiben

Sie werden zu einem Zeitpunkt in Ihrer C ++ - Karriere kommen, an dem Sie sich sagen: "Ich wünschte, Funktoren wären einfacher" oder "Warum ist NULL ein Int?" und dann werden Sie C ++ 11 verstehen.

Pubby
quelle
Alle Sprachen wurden erstellt, weil jemand die vorhandenen nicht mochte. Das macht keinen von ihnen gut.
Shahbaz
Ich sage nicht, NULLsollte ein sein int. Das sollte es nicht. Was ich nicht für richtig halte, ist, ein Konstrukt in der Sprache einzuführen, das dieses Problem löst, aber Ausnahmen einführt. Sie hätten dasselbe besser können sollen.
Shahbaz
2
"C ++ 11 wurde erstellt, weil die Leute C ++ nicht mochten": Wenn sie C ++ nicht mochten, warum ist C ++ eine Teilmenge von C ++ 11?
Giorgio,
1
Es sollte sein: C # und Java wurden erstellt, weil die Leute nicht gerne C ++ schreiben.
Calmarius
4

Lernen ist immer von Vorteil. Wissen ist Macht.

Das ist im Grunde die Antwort. Alles andere sind nur Details darüber, wie genau Sie davon profitieren können und welche Fähigkeiten Sie haben, wenn Sie es wissen, und sie sind so zahlreich, dass jede Aufzählung unvollständig wäre.

Ein Beispiel ist Ihre eigene Frage. Man würde es nicht einmal fragen können, ohne zumindest ein bisschen davon zu lernen.

Und wie ich bereits bemerkte, geht es nicht darum, warum man lernt, sondern warum man es einsetzt . Und das ist eine ganz andere Frage.

littleadv
quelle
4

Sie sollten C ++ 11 lernen, da Sie mit den hinzugefügten Funktionen besseren Code schreiben können. Einige Leute haben die Typensicherheit von NULL-Zeigern und Lambdas erwähnt, die sehr nett sind. Ich möchte jedoch darauf aufmerksam machen, was meiner Meinung nach die dramatischste Änderung in C ++ 11 ist, insbesondere in einer großen Produktionsumgebung: die Verschiebungssemantik.

C ++ 11 unterstützt die Begriffe "Verschieben" und "Kopieren". In regulärem C ++ haben wir nur den Operator =, der im Grunde beides macht. In Wirklichkeit bringen wir mit einem Bediener zwei unterschiedliche Ideen zum Ausdruck, was gefährlich ist.

Das offensichtlichste Beispiel dafür, wo dies nützlich ist, ist das neue unique_ptr. Es hat die besten Eigenschaften des alten auto_ptr und scoped_ptr. Angenommen, wir möchten einen Zeiger haben, der garantiert der einzige Zeiger ist, der auf ein Objekt zeigt. Wie gehen wir mit a = b um? Nun, bevor wir feststeckten, konnten Sie es entweder komplett verbieten (als scoped_ptr), oder wir konnten tun, was auto_ptr tut, wenn a = b b das Eigentum stiehlt. Dieses Verhalten von auto_ptr ist sehr verwirrend, da a = b tatsächlich b ändert. unique_ptr behandelt dies: a = b ist nicht erlaubt, aber Sie haben a = std :: move (b), um den Besitz zu stehlen. Wie ist das nützlich? Dabei gibt es eine separate (überladene) Version von Swap, die die Verschiebungssemantik anstelle der Kopiersemantik verwendet. Dies bedeutet, dass unique_ptr problemlos ausgetauscht werden kann. Dies bedeutet, dass unique_ptr im Gegensatz zu auto_ptr ist sicher in einem Container zu verwenden und dann sortieren zu sagen. unique_ptr ist im Grunde genommen das A und O der sicheren Speicherverwaltung, wenn Sie nicht mehrere Zeiger auf dasselbe Objekt benötigen.

Ein weiteres gutes Beispiel: Angenommen, Sie haben ein Objekt, das nicht kopiert werden kann. Dies ist in einer Reihe von Situationen nützlich. Sie können dieses Objekt niemals von einer Funktion zurückgeben, da es beim Beenden der Funktion alles kopiert, was Sie zurückgeben. Das Ironische ist, dass der Compiler dies normalerweise tatsächlich optimiert (dh am Ende wird nichts kopiert, der Rückgabewert wird an der Adresse der eventuellen Zuweisung erstellt). Aber das hat nichts damit zu tun, warum wir es unkopierbar gemacht haben. Wenn Sie von einer Funktion zurückkehren, verschieben Sie das Objekt einfach vom inneren Funktionsumfang nach außen. Sie können jetzt Objekte schreiben, die nicht kopierbar, aber beweglich sind, und diese Objekte können von Funktionen zurückgegeben werden.

Die Verschiebungssemantik erleichtert das Schreiben von Code, der nicht ausläuft und threadsicher ist.

Nir Friedman
quelle
Übrigens auch effizient.
Nir Friedman