Warum ist die Branche von C auf C ++ umgestiegen? [geschlossen]

19

Zunächst möchte ich eine echte Antwort haben, ich versuche immer, mehr aus verschiedenen Quellen und Artikeln herauszuholen, und wenn ich Dinge wie C ++ lese, ist das langsam, weil es virtuelle Funktionen hat und weil C deshalb besser ist Ich weiß nicht, was ich als Mensch mit Gehirn sagen und denken soll. Vermeiden Sie es daher, diese Stufe in Ihren Antworten zu erreichen.

Meine Frage bezieht sich auf eine massive Umstellung auf C ++, die mehr oder weniger mit Doom 3 abgeschlossen wurde.

Das Interessante für mich ist, dass vor diesem Meilenstein die meisten Spiele-Engines und die Spiele selbst in C geschrieben waren, genau wie es seit der Quake-Ära war . Interessant ist auch, dass die ID-Software beschlossen hat, die Codebasis für IdTech 4 vollständig in C ++ umzuschreiben. Dies ist eine Menge Arbeit, die ich ehrlich gesagt ohne eine wirklich gute Liste von Gründen nicht verstehen kann.

Ich konzentriere mich auf Doom 3, weil ich mich hauptsächlich für die OpenGL-Welt interessiere und auf meiner Reise versuche ich, mich auf dieses Thema zu konzentrieren, also lese ich viel darüber, aber ich denke, dass eine solche Frage eine Render-API sein kann -Agnostiker ohne zu viele Probleme.

Warum ist die Branche zu einem bestimmten Zeitpunkt massiv auf C ++ umgestiegen? Was sind die Gründe für die Wahl, die ID gemacht hat?

Das Letzte, was ich sagen möchte, ist, dass die C-Sprache viel einfacher zu implementieren ist und eine geringere Anzahl von Funktionen bietet, da dies viel weniger Chancen hat, in Teile "fragmentiert" zu werden, als es C ++ wirklich oft tut. Im einfachsten Sinne habe ich viel mehr Chancen, einen wirklich guten C-Compiler zu finden als einen guten C ++ - Compiler, der alle Funktionen auf gute Weise implementiert hat.

Zum Beispiel hat das NDK für Android immer noch keine gute C ++ - Unterstützung (mit dem r8b-Release) mit den neuesten und besten Funktionen, und es ist das native Toolkit für das beliebteste mobile Betriebssystem der Welt!

Wenn ich meinen Code in einem modernen C ++ geschrieben hätte, würde ich jetzt wahrscheinlich Schmerzen haben, weil eines der beliebtesten Betriebssysteme der Welt für mich tabu wäre. Und wie Android sind viele andere Compiler nicht so toll.

Ich sollte C ++ - Code schreiben, der sich auf eine C ++ - Version bezieht, die 2-3 Jahre alt ist.

user827992
quelle
1
Ich vermute, es ist nur so, dass C ++ eine quasi Erweiterung von C ist. Die Leute haben angefangen, C mit C ++ - Funktionen wie std :: vector zu schreiben. Von da an wurde C ++ anstelle von C unterrichtet und die Leute haben angefangen, vollwertiges C ++ zu schreiben.
API-Beast,
1
Nun, C vs. C ++ bei der Entwicklung einer großen Anwendung? OOP ist ein großartiges Paradigma und wird von C ++ unterstützt. Wenn Sie ein Spiel in C schreiben, sollten Sie datenorientiertes Design in Betracht ziehen . Ansonsten überlegen wir uns, warum alle großen aktuellen Industrieunternehmen C ++ verwenden. Das Software-Engineering, sei es für Finanzanwendungen oder für den Freizeitbereich, befasst sich mit dem OOP-Paradigma und den Architektur- und Entwurfsmustern. Einfach ausgedrückt kann C nicht das Gesamtbild bieten, das Ihnen die Kapselung bietet. Gibt es moderne, große Softwareteile, die in C geschrieben wurden? Möglicherweise Kernel und eingebettete Systeme.
Teodron
@teodron 1) Ich muss eine gute ausführbare Datei erstellen, ich kümmere mich um die Sprache wie um ein wichtiges Asset, aber es ist nicht alles und nicht das, was ich verkaufe. 2) Kapselung, es ist nicht so gut für die Leistung, wenn jemand möchte überzeugen mich, die C ++ Welt zu verlassen, die Kapselung ist eines der guten Themen dafür.
user827992
3
" Das Interessante für mich ist, dass vor diesem Meilenstein die meisten Spiele-Engines und die Spiele selbst in C geschrieben waren, genau wie es seit der Quake-Ära war. " Ich würde gerne Beweise dafür sehen. Neben den Open-Source-Engines von Id-software. Sie sind nicht die ganze Videospielbranche.
Nicol Bolas
@NicolBolas Ich erklärte den Grund, warum ich über ID sprach, bitte verstehen Sie die Bedeutung der gesamten Frage.
User827992

