Pourquoi l'industrie est-elle passée du C au C ++? [fermé]

19

Tout d'abord, je voudrais avoir une vraie réponse, j'essaie toujours d'obtenir plus de diverses sources et articles, et quand je lis des choses comme C ++ est lente parce qu'elle a des fonctions virtuelles et à cause de cela C est mieux , je vraiment Je ne sais pas quoi dire et penser en tant qu'être humain avec un cerveau. Veuillez donc éviter d'atteindre ce niveau dans votre / vos réponse (s).

Ma question concerne un passage massif au C ++ qui a été réalisé, plus ou moins, avec Doom 3.

Ce qui est intéressant pour moi, c'est qu'avant cette étape, la plupart des moteurs de jeu et les jeux eux-mêmes étaient écrits en C, comme c'était le cas depuis l' ère Quake . Il est également intéressant de noter que le logiciel d'identification décide de réécrire complètement la base de code de l'IdTech 4 en C ++, une énorme quantité de travail que je ne peux honnêtement pas comprendre sans une très bonne liste de raisons.

Je me concentre sur Doom 3 parce que je suis principalement intéressé par le monde OpenGL et dans mon voyage j'essaie de rester concentré sur ce sujet, donc j'ai lu beaucoup de choses à ce sujet, mais je pense qu'une question comme celle-ci peut être render-API -agnostique sans trop de problèmes.

Pourquoi à un certain moment, l'industrie est passée massivement au C ++? Quelles sont les raisons du choix de cette pièce d'identité?

La dernière chose que je voudrais dire, c'est que le langage C est beaucoup plus simple à implémenter et offre moins de fonctionnalités, car il a beaucoup moins de chances d'être "fragmenté" en morceaux contrairement au C ++ le fait souvent. En termes plus simples, j'ai beaucoup plus de chances de trouver un très bon compilateur C plutôt qu'un bon compilateur C ++ avec toutes les fonctionnalités implémentées dans le bon sens.

Par exemple, le NDK pour Android n'a toujours pas un bon support C ++ (avec la version r8b) avec toutes les dernières et meilleures fonctionnalités, et c'est la boîte à outils native pour le système d'exploitation mobile le plus populaire au monde!

Si j'avais écrit mon code dans un C ++ moderne, j'aurais probablement mal maintenant parce que l'un des systèmes d'exploitation les plus populaires au monde serait interdit pour moi. Et comme Android, de nombreux autres compilateurs ne sont pas si géniaux.

Je devrais écrire du code C ++ faisant référence à une version C ++ datant de 2-3 ans?

user827992
la source
1
Je soupçonne que c'est juste que C ++ est une quasi extension de C. Les gens ont commencé à écrire C avec des fonctionnalités C ++ telles que std :: vector, à partir de là C ++ a été enseigné à la place de C et donc les gens ont commencé à écrire C ++ à part entière.
API-Beast
1
Eh bien, C vs C ++ lors du développement d'une grande application? La POO est un grand paradigme et .. C ++ le supporte. Si vous voulez écrire un jeu en C, pensez à la conception orientée données . Sinon, réfléchissons aux raisons pour lesquelles tous les principaux acteurs actuels de l'industrie utilisent C ++. Le génie logiciel, que ce soit pour les applications financières ou les loisirs, plonge sur les épaules du paradigme OOP et celui des modèles architecturaux et de conception. Autrement dit, C ne peut pas offrir la vue d'ensemble que l'encapsulation vous offre. Existe-t-il de gros logiciels modernes écrits en C? Peut-être des noyaux et des systèmes embarqués.
teodron
@teodron 1) Je dois produire un bon exécutable, je me soucie de la langue comme je me soucie d'un atout important, mais ce n'est pas tout et ce n'est pas ce que je vends 2) l'encapsulation ce n'est pas bon pour la performance, si quelqu'un veut me convaincre de quitter le monde C ++, l'encapsulation est l'un des bons sujets pour cela.
user827992
3
" Ce qui est intéressant pour moi, c'est qu'avant cette étape, la plupart des moteurs de jeu et les jeux eux-mêmes étaient écrits en C, tout comme c'était le cas depuis l'ère Quake. " J'aimerais voir des preuves à ce sujet. Outre les moteurs open-source d'Id-software. Ce n'est pas l'ensemble de l'industrie du jeu vidéo.
Nicol Bolas
@NicolBolas J'expliquais la raison pour laquelle je parlais d'identité, veuillez comprendre le sens de toute la question.
user827992

