C++ 09 (Split aus Artikel)
-
Danke für den hervorragenden Artikel! Ich hatte bisher ansatzweise immer mal wieder was über C++0x augeschnappt, aber in so ausführlicher und konkreter Form noch nicht gelesen.
Und an alle, die von der nun noch ausgebauten Komplexität von C++ abgeschreckt sind... es wurde ja bereits von anderen darauf hingewiesen, dass ein Großteil der neuen Features das Erstellen von und das Arbeiten mit Libraries verbessert. Davon profitieren sehr wohl auch wir Wald-und-Wiesen-Programmierer - wir sind aber nicht gezwungen, uns mit all den neuen Feinheiten zu beschäftigen! Erst, wenn der eigene Code komplexer wird und man dann neugierig wird, warum dieses und jenes mit der std-Lib o.ä. so viel eleganter oder effizienter geht, als man es bisher mit den eigenen Implementierungen hinbekommt... dann wird man evtl. neugierig und sich nach und nach auch mit den fortgeschrittenen C++-Features beschäftigen. Genau den selben Effekt hat und hatte man bereits bei dem Übergang von klassischem C/C++/"C with classes" zu modernem, templatebasierten C++/STL.
Wer sich über die "unnötige" Komplexität von C++ beschwert, hat meiner Meinung nach die (erfolgreiche!) Philosphie dieser Sprache nicht verstanden: "you only pay for what you use", du bezahlst nur für das, was du auch nutzt. Wer keine Templates verwenden möchte oder noch nicht so weit ist, wer die neuen Lambda-Ausdrücke nicht verwenden möchte, der kommt damit auch nicht in Berührung! Es entsteht kein Nachteil, also wozu sich künstlich darüber aufregen? Weil es schwieriger wird, fremden Code zu lesen, der diese Features verwendet? Das war schon immer eine Besonderheit von C++: inter-Compiler-kompatibel aber selten inter-Programmierer-kompatibel, eben heftig "multi-paradigmatisch". Und wenn man ehrlich ist, kann man in jeder Sprache unleserlichen Code schreiben. Den Effekt, dass man mehr Unleserliches in der einen Sprache als in der anderen zu sehen bekommt, würde ich eher der Verbreitung und dem Benutzerkreis zuschreiben, der sich mit dieser Sprache versucht.
Es gibt natürlich Programmierer, die unter den ganzen neuen Features "leiden" werden: die Compiler-Entwickler und die Entwickler von C++-Source-Analysewerkzeugen im weitesten Sinne, etwa Visual-Assist. Aber das ist ganz einfach deren Job. C++ war schon immer eine schwer zu parsende Sprache, aber man kann es in den Griff bekommen, wie die Entwicklungen der letzten Jahre zeigen (einfaches aber funktionierendes Refactoring für C++ etwa).
Ich habe jedenfalls etliche Features in diesem Artikel entdeckt, die mir so noch nicht bekannt waren und für die ich persönlich sehr wohl Verwendung wüsste. Die syntaktischen Änderungen finde ich zum Teil durchaus elegant, wenn man beachtet, wie es vermieden wurde, neue Operatoren oder neue reservierte Wörter einzuführen. Wenn man sich auch nur ein wenig damit beschäftigt, einfach ein wenig dazu bereit ist, über seinen Programmiereralltagstellerrand hinauszuschauen, dann wird einem schnell klar, was für ein schwierigen Job das Standardisierungs-Gremium und alle anderen Beteiligten haben und wie gut sie ihn bisher gemeistert haben.
Ich jedenfalls mag C++ und freue mich auf die neue Version. Ich mag andererseits auch Java und C# und bewundere immer wieder aufs Neue, welche mächtigen unterstützenden Features die IDEs für diese Sprachen aufweisen, was eben nur bei Sprachen möglich ist, die von Grund auf auf klares und effizientes Parsing ausgelegt wurden. Dies ist für mich auch ein valider Grund, um den Sprachumfang einzuschränken. Aber sicher NICHT, bloß weil jemand dieses oder jenes Feature missbrauchen könnte (klassischer Kritikpunkt am Operator-Overloading und die gute alte "How to shoot yourself in the foot..."-Diskussion). Für Anfänger und Gelegenheitsprogrammierer gibt es entsprechend geeignete Sprachen; von Profis würde ich erwarten, dass sie fähig sind, zu lernen, was sie benötigen und was sie erstmal ignorieren können, ohne dabei öfter als nötig auf die Nase zu fallen - und wenn man auf die Nase fällt, dann sollte man es als Lehrstück nehmen und nicht auf die Sprache schimpfen!
Ok, genug erstmal. Danke nochmal an den Autor des Artikels und ich freue mich auf das neue C++. Kann es gar nicht erwarten, bis alles in die Compiler integriert wurde. (Wie lange es diese Mal wohl dauern wird?)
-
Obiwan2A schrieb:
Wer sich über die "unnötige" Komplexität von C++ beschwert, hat meiner Meinung nach die (erfolgreiche!) Philosphie dieser Sprache nicht verstanden: "you only pay for what you use", du bezahlst nur für das, was du auch nutzt.
Ich würde es nicht so negativ sehen und als Bezahlen bezeichnen. Man bekommt sogar was geschenkt, wenn man die Featutes benutzt.
C++ ist nicht übermäßig komplex. Nur, manche Programmierer neigen dazu grausamen Kauderwelsch zu produzieren, weil sie krampfhaft versuchen schönes, sauberes C++ zu schreiben. Das ist aber nicht Sinn der Sache und C++ selbst kann nichts dafür.
-
funky cat schrieb:
Obiwan2A schrieb:
Wer sich über die "unnötige" Komplexität von C++ beschwert, hat meiner Meinung nach die (erfolgreiche!) Philosphie dieser Sprache nicht verstanden: "you only pay for what you use", du bezahlst nur für das, was du auch nutzt.
Ich würde es nicht so negativ sehen und als Bezahlen bezeichnen. Man bekommt sogar was geschenkt, wenn man die Featutes benutzt.
Das ist auf die Performance bezogen. C++ macht keine versteckten Sachen, das ist der groesste Vorteil (und auch der groesste Nachteil) der Sprache. Der Programmierer behaelt die volle Kontrolle: deshalb "bezahlt man nur fuer die Sachen die man auch wirklich braucht" - keine versteckten kosten wie zB virtuelle Methodenaufrufe in einem nicht polymorphen kontext und aehnliches.
C++ ist nicht übermäßig komplex. Nur, manche Programmierer neigen dazu grausamen Kauderwelsch zu produzieren, weil sie krampfhaft versuchen schönes, sauberes C++ zu schreiben. Das ist aber nicht Sinn der Sache und C++ selbst kann nichts dafür.
C++ ist sehr komplex. Das ist der Sinn der Sprache: multiple Paradigmen zu unterstuetzen verlangt komplexitaet.
komplexitaet != kauderwelsch
-
Shade Of Mine schrieb:
C++ ist sehr komplex. Das ist der Sinn der Sprache: multiple Paradigmen zu unterstuetzen verlangt komplexitaet.
Unsinn, ich würde C++ eher als umfangreich denn als komplex bezeichnen. Vielleicht führt die Menge an Sprachfeatures dazu, daß es sich manche zu kompliziert [nicht komplex] machen. Man kann C++ auf jedem Level benutzen. Wenn das Problem nicht komplex ist, ist die Lösung mit C++ auch nicht komplex. Im Gegenteil: Selbst relativ komplexe Aufgaben können mit C++ einfacher lösbar sein, als mit einer anderen Sprache.
-
funky cat schrieb:
Shade Of Mine schrieb:
C++ ist sehr komplex. Das ist der Sinn der Sprache: multiple Paradigmen zu unterstuetzen verlangt komplexitaet.
Unsinn, ich würde C++ eher als umfangreich denn als komplex bezeichnen. Vielleicht führt die Menge an Sprachfeatures dazu, daß es sich manche zu kompliziert [nicht komplex] machen. Man kann C++ auf jedem Level benutzen. Wenn das Problem nicht komplex ist, ist die Lösung mit C++ auch nicht komplex. Im Gegenteil: Selbst relativ komplexe Aufgaben können mit C++ einfacher lösbar sein, als mit einer anderen Sprache.
Vielleicht kann man sich darauf einigen :D, dass C++ zwar demjenigen eine recht extreme Komplexität zeigt, der sich traut, tiefer einzusteigen. Die Mächtigkeit, die für diese Komplexität verantwortlich ist, erlaubt es andererseits aber auch, viel davon zu verstecken. (Solange man nicht über kryptische Template-Fehlermeldungen stolpert - aber das wird sich ja hoffentlich mit C++09 etwas bessern.)
Vielleicht sollte man auch unterscheiden zwischen der internen Komplexität einer Sprache (ja, multiple Paradigmen führen sicherlich unvermeidbar zu einer hohen Sprachkomplexität) und der auf der jeweiligen Ebene sichtbaren Komplexität. Es hört sich immer so an, als müsste man erst alle Features von C++ studieren, um damit produktiv arbeiten zu können, was ich bestreiten möchte. Sicherlich kann man unter Umständen noch produktiver arbeiten, wenn man tiefer einsteigt - man ist jedoch nicht gezwungen, sich von Anfang an der vollen Komplexität dieser Sprache auszusetzen.
Und ja, stimmt schon, eigentlich bezog sich das "you only pay for ..." auf die Kosten benutzter Ressourcen. Aber ich finde, diese Philosophie passt auch ganz gut auf die verschiedenen Komplexitätsebenen, auf denen man sich mit C++ beschäftigen kann. Man muss i.A. eben nicht darunter leiden, dass C++ eine so mächtige und komplexe Sprache darstellt. Ich vermute, es leiden viel mehr Anfänger unter Eigenheiten, die von C geerbt wurden (Schon mal ein Semikolon am Ende eines Headerfiles vergessen?
) als unter den tatsächlichen C++-Eigenheiten.
-
Wird hier wieder OT...

