In einer verwandten Frage wurde geklärt, warum C ++ in vielerlei Hinsicht nicht mit C kompatibel ist. C ++ ist jedoch immer noch eine "hybride" * Sprache. Und leider betrachten viele Programmierer C ++ immer noch als "C mit Streams und eingebauten Strings". Das führt zu wirklich schlecht geschriebenem Code, das heißt weder C ++ noch C. IMHO. Es wäre besser, wenn die Sprache / der Compiler die Programmierer zu einem gewissen Grad zwingen würde, eleganteren Code zu schreiben. Gibt es also einen Grund dafür, moderne C ++ - (zum Beispiel C ++ 0x und zukünftige Versionen) hybride zu halten?
* Mit Hybrid meine ich, dass es dem Programmierer überlassen ist, ob er / sie verwendet: Standard-Strings und -Streams, Klassen, andere als die Standard-Namespaces usw.
quelle
Object
und binäre Kopierwerte und sprachlich erratene assoziative Arrays (warum ...) zusammen mit anderen fragwürdigen eigenen Designentscheidungen. Außerdem hat es effektiv das gleiche GC-Paradigma wie die anderen, sodass ich die geringe Speichernutzung in Frage stelle.Antworten:
Ja, es gibt eine starke Begründung: C ++ - Code muss fast immer vorhandenen C-Code aufrufen. Das Beste, was wir tun können, ist, es einfach zu machen, guten Code zu schreiben. Es gibt nichts, was ein Sprachdesigner tun könnte, um das Schreiben von schlechtem Code zu verhindern.
quelle
The best we can do is make it easy to write good code.
- Sprechen wir über das gleiche C ++?Nein, würde es nicht. Überhaupt. Als eine triviale Demonstration, warum, definieren Sie elegant, und dann wette ich, dass zehn Leute dazu kommen, mit Ihnen nicht einverstanden zu sein.
Sprachgesteuerte Codierungsstile sind wirklich sehr, sehr schlecht. Ganz zu schweigen von dem alten Code, der kaputt gehen wird.
Bemerkenswerterweise sind die Standard-String- und Stream-Klassen wirklich schlecht .
std::string
hat keine Unicode-Unterstützung und die schlechteste Oberfläche, die Sie sich vorstellen können. Die Streams haben einen horrenden Overhead und ein schlechtes Design, sogar unter Rückgriff auf virtuelle Vererbung und Funktionszeigerconst char*
und solche hässlichen Objekte. Ich würde niemanden dafür bestrafen, dass er diese beiden Klassen / Klassengruppen vollständig durch benutzerdefinierte ersetzt hat.Das Verzichten auf Klassen und Namespaces ist für Code im Whiteboard-Stil in Ordnung, und es gibt sehr viele Bibliotheken, die Funktionen bereitstellen, die nicht in einer Klasse enthalten sind. Zwangsunterricht ist eine wirklich schlechte Idee.
quelle
C ++ ist ein Hybrid, nicht weil es das Schreiben von Code im C-Stil ermöglicht, sondern weil es verschiedene Programmierparadigmen unterstützt, z. B. prozedurale, objektorientierte und generische. C ++ zwingt Sie nicht zu einer bestimmten Vorgehensweise, und das ist seine Stärke, da verschiedene Probleme mit unterschiedlichen Paradigmen leichter gelöst werden können.
Dann muss man erst definieren, was elegant bedeutet. Dann müssten Sie prüfen, ob Ihre Definition von elegant für alle Problemdomänen und -plattformen geeignet ist, für die C ++ verwendet wird. Ein für das Schreiben eines Textverarbeitungsprogramms für Windows eleganter Codierungsstil ist möglicherweise für das Schreiben eines eingebetteten Systems nicht geeignet.
Erwägen Sie, C ++ - Code für die Ausführung auf einem DSP zu schreiben. Erstens unterstützt der C ++ - Compiler für diesen DSP möglicherweise bestimmte C ++ - Funktionen, wie z. B. Streams, nicht. Zweitens sind Sie stark von der CPU-Geschwindigkeit und möglicherweise vom Arbeitsspeicher abhängig, sodass einige C ++ - Funktionen Ihre Leistung beeinträchtigen können. Beispielsweise müssen Sie aus Gründen der Geschwindigkeit möglicherweise virtuelle Funktionen meiden. Solche Überlegungen würden Ihren Programmierstil im Vergleich zu dem, was Sie auf einem PC verwenden würden, radikal verändern, und C ++ ermöglicht dies.
Zusammenfassend ist C ++ eine riesige und komplizierte Sprache mit vielen Funktionen. Es gibt viele Gründe, warum eine Untergruppe dieser Funktionen für ein bestimmtes Projekt möglicherweise nicht anwendbar ist: Geschwindigkeit, Portabilität, Compiler-Unterstützung oder sogar Erfahrung und Vertrautheit der Programmierer. Aus diesem Grund ist es eine schlechte Idee, wenn die Sprache den Entwickler dazu zwingt, bestimmte Funktionen für eine bestimmte Aufgabe zu verwenden, im Gegensatz zu anderen. Denken Sie an Java, wo die Sprache vorschreibt, dass jede Funktion eine Methode einer Klasse sein muss. Es gibt so viele Fälle, in denen das Erstellen einer Klasse nur zum Umbrechen einer Methode umständlich und unnötig ist, und Sie dies dennoch tun müssen, weil die Sprache Sie dazu zwingt.
quelle
Niemand zwingt irgendjemanden dazu, C ++ zu benutzen. Wenn die Sprache nicht zu Ihnen passt, verwenden Sie eine andere - es gibt viele Sprachen, die als "C ++ ohne C" abgerechnet werden.
Die C ++ - Designphilosophie besteht darin, den Programmierer entscheiden zu lassen. Wenn sie sich in den Fuß schießen wollen, dann lassen Sie sie. Dies ermöglicht viele schlechte Dinge zu tun, ermöglicht aber auch ein hohes Maß an Flexibilität. Zum Beispiel ist es unwahrscheinlich, dass Boost in einer Sprache wie Java geschrieben werden kann, da es Sprachfunktionen und -praktiken nutzt, die allgemein vermieden werden. Es ist auch unwahrscheinlich, dass C ++ so groß wird wie heute - der Zugriff auf die umfangreiche C-Bibliothek ist ein riesiges Plus, nehmen Sie es oder lassen Sie es.
Die Kompatibilität von C ++ mit C ist definitiv einer der schwächsten Punkte, aber bedenken Sie auch, dass es einer der größten ist.
Ich werde ein wunderbares Zitat von Jon Purdy hinzufügen, das ich für äußerst relevant halte:
Das Entfernen des Hybrids kann die Eleganz verbessern, behindert jedoch die Fähigkeit.
quelle
Wenn das Komitee versuchen würde, die Leute dazu zu zwingen, eine elegantere Sprache zu benutzen (wie es jemand meint), würde dies wahrscheinlich ignoriert. Die Leute würden weiterhin tun, was sie wollen, und Compiler-Anbieter würden dem Markt folgen (aber Compiler-Anbieter sind im Ausschuss ausreichend vertreten, um dies zu verhindern).
Vieles von dem, was Sie befürworten, ist eine Frage des Urteils, die sowieso auf der Problemdomäne basiert. Es gibt viele kleine Programme, die (zum Beispiel) keine Namespaces benötigen. Es wäre dumm und arrogant, mich zu zwingen, beim Schreiben eines 30-zeiligen Textfilters einen Namespace zu verwenden. Selbst wenn Sie sich dafür entschieden hätten, dass dies nur dann zutrifft, wenn mehr als X Codezeilen, Y Funktionen oder was auch immer beteiligt sind, wäre dies im Allgemeinen kontraproduktiv. Namespaces wurden aus einem Grund entwickelt, um bestimmte Probleme zu verhindern / zu heilen. Der Versuch, ihre Verwendung in Abwesenheit dieser Probleme zu erzwingen, ist für niemanden von Nutzen.
Gleichzeitig ist es meiner Meinung nach erwähnenswert, dass einige Leute wirklich viel Zeit und Mühe darauf verwenden, nicht nur Eleganz in C ++ zu ermöglichen, sondern die Leute zu lehren und zu veranlassen, diese Fähigkeiten zu nutzen, um besseren Code zu schreiben (z. B. viele Boost-Mitwirkende). Daher ignorieren die Leute, die weiterhin darauf bestehen, ihren Code als "C mit Klassen" zu schreiben, so ziemlich alles, was es überhaupt gibt. Ich denke, sie würden genauso gerne neue Compiler ignorieren wie alles, was in den letzten zehn oder mehr Jahren über den Umgang mit C ++ gelernt wurde (z. B. wurde Modern C ++ Design vor 11 Jahren veröffentlicht - aber die meisten Leute Sie sprechen anscheinend noch nicht davon gehört, geschweige denn die einfachsten Teile gelesen oder verstanden zu haben).
quelle
Ihre Idee ist ein wesentlicher Grund für das Design von Java. Java zwingt Sie dazu, Klassen zu verwenden, die Dateihierarchie entsprechend der Pakethierarchie zu organisieren, Ausnahmen abzufangen usw. Die Leute schaffen es immer noch, C-ähnlichen Code darin zu schreiben.
Als Programmierer vergessen wir manchmal, dass die beste Lösung keine technische Lösung ist. Peer Reviews sind in diesem Fall die bekannteste Lösung.
quelle
C ++ hat keinen "einen wahren Weg"; Jeder Ansatz hat Stärken und Schwächen. Die Lösung kann auf hundert verschiedene Arten geschrieben werden.
Als Softwareentwickler müssen Sie entscheiden, welcher Ansatz für die jeweilige Aufgabe am besten geeignet ist.
quelle
Ich denke, die Tatsache, dass all diese Dinge, die Sie auflisten, optional sind, schafft ein Potenzial für mehr Eleganz, nicht weniger. Eine Funktion, die unnötigerweise verwendet wird, ist in meinen Augen nicht relevant.
Die Probleme, die wir mit der Programmierung lösen müssen, sind sehr unterschiedlich.
Einige werden mit OO-Prinzipien (z. B. GUIs) gut gelöst, andere eignen sich besser für eine rein funktionale Behandlung (z. B. numerisches Material), während andere am besten in einer einfachen Sprache "in der Nähe des Siliziums" ausgedrückt werden.
Jede Menge Software muss Teilprobleme lösen, die auf eine dieser Arten am besten gelöst werden. Das Erzwingen der Lösung in eine bestimmte Form führt nur zu Code, der weniger für seinen Zweck geeignet ist (Sie könnten sogar sagen, "weniger elegant").
Aus diesem Grund ist die Hybridität von C ++ eine gute Sache - sie ermöglicht es uns, eine Vielzahl von Problemen auf eine Weise zu lösen , die dem Problem und nicht dem aktuellen Dogma entspricht.
Natürlich kann es missbraucht werden - wenn Sie ein flexibles Ding haben, besteht die Gefahr, dass Sie es schlecht biegen -, aber Eleganz entsteht durch sorgfältige Überlegungen und Erfahrungen, nicht durch das Festhalten an dem, was der Trend ist.
quelle