Réponses:

28

C ++ fait tout ce que fait C. Vous pouvez mélanger trivialement C et C ++ dans les cas où les avantages de C l'emportent sur ceux de C ++. Il s'agit d'une décision de conception très intentionnelle de C ++.

C ++ fait des choses que C ne fait pas. Cela inclut un polymorphisme facile, mais aussi une génération de code temporel de compilation facile via des modèles. C'est vraiment pratique pour des choses comme les conteneurs, qui sont facilement la plus grande faiblesse de C. Il permet également les types de pointeurs définis par l'utilisateur (poignées intelligentes) qui permettent de gagner beaucoup de temps, ainsi que les types de type primitifs définis par l'utilisateur tels que les vecteurs et les matrices avec prise en charge par l'opérateur (économisent également beaucoup de temps).

Les fonctions virtuelles sont plus lentes que les fonctions non virtuelles. Cependant, vous devez activer les fonctions virtuelles, et un programmeur compétent ne le fait que lorsque cela est avantageux. Les programmeurs C ont des pointeurs de fonction et stockent souvent des collections de ceux dans la structure référencée par d'autres structures; en d'autres termes, ils effectuent un travail supplémentaire pour recréer exactement la même chose que les tables de fonctions virtuelles. Dans les cas où un seul pointeur de fonction est nécessaire et aucune table n'est requise, C ++ le permet toujours pleinement et est équivalent à C. Avec un compilateur moderne, C ++ n'est plus lent que C dans les cas spécifiques où le programmeur choisit une fonctionnalité . En outre, la surcharge de fonction virtuelle dans la pratique est très faible sur les processeurs de modem. Aujourd'hui, le matériel est conçu pour les modèles d'utilisation de C ++ et est de plus en plus conçu pour les besoins de langages interprétés de haut niveau.

Les exceptions C ++ imposent historiquement beaucoup de surcharge, rendant C ++ plus lent même si vous ne les utilisez pas. Les exceptions étaient une chose terrible à ajouter au C ++, si ce n'est pour une autre raison que l'immense augmentation de la complexité impliquée dans l'écriture de code protégé contre les exceptions, et en fait, certaines conceptions de conteneurs sont littéralement impossibles à rendre les exceptions sûres. Les programmeurs de jeux ignorent souvent l'existence des exceptions et les désactivent même sur le compilateur. Les compilateurs modernes ont des exceptions sans frais généraux (c'est-à-dire que vous ne les payez que lorsque vous les utilisez réellement).

C est plus simple d'apprendre toutes les règles de. C ++ est un langage très gros et complexe. C ++ permet d'écrire du code de niveau supérieur, produisant des API plus simples et plus simples. Certaines personnes veulent comprendre le langage plus facilement, d'autres veulent écrire du code avancé plus facilement. C'est un compromis entre la simplicité de compréhension de ce que le compilateur fait avec un morceau de code spécifique et la simplicité d'écriture de grandes applications complexes interconnectées. Certaines personnes apprécient beaucoup plus que l'autre, pour diverses raisons.

En fin de compte, C ++ est un surensemble de C. À mon avis, il n'y a rien de tel qu'un programmeur C ++ hautement compétent qui n'est pas aussi un programmeur C passable (bien qu'il y ait beaucoup de programmeurs C ++ qui tombent en dessous de ma barre qui le feraient) se perdre en C pur). Alors que C ++ ajoute des fonctionnalités pour isoler le programmeur d'une grande partie de C, le code C ++ non trivial a souvent besoin d'utiliser C pour faire avancer les choses. C'est l'une des principales différences entre C ++ et Java et C #. Il y a une raison pour laquelle vous voyez souvent "C / C ++" regroupés, après tout.