-
Obiwan2A schrieb:
Kann es gar nicht erwarten, bis alles in die Compiler integriert wurde. (Wie lange es diese Mal wohl dauern wird?)
Ich kann es auch kaum erwarten damit rumzuspielen und Bibliotheken zu sehen welche Concepts an ihre Grenzen bringen.
Die Implementierung glaub ich wird nicht so lange dauern. Es steht jetzt ja schon vieles fest von daher dürften die meisten Hersteller jetzt schon am werkeln sein. RValue Referenzen, Variadic Templates und ein paar kleinere Sachen sind zum Beispiel jetzt schon in aktuellen GCC Versionen implementiert. (Diese Features können mit -std=c++0x eingeschaltet werden.) Für Concepts gibt es mit dem ConceptGCC auch schon einen Prototypen und die GCC Entwickler werkeln auch schon an der Version welche mal in den produktiven Einsatz kommen wird. Was wahrscheinlich am längsten brauchen wird sind die Lambdausdrücke.
-
Artchi schrieb:
Wird hier wieder OT...

Jap, vllt könnte eine Moderator das splitten und nen eigenen Thread dafür erstellen.
-
Warum wurde denn versäumt einfache Stringvergleiche über switch-Blöcke einzubauen?
-
pffffffff schrieb:
Warum wurde denn versäumt einfache Stringvergleiche über switch-Blöcke einzubauen?
Was spricht gegen else-if-Kaskaden?
-
pffffffff schrieb:
Warum wurde denn versäumt einfache Stringvergleiche über switch-Blöcke einzubauen?
Was spricht gegen std::map?
-
pffffffff schrieb:
Warum wurde denn versäumt einfache Stringvergleiche über switch-Blöcke einzubauen?
Welchen Vorteil hätte man?
-
pffffffff schrieb:
Warum wurde denn versäumt einfache Stringvergleiche über switch-Blöcke einzubauen?
Ganz einfach: Dann müsste man das Typsystem ändern und wie z.B. in C# vielleicht alles von Basisobjekten ableiten. Den ein switch soll auch sinnvoll in der Ausführungsgeschwindigkeit bleiben. Also z.B. müsste jedes Objekt eine Hashwertfunktion bekommen.
Vielleicht fertigt dir ja jemand (falls es funktioniert) ein Templatemetaprogramm für Hashwerte von strings an, und liefert dir noch eine kompatible Hashfunktion zur Laufzeit mit, dann könntest du dies auch schon jetzt verwenden (Als Casemarken der vom Template gebildete Hashwert, als übergabe die Laufzeitberechnung...).
cu André