Antworten:

28

C ++ macht alles, was C macht. Sie können C und C ++ problemlos mischen, wenn die Vorteile von C die von C ++ überwiegen. Dies ist eine sehr absichtliche Entwurfsentscheidung von C ++.

C ++ macht Dinge, die C nicht tut. Dies beinhaltet einen einfachen Polymorphismus, aber auch eine einfache Generierung von Timecode über Vorlagen. Dies ist sehr praktisch für Dinge wie Container, die die größte Schwäche von C darstellen. Benutzerdefinierte zeigerähnliche Typen (Smart Handles), die viel Zeit sparen, sowie benutzerdefinierte primitivähnliche Typen wie Vektoren und Matrizen mit Operatorunterstützung sind ebenfalls möglich (dies spart auch viel Zeit).

Virtuelle Funktionen sind langsamer als nicht virtuelle Funktionen. Sie müssen sich jedoch für virtuelle Funktionen entscheiden, und ein kompetenter Programmierer tut dies nur, wenn sie von Vorteil sind. C-Programmierer haben Funktionszeiger und speichern häufig Auflistungen derer in Strukturen, auf die von anderen Strukturen verwiesen wird. Mit anderen Worten, sie müssen zusätzliche Arbeit leisten, um genau dasselbe wie virtuelle Funktionstabellen wiederherzustellen. In Fällen, in denen nur ein einziger Funktionszeiger benötigt wird und keine Tabelle erforderlich ist, lässt C ++ dies immer noch zu und entspricht C. Mit einem modernen Compiler ist C ++ nur in den speziellen Fällen langsamer als C, in denen sich der Programmierer für ein Feature entscheidet . Außerdem ist der Aufwand für virtuelle Funktionen in der Praxis bei Modem-CPUs sehr gering. Hardware ist heutzutage auf die Verwendungsmuster von C ++ ausgelegt und wird zunehmend auch auf die Bedürfnisse von hochinterpretierten Sprachen zugeschnitten.

C ++ - Ausnahmen verursachen in der Vergangenheit einen hohen Overhead, wodurch C ++ langsamer wird, selbst wenn Sie sie nicht verwenden. Ausnahmen waren eine schreckliche Sache, die man zu C ++ hinzufügen konnte, wenn auch aus keinem anderen Grund als der immensen Zunahme der Komplexität, die mit dem Schreiben von ausnahmesicherem Code verbunden ist, und tatsächlich ist es bei einigen Containerentwürfen buchstäblich unmöglich, Ausnahmen sicher zu machen. Spielprogrammierer ignorieren oft die Existenz von Ausnahmen und deaktivieren sie sogar auf dem Compiler. Moderne Compiler haben keine Overhead-Ausnahmen (dh Sie zahlen die Kosten nur, wenn Sie sie tatsächlich verwenden).