Ma conviction personnelle - qui est partagée avec la plupart des autres professionnels de l'industrie des jeux avec lesquels j'ai interagi - est que l'expressivité améliorée et les installations de programmation de haut niveau de C ++ l'emportent sur la complexité accrue du langage par rapport à C, et la plupart des autres fréquents les affirmations anti-C ++ sont simplement obsolètes par rapport à la technologie d'aujourd'hui.

Sean Middleditch
la source
19
"Il n'y a rien de tel qu'un programmeur C ++ compétent qui n'est pas aussi un programmeur C compétent" Je suis fortement en désaccord avec cette affirmation. L'idiomatique C est très différent du idiomatique C ++. Les deux styles ont divergé, l'un mettant l'accent sur les pointeurs opaques et la fonction statique, l'autre utilisant l'encapsulation basée sur le langage, etc. Quelqu'un qui ne connaît que le C ++ idiomatique serait compétent en C ++, mais encore assez confus par le C. idiomatique
Nicol Bolas
Je ne suis pas d'accord pour dire que vous pouvez être compétent en C ++ et ne connaître que "C ++ idiomatique". Les parties dures de C ++ sont les mêmes parties dures de C (plus les modèles). Si un programmeur C ++ est confus par des fonctions autonomes, des structures simples et des pointeurs bruts ou opaques, il n'a pas encore écrit de code C ++ non trivial dans un scénario non académique réel. J'irais jusqu'à dire que quiconque ne maîtrise que quoi que ce soit "idiomatique" n'a pas encore acquis la compétence.
Sean Middleditch
3
«Idiomatique» est une autre façon de dire «confortable», ce qui - en plus d'être relatif - signifie également qu'il existe, presque par définition, une région inconfortable du langage dans laquelle un programmeur C ++ autrement compétent ne sera pas particulièrement compétent. (Je ne pense pas nécessairement que cela signifie qu'ils sont "confus" par ces éléments, simplement qu'ils ne sont pas à l'aise avec ou ne parlent pas couramment avec eux.) Et, dans une certaine mesure, les gens qui apprennent le C ++ idiomatique apprennent à être mal à l'aise entrevoir simplement un pointeur brut. Je ne pense donc pas qu'un programmeur C ++ compétent implique un programmeur C compétent.
John Calsbeek
Autrement dit, il existe certainement un domaine C ++ de niveau supérieur sur lequel vous pouvez complètement éviter d'utiliser une fonctionnalité de niveau inférieur qui serait requise pour écrire tout code C sérieux. Je suis sûr que la plupart des bases de code non académiques du monde réel ne restent pas entièrement dans ce domaine, mais je soupçonne que vous pourriez trouver une personne qui n'est à l'aise avec ce domaine et les qualifier de "compétentes". Bien sûr, vous ne compareriez pas une telle personne à un programmeur C - vous les compareriez à quelqu'un qui programme dans un certain nombre d'autres langages de haut niveau.
John Calsbeek
1
@DanielCarlsson: Très bien, je suis juste pédant. Pardon. Dans cet esprit, cependant ... C ++ ne fait rien qui rend les optimisations plus difficiles que C. :) Je veux dire, bien sûr, si vous utilisez la STL, vous êtes limité à ce que fait la STL, mais une grande partie de la raison nous utilisons C ++ au lieu de C # ou Java parce que nous pouvons simplement réimplémenter l'intégralité de la STL ou utiliser des tableaux bruts ou même lancer des assembleurs en ligne ou des extensions de langage (comme les intrinsèques SSE), etc.
Sean Middleditch
12

Pourquoi à un certain moment, l'industrie est passée massivement au C ++? Quelles sont les raisons du choix de cette pièce d'identité?

Id Software n'est pas "l'industrie". Ils sont une seule entreprise. Bien qu'ils puissent être influents, ils ne sont pas tous.

J'ai travaillé sur quelques moteurs de jeux qui remontent à 1999, et ils ont utilisé C ++.

