Warum ist C ++ immer noch "hybrid"


16

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.


Gibt es irgendwelche vorhandenen Compiler- / IDE-Einstellungen, die dies erzwingen könnten?
FrustratedWithFormsDesigner

@FrustratedWithFormsDesigner Mir sind keine Tools bekannt, die dies tun. Es wäre jedoch sinnvoller, ein solches Tool (Compiler, IDE usw.) zu schreiben, wenn diese Funktionen Teil des Standard-C ++ wären.
Sakisk

2
Das Ziel von C ++ ist die Abwärtskompatibilität und die Möglichkeit, alle schmutzigen Tricks zu verwenden, die in C möglich waren. Nehmen Sie das weg, und es ist nur ein weiterer C # -, D- oder Java-Klon. Wenn Sie das wollten, warum nicht einfach C #, D oder Java verwenden?
Nikie

5
@nikie: Hahahaha. Da Vorlagen, Werttypen, starke Referenzen, deterministische Zerstörung, Mehrfachvererbung, Ausführungsgeschwindigkeit und geringe Speichernutzung überhaupt nicht vorhanden sind.
DeadMG

2
@nikie: Außer D hat auch Abscheulichkeiten wie Objectund 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.
DeadMG

Antworten:


26

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.


1
Klar, aber da dies nur für älteren Code gilt, warum müssen neuere Versionen von C ++ kompatibel bleiben? Legacy-Code kann weiterhin eine ältere Version von C ++ verwenden.
Sakisk

15
@faif, in meinem Job schreibe ich die ganze Zeit neuen C ++ - Code, der mit neuem C-Code zusammenarbeiten muss. Es ist nicht nur ein Vermächtnisproblem.
Karl Bielefeldt

5
@faif: Neuere Versionen von C ++ müssen abwärtskompatibel sein - nicht nur, um älteren C-Code zu unterstützen, sondern auch mehrere hundert Millionen Zeilen vorhandenen C ++ - Codes. Wenn Sie etwas wollen, das nicht abwärtskompatibel, aber besser gestaltet ist, können Sie zu einer Sprache wie D wechseln. Übrigens, hier ist ein wirklich guter Artikel über die Notwendigkeit der Abwärtskompatibilität von Joel Spolsky: joelonsoftware.com/items/2008 / 03
Doc Brown

4
The best we can do is make it easy to write good code.- Sprechen wir über das gleiche C ++?
BlueRaja - Danny Pflughoeft

4
@ BlueRaja-DannyPflughoeft: Ich finde es viel einfacher, guten Code in C ++ als in Java oder C # zu schreiben. Mit C ++ kann ich eine Klasse lesen und wenn sich alle anderen Klassen verhalten, weiß ich, dass Speicher und Ressourcen nicht verloren gehen. Mit Java und C # kann ich das nicht; Ich muss die anderen Klassen inspizieren, um zu sehen, ob eine von ihnen abgeschlossen werden muss. Mit C ++ - Vorlagen kann ich auch Code trocknen, der in Java wiederholt werden muss.
Kevin Cline

20

IMHO wäre es besser, wenn die Programmiersprache / der Compiler die Programmierer zu einem gewissen Grad zwingen würde, eleganteren Code zu schreiben.

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::stringhat 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 Funktionszeiger const 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.


+1 für die etwas realistischere Herangehensweise (wann soll das "Elegant Code" - Gespräch aufhören: /
Rook

2
"Sprachgesteuerte Codierungsstile sind wirklich sehr, sehr schlecht." Können Sie einige Beispiele nennen? Ich denke, dass selbst einfache Dinge wie Pythons erzwungene Codeeinrückung die Lesbarkeit des Codes verbessern.
Sakisk

3
Ich bin mir nicht sicher, ob ich damit einverstanden bin. Der Hauptgrund für die Verwendung von CoffeeScript über JavaScript ist, dass CoffeeScript das Schreiben von eleganterem Code erzwingen soll.
user16764

3
Kann dem nicht zustimmen. Einige Sprachentwürfe sollen zu guten Praktiken ermutigen, und der weitläufige, verschraubte Charakter eines Großteils von C ++ schließt dies im Allgemeinen aus. Tatsächlich ist es die Hauptmotivation für die Existenz von C ++ 11 , die Sprache auszusortieren, die guten Teile zu behalten und den Rest zu verbessern .
Robert Harvey

1
@Pubby: "Ein hässliches Programm zu schreiben, das funktioniert, ist besser als ein schönes Programm zu schreiben, das nichts bewirkt." Natürlich kann ich dem zustimmen. Aber dieser Artikel geht weit darüber hinaus und scheint zu argumentieren, dass Hässlichkeit tatsächlich eine Tugend ist. Und das ist einfach lächerlich.
Mason Wheeler

8

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.

IMHO wäre es besser, wenn die Programmiersprache / der Compiler die Programmierer zu einem gewissen Grad zwingen würde, eleganteren Code zu schreiben.

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.


1
Konnte nicht mehr zustimmen. Ich würde denken, wenn jemand sagt, dass "C ++ flexibel ist", würde ich das denken, weil es viel mehr Paradigmen unterstützt als C.
Prelic

5

IMHO wäre es besser, wenn die Programmiersprache / der Compiler die Programmierer zu einem gewissen Grad zwingen würde, eleganteren Code zu schreiben.

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:

Es kommt alles auf Pragmatismus und Eleganz an, und trotz meiner Besessenheit von präzisem, schönem Code ist es für mich besser, ein hässliches Programm zu schreiben, das funktioniert, als ein schönes Programm zu schreiben, das nichts tut.

Das Entfernen des Hybrids kann die Eleganz verbessern, behindert jedoch die Fähigkeit.


Glauben Sie, dass Pragmatismus und Eleganz widersprüchlich sind? Ich denke, dass Python, Ruby und Scala gute Beispiele für Sprachen sind, die sowohl pragmatisch als auch elegant sind.
Sakisk

1
@faif: Nein, aber Abwärtskompatibilität und Eleganz sind widersprüchlich. Dies gilt auch für Python (2.x vs. 3.x).
Dan04

4

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).


2

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.


0

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.


0

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.