C ist einfacher zu lernen, alle Regeln von. C ++ ist eine sehr große, komplexe Sprache. C ++ ermöglicht das Schreiben von Code auf höherer Ebene, wodurch einfachere und einfachere APIs erstellt werden. Einige Leute möchten die Sprache leichter verstehen, andere möchten fortgeschrittenen Code leichter schreiben. Es ist ein Kompromiss zwischen der Einfachheit, zu verstehen, was der Compiler mit einem bestimmten Teil des Codes tut, und der Einfachheit, große komplexe, miteinander verbundene Anwendungen zu schreiben. Einige Leute schätzen eines aus verschiedenen Gründen viel mehr als das andere.

Am Ende ist C ++ eine Obermenge von C. Meiner Meinung nach gibt es keinen hochkompetenten C ++ - Programmierer, der auch kein passabler C-Programmierer ist (obwohl es viele C ++ - Programmierer gibt, die unter meine Latte fallen, die dies tun würden) in reinem C) verloren gehen. Während C ++ Funktionen hinzufügt, um den Programmierer von einem Großteil von C zu isolieren, muss nicht-trivialer C ++ - Code häufig C verwenden, um Dinge zu erledigen. Dies ist einer der Hauptunterschiede zwischen C ++ und Java und C #. Es gibt einen Grund, warum Sie oft sehen, dass "C / C ++" zusammengewürfelt ist.

Mein persönlicher Glaube - der mit den meisten anderen Fachleuten der Spielebranche geteilt wird, mit denen ich interagiert habe - ist, dass die verbesserte Ausdruckskraft und die hochwertigen Programmierfunktionen von C ++ die zunehmende Komplexität der Sprache gegenüber C überwiegen und die meisten anderen häufigen Anti-C ++ - Behauptungen sind mit der heutigen Technologie einfach veraltet.

Sean Middleditch
quelle
19
"Es gibt keinen kompetenten C ++ - Programmierer, der auch kein kompetenter C-Programmierer ist." Ich stimme dieser Aussage überhaupt nicht zu. Idiomatisches C unterscheidet sich stark von idiomatischem C ++. Die beiden Stile sind unterschiedlich, wobei der eine Stil undurchsichtige Zeiger und statische Funktionen hervorhebt, der andere die sprachbasierte Kapselung verwendet und so weiter. Jemand, der nur idiomatisches C ++ kennt, wäre in C ++ kompetent, aber dennoch eher verwirrt von idiomatischem C.
Nicol Bolas
Ich bin nicht einverstanden, dass Sie in C ++ kompetent sein können und nur "idiomatisches C ++" kennen. Die harten Teile von C ++ sind die gleichen harten Teile von C (plus Vorlagen). Wenn ein C ++ - Programmierer durch eigenständige Funktionen, einfache Strukturen und rohe oder undurchsichtige Zeiger verwirrt wird, hat er noch keinen nicht trivialen C ++ - Code in einem realen, nicht akademischen Szenario geschrieben. Ich würde so weit gehen zu argumentieren, dass jeder, der sich nur mit "idiomatischen" Dingen auskennt , noch keine Kompetenz erlangt hat.
Sean Middleditch
3
"Idiomatisch" ist eine andere Ausdrucksweise für "komfortabel", die - abgesehen davon, dass sie relativ ist - auch bedeutet, dass es fast per definitionem eine unangenehme Region in der Sprache gibt, in der ein sonst kompetenter C ++ - Programmierer nicht besonders kompetent sein wird. (Ich denke nicht unbedingt, dass dies bedeutet, dass sie durch diese Elemente "verwirrt" sind, nur, dass sie sich mit ihnen unwohl fühlen oder nicht fließend damit umgehen.) Und bis zu einem gewissen Grad wird den Lernenden beigebracht, dass sie sich in C ++ unwohl fühlen bloß einen rohen Zeiger erblicken. Daher denke ich nicht, dass ein kompetenter C ++ - Programmierer einen kompetenten C-Programmierer impliziert.
John Calsbeek
Anders ausgedrückt, es gibt definitiv einen C ++ - Bereich auf höherer Ebene, auf dem Sie die Verwendung von Funktionen auf niedrigerer Ebene, die zum Schreiben von ernsthaftem C-Code erforderlich wären, vollständig vermeiden können. Ich bin sicher, dass die meisten nicht-akademischen Codebasen der realen Welt nicht vollständig in diesem Bereich bleiben, aber ich vermute, dass Sie eine Person finden können, die nur mit diesem Bereich vertraut ist und sie immer noch als "kompetent" bezeichnet. Natürlich würden Sie eine solche Person nicht mit einem C-Programmierer vergleichen - Sie würden sie mit jemandem vergleichen, der in einer beliebigen Anzahl anderer Hochsprachen programmiert.
John Calsbeek
1
@ DanielCarlsson: Fair genug, ich bin nur pedantisch. Es tut uns leid. In diesem Sinne tut C ++ jedoch nichts, was die Optimierung schwieriger macht als C. :) Ich meine, wenn Sie die STL verwenden, sind Sie auf das beschränkt, was die STL tut, aber ein großer Teil des Grundes Wir verwenden C ++ anstelle von C # oder Java, weil wir einfach die gesamte STL neu implementieren oder Raw-Arrays verwenden oder sogar Inline-Assembler oder Spracherweiterungen (wie SSE intrinsics) usw. ankurbeln können.
Sean Middleditch
12