Les principales raisons de l'adoption du C ++ "à cette époque" sont les suivantes:

  1. C'était standardisé . C ++ 98 est nommé ainsi car il a été publié en tant que norme ISO en 1998. Jusque-là, il y avait plusieurs dialectes de C ++ sans aucune idée claire qui était "réelle" ou "correcte". Une fois qu'il a été normalisé et que les compilateurs ont commencé à implémenter la norme, les développeurs de jeux pouvaient s'appuyer sur la norme actuelle.

  2. Rappelez-vous la vieille blague: un gars entre dans le cabinet d'un médecin et dit: "Ça fait mal quand je lève mon bras comme ça." Alors le docteur dit: "Alors ne lève pas le bras comme ça."

    Si les fonctions virtuelles sont lentes pour vos besoins, C ++ ne vous oblige pas à les utiliser. Tout en C ++ est opt-in. Vous choisissez d'utiliser chaque fonctionnalité particulière. Si vous utilisez du code critique pour les performances et que vous ne voulez pas de surcharge virtuelle, vous n'utilisez pas de fonctions virtuelles. Tout comme si vous utilisez du code critique pour les performances en C, vous n'utilisez pas de pointeurs de fonction.

    En effet, cela a conduit beaucoup de jeux C ++ à ne pas être du C ++ idiomatique (du moins, pas du C ++ idiomatique moderne ), mais simplement du "C avec des classes". Et c'est une façon parfaitement fonctionnelle de programmer C ++. Enfer, le simple fait de ne pas avoir à taper typedef structlorsque vous créez un nouveau type est un avantage.

    C ++ est un grand sac de fonctionnalités, et vous pouvez choisir celles que vous souhaitez.

Par exemple, le NDK pour Android n'a toujours pas un bon support C ++ (avec la version r8b) avec toutes les dernières et meilleures fonctionnalités, et c'est la boîte à outils native pour le système d'exploitation mobile le plus populaire au monde!

Votre point étant? Google tolère à peine les personnes utilisant NDK; il est clair qu'ils veulent que tout le monde utilise Java. La seule raison pour laquelle NDK existe est qu'il existe certains développeurs importants qui n'utiliseront tout simplement pas la plate-forme sans elle. Ainsi, NDK existe pour les entretenir et leurs besoins en fonctionnalités.

Oui, C ++ est une spécification plus grande et plus compliquée à implémenter. Java aussi. Il en va de même pour toutes les langues sauf C.

Aussi, que voulez-vous dire par "toutes les fonctionnalités les plus récentes et les meilleures"? Si vous parlez de trucs C ++ 11, eh bien, personne ne l'implémente complètement encore. La spécification a à peine un an maintenant. De plus, je ne sais pas non plus si NDK prend en charge C11; oui, C dispose également de "dernières et meilleures fonctionnalités" qui ne sont pas prises en charge partout.

Ce qui soulève un point important: si vous voulez que votre application pure-C compile sur Visual Studio, elle doit être conforme à C89, et rien de plus que cela. La fragmentation avec C existe donc déjà. Certaines plates-formes prennent uniquement en charge C89. Certains soutiennent C99. Certains soutiennent C11, à des degrés divers. Etc.

Si vous souhaitez utiliser C, puis utiliser C . Le fait que d'autres personnes n'aient pas fait ce choix ne signifie pas que votre choix est faux ou que leur choix est faux. Vous n'avez pas besoin de vous justifier auprès d'eux, et ils n'ont pas besoin de se justifier auprès de vous.

Nicol Bolas
la source
2
Je ne pense pas que Google tolère à peine qui utilise le NDK car le développement du NDK est en cours et il existe plusieurs versions disponibles pour Android, même si Google déteste le C / C ++, je ne pense pas que je puisse atteindre un bon niveau de performance pour mon jeu en Java ou les acteurs les plus importants du marché peuvent réécrire leur code uniquement pour java et Android, est probablement un mal nécessaire pour Google, je ne sais pas, mon but est de poser des questions sur un large voir et pas une question boiteuse sur C vs C ++ vs Java vs le monde, je cherchais une réponse plus généralisée à partir du langage continuer
user827992
au compilateur compte tenu de toutes les fonctionnalités du langage, votre réponse me permet également de souligner mon point initial sur la disponibilité des compilateurs C sur le marché, sur Windows j'ai presque toute la maison de logiciels qui produit un compilateur avec leur propre compilateur, j'ai aussi d'autres options gratuites comme MinGW. Le vrai problème que j'ai trouvé avec le C est le manque de support natif pour les structures de données, les conteneurs, en C ++, vous pouvez avoir une idée de combien vous coûte un conteneur particulier ou une instruction particulière,
user827992
en C, le code qui fait la même chose a probablement plus d'une implémentation, également en C ++, le compilateur peut optimiser davantage en conséquence. Je devrais probablement étudier davantage le C ++ mais je pense que je vais passer au C ++ uniquement pour un bon support pour certaines fonctionnalités particulières, pas pour le langage lui-même.
user827992
7