Warum ist die Branche zu einem bestimmten Zeitpunkt massiv auf C ++ umgestiegen? Was sind die Gründe für die Wahl, die ID gemacht hat?

Id Software ist nicht "die Industrie". Sie sind eine Firma. Obwohl sie einflussreich sein mögen, sind sie nicht jedermanns Sache.

Ich habe an einigen Game-Engines gearbeitet, die aus dem Jahr 1999 stammen, und sie verwendeten C ++.

Die Hauptgründe für die Einführung von C ++ "um diese Zeit" sind:

  1. Es wurde standardisiert . C ++ 98 heißt so, weil es 1998 als ISO-Standard veröffentlicht wurde. Bis dahin gab es mehrere Dialekte von C ++ ohne klare Vorstellung, welche "real" oder "korrekt" waren. Sobald es standardisiert war und Compiler damit begannen, den Standard zu implementieren, konnten sich Spieleentwickler auf den tatsächlichen Standard verlassen.

  2. Erinnern Sie sich an den alten Witz: Ein Mann geht in eine Arztpraxis und sagt: "Es tut weh, wenn ich meinen Arm so hebe." Also sagt der Arzt: "Heben Sie Ihren Arm nicht so hoch."

    Wenn virtuelle Funktionen für Ihre Anforderungen langsam sind, werden Sie von C ++ nicht dazu gezwungen, sie zu verwenden. Alles in C ++ ist opt-in. Sie wählen die Verwendung der einzelnen Funktionen. Wenn Sie sich in leistungskritischem Code befinden und keinen virtuellen Overhead wünschen, verwenden Sie keine virtuellen Funktionen. Genau wie bei leistungskritischem Code in C werden keine Funktionszeiger verwendet.

    In der Tat führte dies dazu, dass viele C ++ - Spiele kein idiomatisches C ++ waren (zumindest kein modernes idiomatisches C ++), sondern lediglich "C mit Klassen". Und dies ist eine perfekt funktionierende Möglichkeit, C ++ zu programmieren. Zum typedef structTeufel, es ist ein Vorteil, wenn Sie beim Erstellen eines neuen Typs nicht tippen müssen .

    C ++ ist eine Fülle von Funktionen, und Sie können auswählen, welche Sie möchten.

Zum Beispiel hat das NDK für Android immer noch keine gute C ++ - Unterstützung (mit dem r8b-Release) mit den neuesten und besten Funktionen, und es ist das native Toolkit für das beliebteste mobile Betriebssystem der Welt!

Ihr Punkt ist? Google toleriert kaum Menschen, die NDK verwenden. Es ist klar, dass jeder Java verwenden soll. Der einzige Grund, warum NDK existiert, besteht darin, dass es bestimmte wichtige Entwickler gibt, die die Plattform ohne diese einfach nicht nutzen werden. Daher gibt es NDK, um sie und ihre Funktionsanforderungen zu bedienen.

Ja, C ++ ist eine umfangreichere und kompliziertere Spezifikation, die implementiert werden muss. So ist Java. So ist jede Sprache außer C.

Und was meinst du mit "den neuesten und besten Features"? Wenn es um C ++ 11 geht, implementiert das noch niemand vollständig. Die Spezifikation ist jetzt kaum ein Jahr alt. Ich weiß auch nicht, ob NDK C11 unterstützt. Ja, C hat auch "neueste und beste Funktionen", die nicht überall unterstützt werden.

Das bringt einen wichtigen Punkt auf den Punkt: Wenn Sie möchten, dass Ihre Pure-C-Anwendung in Visual Studio kompiliert wird, muss sie C89-konform sein und nichts Höheres. Es besteht also bereits eine Fragmentierung mit C. Einige Plattformen unterstützen nur C89. Einige unterstützen C99. Einige unterstützen C11 in unterschiedlichem Maße. Etc.

Wenn Sie C verwenden möchten, dann C verwenden . Die Tatsache, dass andere Leute diese Wahl nicht getroffen haben, bedeutet nicht, dass Ihre Wahl falsch ist oder dass ihre Wahl falsch ist. Sie müssen sich nicht vor ihnen rechtfertigen, und sie müssen sich nicht vor Ihnen rechtfertigen.

Nicol Bolas
quelle
2
Ich denke nicht, dass Google es kaum toleriert, wer das NDK verwendet, da die Entwicklung des NDK noch nicht abgeschlossen ist und mehrere Versionen für Android verfügbar sind, auch wenn Google das C / C ++ hasst. Ich glaube nicht, dass ich das erreichen kann Ein gutes Leistungsniveau für mein Spiel in Java oder die wichtigsten Spieler auf dem Markt können ihren Code nur für Java und Android umschreiben. Wahrscheinlich ist es ein notwendiges Übel für Google, ich weiß nicht, mein Punkt ist, nach einem breiten zu fragen view und keine lahme frage zu c vs c ++ vs java vs the world, ich war auf der suche nach einer allgemeineren
antwort
Für den Compiler unter Berücksichtigung aller Sprachmerkmale erlaubt Ihre Antwort mir auch, meine erste Bemerkung über die Verfügbarkeit von C-Compilern auf dem Markt zu betonen. Unter Windows habe ich fast das gesamte Softwarehaus, das einen Compiler mit einem eigenen Compiler herstellt, das ich auch habe andere kostenlose Optionen wie MinGW. Das eigentliche Problem , dass ich mit dem C ist der Mangel an native Unterstützung für Datenstrukturen gefunden, die Behälter, in C ++ können Sie eine Vorstellung davon , wie viel Kosten Sie einen bestimmten Behälter oder eine bestimmte Aussage, erhalten
user827992
In C hat der Code, der das Gleiche tut, wahrscheinlich mehr als nur eine Implementierung. Auch in C ++ kann der Compiler als Folge davon mehr optimieren. Ich sollte C ++ wahrscheinlich mehr lernen, aber ich denke, ich werde nur auf C ++ umsteigen, um eine gute Unterstützung für bestimmte Funktionen zu erhalten, nicht für die Sprache selbst.
User827992
7

Interessant ist auch, dass die ID-Software beschlossen hat, die Codebasis für IdTech 4 vollständig in C ++ umzuschreiben. Dies ist eine Menge Arbeit, die ich ehrlich gesagt ohne eine wirklich gute Liste von Gründen nicht verstehen kann.