Il est également intéressant de noter que le logiciel d'identification décide de réécrire complètement la base de code de l'IdTech 4 en C ++, une énorme quantité de travail que je ne peux honnêtement pas comprendre sans une très bonne liste de raisons.

Il était courant pour eux de réécrire à peu près tout le moteur pour chaque version (au moins jusqu'à récemment - je ne sais pas grand-chose sur les derniers jeux), et puisque C ++ gagne en popularité, il est logique de l'utiliser plutôt que de coller avec C. Avec le temps, de moins en moins de personnes vont être compétentes avec C.

Pourquoi à un certain moment, l'industrie est passée massivement au C ++?

Parce qu'il vous offre de nombreuses fonctionnalités de niveau supérieur tout en étant presque entièrement rétrocompatible avec le code C.

Quelles sont les raisons du choix de cette pièce d'identité?

Google aurait répondu à cela pour vous: http://fabiensanglard.net/doom3/interviews.php

"... la moitié des programmeurs avaient vraiment des antécédents C ++ au début. J'avais des antécédents C et Objective-C, et j'ai en quelque sorte" glissé en C ++ "en regardant simplement le code que les gars C ++ écrivaient. Avec le recul, je J'aurais aimé avoir le temps de faire des recherches approfondies et d'explorer la langue avant de commencer à l'utiliser.

Vous pouvez toujours être en mesure de dire que le code de rendu a été largement développé en C, puis en quelque sorte skinné en C ++.

Aujourd'hui, je crois fermement que C ++ est le bon langage pour les grands projets multi-développeurs avec des exigences de performances critiques, et Tech 5 est beaucoup mieux pour l'expérience Doom 3. "

Si j'avais écrit mon code dans un C ++ moderne, j'aurais probablement mal maintenant parce que l'un des systèmes d'exploitation les plus populaires au monde serait interdit pour moi.

  1. Les programmeurs ne peuvent pas voir l'avenir. Ils ne sauraient pas qu'il y aurait une nouvelle plate-forme avec un support C ++ médiocre. Android n'existait pas correctement jusqu'en 2009. Doom 3 date de 2004.
  2. Pensez-vous que les programmeurs qui écrivent des jeux 3D de pointe pour PC et consoles s'attendent à ce que leur code s'exécute également sur les téléphones? Viser ce degré de portabilité est très rare et souvent inutile en raison de l'énorme différence de puissance disponible.

Je devrais écrire du code C ++ faisant référence à une version C ++ datant de 2-3 ans?

Pourquoi vous souciez-vous de cela? Ne soyez pas pris au piège à courir après la dernière chose. Si c'était assez bon il y a 5 ans, ça n'aura pas soudainement empiré maintenant.

Kylotan
la source
3

Eh bien, C ++ est sorti depuis les années 80, donc si un compilateur ne le prend pas en charge, vous devriez peut-être utiliser un autre compilateur. Et aussi, C ++ n'est pas vraiment beaucoup plus lent que C. Il n'est vraiment plus lent que si vous le chargez avec des fonctions virtuelles et d'autres abstractions. Cependant, C ++ est beaucoup utilisé aujourd'hui dans le monde non unix en raison de sa flexibilité et de ses nouvelles fonctionnalités que C ne possède pas. Écrire du code modulaire en C ++ est beaucoup plus facile que de le faire en C et vous aide à écrire du code plus portable. De retour au sujet des compilateurs, je ne connais aucun compilateur qui ne prend pas en charge C ++ (peut-être pas C ++ 11 complètement, mais tout compilateur à moitié décent devrait prendre en charge C ++).

CobaltHex
la source