Es war für sie üblich, so ziemlich die gesamte Engine für jede Veröffentlichung neu zu schreiben (zumindest bis vor kurzem - ich weiß nicht viel über die letzten paar Spiele), und da C ++ immer beliebter wird, ist es sinnvoll, dies anstelle von Stick zu verwenden Mit der Zeit werden immer weniger Menschen mit C vertraut sein.

Warum ist die Branche zu einem bestimmten Zeitpunkt massiv auf C ++ umgestiegen?

Weil es Ihnen viele Funktionen auf höherer Ebene bietet, während es fast vollständig abwärtskompatibel mit C-Code ist.

Was sind die Gründe für die Wahl, die ID gemacht hat?

Google hätte dies für Sie beantwortet: http://fabiensanglard.net/doom3/interviews.php

"... die Hälfte der Programmierer hatte am Anfang wirklich C ++ - Hintergrund. Ich hatte C- und Objective-C-Hintergrund und bin irgendwie in C ++" hineingeschlüpft ", indem ich mir nur den Code angesehen habe, den die C ++ - Leute geschrieben haben. Im Nachhinein habe ich Ich wünschte, ich hätte die Zeit eingeplant, um die Sprache gründlich zu erforschen, bevor ich anfing, sie zu benutzen.

Möglicherweise können Sie immer noch feststellen, dass der Renderer-Code größtenteils in C entwickelt und dann sozusagen in C ++ gehäutet wurde.

Heute bin ich fest davon überzeugt, dass C ++ die richtige Sprache für große Projekte mit mehreren Entwicklern und kritischen Leistungsanforderungen ist und Tech 5 für das Doom 3-Erlebnis viel besser geeignet ist. "

Wenn ich meinen Code in einem modernen C ++ geschrieben hätte, würde ich jetzt wahrscheinlich Schmerzen haben, weil eines der beliebtesten Betriebssysteme der Welt für mich tabu wäre.

  1. Programmierer können nicht in die Zukunft sehen. Sie würden nicht wissen, dass es eine neue Plattform mit schlechter C ++ - Unterstützung geben würde. Android existierte bis 2009 nicht richtig. Doom 3 war von 2004.
  2. Glauben Sie, dass Programmierer, die innovative 3D-Spiele für PCs und Konsolen schreiben, erwarten, dass ihr Code auch auf Handys ausgeführt wird? Das Anstreben eines solchen Portabilitätsgrades ist sehr selten und aufgrund der enormen Leistungsunterschiede oftmals sinnlos.

Ich sollte C ++ - Code schreiben, der sich auf eine C ++ - Version bezieht, die 2-3 Jahre alt ist.

Warum interessiert dich das? Sei nicht gefangen, wenn du das Neueste verfolgst. Wenn es vor 5 Jahren gut genug gewesen wäre, wäre es jetzt nicht plötzlich schlimmer geworden.

Kylotan
quelle
3

Nun, C ++ ist seit den 80er Jahren nicht mehr verfügbar. Wenn ein Compiler dies nicht unterstützt, sollten Sie möglicherweise einen anderen Compiler verwenden. Außerdem ist C ++ nicht viel langsamer als C. Es ist wirklich nur langsamer, wenn Sie es mit virtuellen Funktionen und anderen Abstraktionen laden. C ++ wird heutzutage jedoch häufig in der Nicht-Unix-Welt verwendet, da es flexibel ist und neuere Funktionen bietet, die C nicht bietet. Das Schreiben von modularem Code in C ++ ist viel einfacher als in C und hilft Ihnen, mehr portablen Code zu schreiben. Zurück zum Thema Compiler, ich kenne keinen Compiler, der C ++ nicht unterstützt (vielleicht nicht vollständig C ++ 11, aber jeder halbwegs vernünftige Compiler sollte C ++ unterstützen).

CobaltHex
quelle