Qu'est-ce qui rend le C si populaire à l'ère de la POO? [fermé]

91

Je code beaucoup en C et en C ++, mais je ne m'attendais pas à ce que C soit le deuxième langage le plus populaire, légèrement derrière Java.

Index de la communauté de programmation TIOBE

Je suis curieux de savoir pourquoi, en cet âge de la POO, C est toujours aussi populaire? Notez que 4 des 5 langages de programmation les plus populaires sont des langages "modernes", orientés objet.

Maintenant, je conviens que vous pouvez utiliser la programmation orientée objet en C dans une certaine mesure, mais c'est en quelque sorte douloureux et inélégant (du moins par rapport au C ++, je suppose). Alors, qu'est-ce qui rend le C si populaire? Est-ce l'efficacité? être de bas niveau; la grande majorité des bibliothèques existantes ou autre chose?

GradGuy
la source
18
jeux vidéo, systèmes intégrés, programmation matérielle (micrologiciels), systèmes d'exploitation, etc.
25
Notez que vous n’obtenez que ce que vous mesurez - dans le cas de TIOBE, le nombre de résultats pour +"<language> programming"les moteurs de recherche populaires. Un article de blog "Pourquoi personne ne fait plus de programmation en C" compte pour C dans cet index. Heck, même cette question peut faire dès que Google le ramasse.
40
L'âge de la POO? c'est une déclaration assez audacieuse.
Mahmoud Hossam
57
Vous avez l'illusion que la POO est une solution miracle, vous devriez perdre cela rapidement, il n'y a rien de spécial ou de "bien" à propos de la POO, ce n'est qu'une des nombreuses stratégies d'organisation de code.
Raynos
23
@DeadMG: Pot, rencontre bouilloire. Les données de TIOBE peuvent ne pas être fiables, mais votre prétendue affirmation selon laquelle "ce n'est pas populaire" ne contient aucune source ni citation. Si vous voulez contester l'hypothèse sous-jacente à la question, fournissez au moins des preuves à l'appui.
Daniel Pryden

Réponses:

142

Quelques facteurs qui contribuent:

  • C est omniprésent. Quelle que soit la plate-forme, C est probablement disponible.
  • C est portable. Ecrivez un C propre et compilez-le avec un minimum de modifications sur d'autres plates-formes. Parfois, il fonctionne même immédiatement.
  • C existe depuis un moment. À l'époque où UNIX a conquis le monde, C (le langage de programmation de choix d'UNIX) a partagé sa domination sur le monde et est devenu la lingua franca du monde de la programmation. On peut s’attendre à ce que tout programmeur sérieux donne au moins un sens à un morceau de C; on ne peut pas en dire autant de la plupart des autres langues.
  • C est toujours la langue par défaut pour les systèmes UNIX et de type UNIX. Si vous voulez qu'une bibliothèque réussisse dans un environnement open-source, vous avez besoin d'assez bonnes raisons de ne pas utiliser C. C'est en partie dû à la tradition, mais davantage parce que C est la seule langue que vous pouvez supposer sans risque d'être prise en charge par tout système de type UNIX. système. Écrire votre bibliothèque en C signifie que vous pouvez minimiser les dépendances.
  • C est simple. Il manque l'expressivité des langages POO sophistiqués ou fonctionnels, mais sa simplicité permet de le saisir rapidement.
  • C est polyvalent. Il convient aux systèmes intégrés, aux pilotes de périphériques, aux noyaux de système d'exploitation, aux petits utilitaires de ligne de commande, aux applications de bureau volumineuses, aux SGBD, à la mise en œuvre d'autres langages de programmation et à pratiquement tout ce que vous pouvez penser.
  • C est rapide. La plupart des implémentations C sont compilées directement dans le code machine et le programmeur a tout le pouvoir sur ce qui se passe au niveau de la machine. Il n'y a pas d'interprète, pas de compilateur JIT, pas de machine virtuelle ou d'exécution - juste le code, un compilateur, un éditeur de liens et le bare metal.
  • C est «libre» (au sens de la bière et du langage). Aucune entreprise ne possède ni ne contrôle la norme, vous avez le choix entre plusieurs implémentations, vous ne rencontrez aucun problème de copyright, de brevet ou de marque pour utiliser C, et certaines des meilleures implémentations sont à source ouverte.
  • C a beaucoup d'élan. La langue est populaire depuis des décennies, il existe donc une quantité énorme d’applications, de bibliothèques, d’outils et, surtout, de communautés, pour la prise en charge de la langue.
  • C est mature. La dernière norme qui a introduit de grands changements est la norme C99, qui est principalement rétro-compatible avec les normes précédentes. Contrairement aux nouveaux langages (par exemple, Python), vous n'avez pas à vous soucier de rompre les changements de sitôt.
  • C est compatible. La plupart des langues ont des liaisons avec lesquelles parler. Cela signifie que l'on peut développer une bibliothèque en C en utilisant les conventions d'appel standard et avoir l'assurance que presque toutes les autres langues peuvent être reliées à cette bibliothèque. Pour citer quelques langages populaires d'usage courant: C #, Java, Perl, Python, PHP peuvent tous être liés aux bibliothèques C sans trop de peine.
  • C est puissant: si le langage ne peut rien faire, tous les compilateurs populaires autorisent l’incorporation de code assembleur qui peut faire tout ce que le matériel peut faire. Combinés de manière transitoire avec le point ci-dessus concernant la compatibilité, cela signifie que C peut jouer le rôle de liaison entre les langages de niveau supérieur et le "métal nu" de l’assemblage.
total
la source
9
Je pense que tous vos arguments ne sont pas corrects. 1) C est omniprésent. C ++ est aussi ubiquitos que C, puisqu'il y a des compilateurs C ++ à C. 2) C est portable. La même chose avec C ++. 3) C existe depuis un moment. La même chose avec C ++. 4) C est polyvalent. La même chose avec C ++. 5) C est rapide. La même chose avec C ++. 6) C est 'libre'. La même chose avec C ++. sept). C a beaucoup d'élan. La même chose avec C ++ à nouveau. 8) C est mature. La même chose avec C ++. Donc, vous ne répondez pas à la question.
Konstantin Solomatov
19
C11 est le dernier standard, pas C99. Ce n’est pas important, car tout le monde utilise le '89.
Pubby
53
@ KonstantinSolomatov: Si vous écrivez une bibliothèque qui sera consommée par d'autres personnes, rendez service au monde entier et écrivez-le en C au lieu de C ++. Si vous ne pouvez pas faire cela, écrivez au moins une API C. Tous les éléments de l'univers peuvent être liés au code C d'une manière ou d'une autre, généralement avec un effort minimal. En revanche, vous rencontrez souvent des problèmes ABI majeurs lorsque vous essayez d'appeler du code C ++ à partir d'un autre code C ++ , et encore moins à partir d'autres langages.
Daniel Pryden
37
@ KonstantinSolomatov - le fait qu'il existe un besoin pour un compilateur C ++ to C prouve en quelque sorte que C est celui qui est omniprésent.
Détly
11
@ KonstantinSolomatov: S'il vous plaît, arrêtez de penser que C est C ++. C n'a pas de fermeture. Certaines extensions de C font (comme celle mise en œuvre par la famille de compilateurs gcc), mais pas C elle - même (c'est-à-dire que ce n'est pas dans les spécifications K & R d'origine ou dans les normes C finalisées).
Donal Fellows
88

J'ai toujours eu tendance à blâmer la popularité de C sur la nécessité d'un langage d'assemblage universel. Sa combinaison de spécificité au niveau de la machine, de standardisation et de portabilité extrême permet à C de fonctionner comme ce langage d'assemblage universel de facto , et pour cette raison, je soupçonne que son rôle restera là indéfiniment.

Je dois mentionner que je suis toujours un peu surpris lorsque la programmation orientée objet est présentée dans les cours de programmation comme une sorte de "modèle final" qui constitue le seul point final possible pour une bonne programmation. Comme de nombreux autres aspects de la programmation, la valeur de la programmation orientée objet est un compromis entre de nombreux facteurs concurrents, notamment la manière dont le cerveau humain organise l'information, la manière dont les groupes de la société gèrent les logiciels à long terme et, dans le cas de la programmation orientée objet, certains aspects assez profonds. de la façon dont l'univers lui-même fonctionne.

Et ce dernier point mérite d’être martelé un peu. Lisez plus loin si vous êtes intéressé par une exploration au niveau physique des raisons pour lesquelles certains styles de programmation existent, comment ils fonctionnent ensemble et où le monde se dirigera peut-être à l'avenir, à mesure que nous approfondirons ces concepts ...

Un objet en physique est tout ce qui maintient une cohérence reconnaissable dans le temps. Cela permet à de simples créatures comme nous de représenter l'objet en utilisant seulement un petit nombre de bits, sans mettre en danger notre survie. Mais en termes de physique dans son ensemble, le nombre de choses à faire pour rendre ce genre de simplification facile et courante est remarquablement grand. En tant qu'êtres humains, nous n'y pensons pas beaucoup, car franchement, nous ne serions pas là si ce n'était pas vrai.

Cela semble trop abstrait? Ce n'est vraiment pas. Imaginons, par exemple, que vous tentiez de vous rendre chez vos amis si, au lieu de voitures, vous rencontriez des champs de plasma oscillant rapidement et des condensations momentanées de matière se déplaçant avec une gamme de vitesses extrêmement élevée. Un tel scénario pourrait réduire assez profondément les possibilités de socialisation, oui? Nous avons besoin d’objets, nous sommes des objets, et l’existence d’objets nous offre un niveau de simplification énorme et d’une importance cruciale pour l’environnement qui nous entoure.

Revenons donc au logiciel. Qu'est-ce que les objets du monde réel ont à dire sur les objets en termes de programmation?

En premier lieu, cela signifie que ce qui définit un "bon" objet dans un logiciel doit être de savoir si le type de données que vous manipulez prend facilement en charge l'idée de la persistance reconnaissable dans le temps .

Avec la définition, les formes les plus simples de POO sont faciles à reconnaître. Ce sont eux qui échappent un peu en n'utilisant que des données déjà "attachées" ou définies par un objet réellement réel, du monde réel, comme une personne, une maison ou une voiture. Même aujourd'hui, c'est encore trop souvent la seule définition des objets que les gens acquièrent dans les cours de logiciels. C'est dommage, car même les programmes triviaux orientés objet ont besoin d'une définition plus large que celle-là.

La deuxième catégorie d'objets, bien plus intéressante, consiste en ce que j'appellerai des événements immortalisés du monde réel . Par "immortalisé", j'entends des choses qui existent, du moins brièvement , en tant qu'entité ou collections bien définies dans le monde réel, mais qui se dispersent et cessent d'exister en tant que collections physiquement significatives. Un symposium est un bon exemple: le symposium existe depuis peu en tant que collection décemment bien définie de lieux et de personnes. Mais hélas, même les meilleures conférences doivent prendre fin et les différentes parties qui les ont constituées passent à d’autres activités.

Mais en utilisant des ordinateurs et des réseaux, nous pouvons faire en sorte qu'un symposium transitoire ressemble à un objet à long terme en capturant et en conservant une mémoire de celui-ci en tant qu'objet logiciel. Un grand nombre de choses que nous faisons avec les ordinateurs et les bases de données s’apparentent à ce type d’immortalisation d’événements transitoires, dans lesquels nous essayons en réalité d’enrichir notre univers réel en le capturant et en l’extrayant d’une manière qui ne peut exister physiquement. Par exemple, avez-vous vu une vraie Pandora récemment? De telles captures et extensions de pièces du monde réel contribuent à enrichir et à prolonger nos propres vies, nos économies et nos choix de manière remarquable. Pour moi, c’est le cœur de la programmation orientée objet, le lieu où elle a eu et continue d’avoir les impacts les plus remarquables.

Une dernière catégorie de POO est constituée d’objets qui n’ont pas de lien étroit avec des événements externes, mais qui constituent plutôt l’ infrastructure.nécessaire pour soutenir notre extension continue de la réalité en utilisant des objets immortalisés du monde réel. C’est là que vous pouvez descendre jusqu’au métal (semi) de l’ordinateur, en créant des fragments de réalité persistante qui, comme les éléments chimiques du monde réel, peuvent être combinés rapidement et de manière intéressante pour créer de nouveaux mondes internes. L'informatique mobile a permis de promouvoir la croissance de ce type d'approche hautement recombinatoire, qui imite encore à bien des égards les caractéristiques recombinatoires du monde physique. C'est également difficile: ce qui peut sembler être un bon choix peut, avec le temps, s'avérer être un mauvais choix, généralement parce qu'il finit par bloquer la diversité et l'expansion, au lieu de la soutenir.

Cette dernière catégorie souligne également les risques de l' utilisation d'un modèle unique pour la programmation, puisque tout comme le monde réel, les mondes programmés ont également besoin des processus qui ne le font pascorrespondent bien à des objets relativement invariables. La Terre regorge d'objets, mais le soleil regorge de flux d'énergie hautement dynamiques qui sont finalement nécessaires pour "conduire" les objets et les activités sur la Terre aux énergies inférieures. De même, en créant des mondes informatiques, il existe des cas où vous devez gérer des flux et des transformations et des contextes en mutation rapide qui, s'ils ne sont pas très semblables à des objets en eux-mêmes, sont néanmoins absolument essentiels pour permettre des objets plus simples et plus humains utilisés à des niveaux supérieurs. . Ce n’est pas un hasard si une grande partie de la programmation effectuée au niveau du noyau n’est pas manifestement semblable à un objet, ni qu’elle a tendance à s’appuyer fortement sur des langages comme le C qui sont davantage axés sur le traitement. Ce sont les domaines les plus profonds qui complètent la diversité fascinante que nous voyons plus haut dans les mondes générés par ordinateur.

L'autre domaine dans lequel la POO peut mal tourner est de trop se concentrer sur les vieux concepts d'objet.

Les objets du monde réel, et en particulier les objets vivants , ont un niveau absolument incroyable de capacité à interagir avec leur environnement de manière complexe et subtile. Des widgets composables qui se regardent, effectuent des vérifications de compatibilité et de cohérence, et trouvent peut-être même de nouvelles façons d'interagir se rapprochant beaucoup plus du concept biologique réel d'objets que ne le font les simples cadres et les simples systèmes d'héritage se concentrer sur (généralement par nécessité!) au niveau du code. C’est l’un des domaines de croissance pour les objets dans le cyber-monde, les approches les plus "analogues à celles d’agent" où la réactivité à l’environnement est la norme même au sein de la programmation elle-même.

Et tant pis pour ma "critique" de la POO! Néanmoins, j'espère cependant avoir expliqué pourquoi la création d'un cyber-monde plus riche signifie englober la diversité des styles de programmation, plutôt que de supposer qu'un "un seul" suffit. Mon sentiment est que les choses vraiment intéressantes sont encore à venir, peu importe la quantité de choses ordinaires que nous faisons maintenant!

Terry Bollinger
la source
18
Je suis sûr que bon nombre de personnes ont abandonné la partie "Lisez plus loin uniquement si vous êtes intéressé par une exploration de niveau physique". Je suis content de ne pas l'avoir fait. C’est le genre de pensée qui jette les bases de notre compréhension et probablement le seul moyen de faire des progrès notables. Merci pour la bonne lecture.
Matt Esch
@Raynos, $ MattEsch, merci à vous deux pour vos aimables paroles et je suis ravi que vous ayez trouvé cela intéressant!
Terry Bollinger
1
Inscrivez-vous sur le site juste pour pouvoir voter, cette réponse profonde et magnifique. =)
sgorozco
2
En accord avec vos pensées, je programme depuis un certain temps et je suis devenu un fanatique de la programmation orientée objet, car j’ai vraiment vu mes compétences en matière de codage s’améliorer de façon spectaculaire lors de mon adoption. Cependant, l'expérience m'a montré que tout forcer à devenir un objet peut vraiment être préjudiciable. Je rejette maintenant les outils de mappage d’objet à relationnel (quel gâchis) ou les schémas de sérialisation de graphe d’objet intégrale qui consomment 1000% de bande passante par rapport à un simple protocole binaire qui envoie simplement sur le réseau la bonne quantité de données binaires nécessaire à le moment. Merci pour la bonne lecture.
Sgorozco
2
Cette réponse est également la réponse à la question de savoir pourquoi avons-nous encore besoin de SQL!
HLGEM
25

Tout d’abord, vous n’avez pas besoin de la POO pour tout, malgré la vulgarisation des dogmes. Contrairement à Java, le langage C autorise les pointeurs de fonction et même les fermetures, ce qui ouvre la porte à la programmation fonctionnelle et résout une bonne partie du problème traité par la POO dans l’espace, car il fournit le moyen d’injection de dépendance. Une utilisation prudente des macros peut également créer de très belles choses, comme le prouve sglib .

Bizarrement, on pourrait considérer le C comme un bon compromis entre Java et C ++. Veuillez noter que je ne dis pas que C est en aucun cas un mélange des deux. Mais contrairement à Java, c'est un langage assez puissant, alors que contrairement au C ++, sa complexité est gérable.

C'est une langue ancienne, qui est devenue fiable et cohérente, sans pour autant devenir plus compliquée. Et tout cela mis à part, il a un éco-système géant et il court tout simplement partout.

arrière back2dos
la source
11
La programmation fonctionnelle est excellente, aucune objection à ce sujet. Mais C est un langage plutôt mauvais pour la programmation fonctionnelle. Les fermetures / blocs sont des hacks non portables et viennent avec une syntaxe moche (ainsi que des pièges, je parie). Même en ignorant tout cela, vous devez toujours vous soucier de la gestion de la mémoire. C est une langue utile, mais comme dans toute langue, vous ne faites que rendre votre vie plus dure que si vous en abusiez pour utiliser un paradigme pour lequel elle n’était pas faite. Vous pouvez aussi émuler une programmation fonctionnelle en Java (voir Guava ), mais ce n’est pas agréable non plus.
7
Il est très difficile de programmer dans un style fonctionnel sans un ramasse-miettes.
Konstantin Solomatov
@ KonstantinSolomatov: Tout d'abord, c'est très subjectif. Deuxièmement, vous pouvez ajouter une récupération de place à C si nécessaire.
back2dos
Si vous voulez un compromis entre Java et C ++, essayez Obj-C :) C'est certainement quelque chose que tout programmeur C / C ++ devrait essayer.
Sulthan
21

C a une ABI (interface binaire d’application) que C ++ n’a pas. Cela rend le C plus utile que le C ++ dans certains cas. Si je vais écrire une bibliothèque et pouvoir envoyer des fichiers binaires à l'usage d'autres personnes, le C ++ n'est pas le bon outil pour le travail. Si je vais écrire des bibliothèques qui seront utilisées par un autre langage, C est le bon outil pour le travail. Je n'ai jamais entendu parler d'un langage qui ne prend pas en charge FFI (interface de fonction étrangère) en C; par contre, le C ++ ne fonctionnera pas avec les bibliothèques écrites en C ++ si différents compilateurs sont utilisés.

Fondamentalement, cela revient à C occupant un rôle pour lequel C ++ ne convient pas.

pierre précieuse
la source
2
Mmm .. un rouleau de C, tomates et fromage!
DeadMG
3
Eh bien, C ++ a un ABI. C'est juste que C ABI est solide comme rock alors que celui de C ++ change trop souvent. De plus, beaucoup de C ++ sont des modèles compilés dans l'application using, vous ne pouvez donc pas le mettre à jour. Lorsque toutes les fonctionnalités sont cachées derrière des appels de fonctions, il est possible de réparer la bibliothèque et de faire fonctionner l'application.
Jan Hudec
12

L'un des avantages de l'utilisation de C par rapport à des langages tels que C ++ ou Java est qu'il n'y a pas beaucoup de magie qui se passe sous le capot. Aucun constructeur n'est exécuté lorsque des éléments sont alloués et aucun destructeur n'est exécuté lorsque des objets sortent de leur portée. Il n'y a pas de nom mangling et pas de vtables. La performance est plus facile à prévoir. vous n'avez pas à vous soucier qu'un éboueur interrompe une routine et en retarde l'exécution.

Les constructeurs, les destructeurs, les noms, les vtables, les éboueurs, etc., peuvent faciliter la complexité du code que vous créez, mais cette complexité devient alors une partie du langage lui-même, sur lequel vous n’avez pratiquement aucun contrôle . Vous pouvez vous retrouver avec des temps de construction plus longs (ennuyeux, mais tolérables), une empreinte mémoire de runtime plus longue (pouvant ou non être tolérable) ou des performances plus lentes. Avec C, vous pouvez réduire une partie de cette complexité jusqu'à obtenir les fonctionnalités dont vous avez besoin .

Par exemple, le stringtype de données C ++ est plus facile à utiliser avec les années-lumière que les chaînes de style C, mais c'est un morceau de code assez lourd qui ajoute une certaine lourdeur à la taille de votre image. J'ai rarement vu quelqu'un tirer pleinement parti des stringcapacités de n'importe quel programme. Les chaînes de style C, bien que plus difficiles à utiliser, imposent moins de pénalités en termes de temps d'exécution et de taille d'image, et pour un problème particulier peuvent être plus attractives pour cette raison.

John Bode
la source
2
La pénalité du temps d'exécution est un non-sens. C-strings (null terminé) sont beaucoup moins efficaces que les chaînes C ++. De plus, une classe de cordes peut être aussi compacte que le do, pourvu que vous ne std
traîniez
1
Une chaîne d'outils qui ne supprime pas les fonctions inutilisées stringqui ne sont pas utilisées si vous liez de manière statique le tube cathodique est une chaîne d'outils qui n'en vaut pas la peine.
Billy ONeal
10
La bêtise est que je travaille avec une bibliothèque où ce std::stringn’est pas assez sophistiqué . Si vous êtes vraiment sérieux au sujet des chaînes, à la fois en termes de performances et de capacités, vous devez recommencer à utiliser le langage C et à tout refaire vous-même, sans char*pour autant en être sûr. (Les cordes sont étonnamment complexes, même si vous vous attendez à ce qu'elles soient compliquées.)
Donal Fellows
1
@DonalFellow Intéressant. C’est précisément pourquoi le standard C a toujours renoncé à des choses comme les chaînes et les tables de hachage, tout comme leur absence me contrarie parfois.
Ingénieur
@ArcaneEngineer: le type de données manquant fondamental en C est une "tranche de T []" qui combinerait un T * et un size_t, pourrait être indexé comme un tableau, pourrait se décomposer en un T * et pourrait être converti de manière implicite tout type T [n] (la taille étant automatiquement fournie par le compilateur). Un tel type pourrait permettre la vérification automatique des limites dans de nombreux cas où cela serait impossible, tout en rendant de nombreux types de code beaucoup plus propres et lisibles.
Supercat
11

Les systèmes embarqués et les pilotes sont généralement programmés en C. De plus, il existe des tonnes de systèmes C hérités qui sont toujours maintenus et étendus.

EricSchaefer
la source
2
Oui, C fonctionne sur tout. Et c'est un langage assez facile à apprendre (comparé au c ++).
BenjaminB
10

Même chose qui fait la popularité d'un marteau à main à l'ère des marteaux pneumatiques (marteaux pneumatiques): le C est toujours l'outil idéal pour certains travaux.

anon
la source
6

Simplicité, cohérence et précision.

C'est simple: vous n'avez pas besoin d'un environnement de développement complexe, de bibliothèques étendues ou d'une machine virtuelle.

C'est cohérent - la plupart des C écrits il y a 10 ans pourraient être compilés aujourd'hui.

Précision - cela vous permet de descendre au niveau de la machine, en connaissant les emplacements de mémoire nécessaires. C'est excellent pour les performances et le matériel embarqué.

Ce n'est pas pour tout, mais c'est toujours un outil utile.

MathAttack
la source
5
Mieux encore, le code compilé il y a 10 ans pourrait s'exécuter aujourd'hui.
Donal Fellows
@DonalFellows: Et, pour les applications qui utilisent des plug-ins, il y a de bonnes chances qu'une application écrite, construite et publiée (sous une forme exécutable) puisse aujourd'hui utiliser des plug-ins compilés avec des outils de construction qui n'ont même pas été utilisés. conçu pour le moment.
Supercat
6

Je cite deux points d’une autre réponse, car ils décrivent exactement les raisons pour lesquelles j’utilise encore le C de temps à autre (ce n’est cependant pas ma langue principale de choix):

  • C est simple. Il manque l'expressivité des langages POO sophistiqués ou fonctionnels, mais sa simplicité permet de le saisir rapidement.
  • C est mature. La dernière norme qui a introduit de grands changements est la norme C99, qui est principalement rétro-compatible avec les normes précédentes. Contrairement aux nouveaux langages (par exemple, Python), vous n'avez pas à vous soucier de la rupture des changements de sitôt.

Je pense que c'est vraiment vrai. J'ai appris le langage C au début de la nuit: c'était simple, peu de mots-clés et de concepts, la plupart du travail effectué par les bibliothèques. Ensuite, je n’ai pas utilisé le C pendant quelques années. Vers 2002, j'avais besoin d'une implémentation rapide d'un algorithme, j'installais un compilateur C et le mettais en œuvre. Je connais le langage, je sais à quoi il sert et à quoi il ne sert pas (je ne mettrais jamais en oeuvre une application Web en C!), Et il n’est là que lorsque j’en ai besoin. Pas de surprises.

Avec C ++, j'ai eu une expérience différente. Je l'ai appris vers 1995 et cela signifiait un grand changement de paradigme de l'impératif à la POO. Génial! Je l'ai utilisé pour plusieurs projets jusqu'en 1999. Pendant quelques années, je n'ai pas utilisé le C ++ et quand je l'ai repris (2008), j'ai trouvé beaucoup de nouvelles fonctionnalités déjà dans le langage, et même plus prévues (introduites dans le C ++). 11). J'ai l'impression que je dois réapprendre la langue.

En tant que développeur, je préfère les langages matures et stables. J'aime apprendre une langue une fois, comprendre ses principes de conception, son utilité et l'utiliser quand je pense que c'est le bon outil pour le poste. J'aime aussi apprendre différents langages et choisir celui qui répond à mes besoins (C, C ++, Java, Scala, Haskell, etc.). Ce que je n'aime pas, c'est d'avoir à apprendre le même langage encore et encore, car il se développe de plus en plus loin et n'atteint jamais la maturité.

IMHO, un langage de programmation doit avoir une conception claire, cohérente et stable. J'aime l'approche de designers comme Niklaus Wirth: chaque fois qu'il ressentait le besoin de changer de langue, il en concevait une nouvelle (Pascal, Modula-2, Modula-3, Oberon). Je n'aime pas les langues qui subissent des changements importants tous les 5 à 10 ans: ce sont des cibles mouvantes et je ne pense pas qu'il soit utile d'investir mon temps pour les apprendre en profondeur, car la version que j'apprends maintenant sera probablement obsolète dans quelques jours. ans quand même.

En ce sens, l’OMI est un gagnant: c’est bon pour certaines applications et moins approprié pour d’autres, mais il a l’avantage d’être simple et relativement stable.

Giorgio
la source
4

Je suis surpris que personne n'ait encore mentionné Pire c'est mieux . Il a plus de 20 ans à ce stade, mais mérite toujours d'être lu. Bien que parfois légèrement ironique, il cerne très bien comment et pourquoi l’opportunité gagne souvent l’idéal, en utilisant C (opposé à LISP) comme l’un de ses exemples centraux.

Dan Martinez
la source
Choses que j'ai mis dans la catégorie de «pire mais meilleur»: anglais, PHP, Windows. .. McDonald peut-être. Bien que j’envie encore / préfère l’espagnol, Python, Linux et la cuisine française artisanale; autant que possible, si pas généralement possible.
ThorSummoner
1

Vous vouliez probablement demander pourquoi les gens utilisent le C plutôt que le C ++, alors que lorsque vous avez un compilateur C, vous avez aussi généralement un compilateur C ++.

  • Le langage C est beaucoup plus simple que C ++. Je ne connais aucune entreprise qui utilise la norme C ++ complète dans sa convention de codage. Prenez l'exemple du style de code C ++ de Google: http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml
  • C est beaucoup plus rapide à compiler. Merci au manque de constructions difficiles à compiler.
Konstantin Solomatov
la source
Ce lien est cassé.
ar2015
0

Rien. TIOBE est un index sans valeur. Si vous regardez réellement leur mesure, c'est une hypothèse absolue - au mieux.

DeadMG
la source
10
Le fait que TIOBE ne vaut rien ne signifie pas que C n'est pas populaire
Raynos
Toutefois, cela va définitivement à l’encontre de l’argument présenté dans le PO, à savoir que C est populaire et qu’il doit donc avoir une certaine utilité.
DeadMG
2
Une meilleure mesure de la popularité de C est que presque toutes les plateformes ont un compilateur C
Raynos
@ Raynos: Ce n'est pas une mesure du tout. La seule chose qui signifie, c'est que c'est facile à mettre en œuvre. Il ne dit rien sur le nombre de personnes qui l'utilisent, ni pourquoi.
DeadMG
2
Pas tout à fait, j'accepte avec joie les points de vue opposés. Votre réponse en une ligne semble avoir peu de poids, et vous êtes argumentatif et non constructif avec vos réponses.
mattnz
0

Beaucoup de logiciels hérités

De nombreuses entreprises ne peuvent pas modifier, instantanément, tout leur code en C ++ ou similaire.

De nombreuses entreprises ne peuvent pas se permettre de modifier leur code.

De nombreuses entreprises peuvent se permettre de modifier leur code, mais s'en moquent ou sont "bon marché".

De nombreuses entreprises sont en train de migrer, mais ne sont pas encore terminées.

Orientation d'objet caché

Code source C (non orienté objet) conçu comme un code source orienté objet, des applications modélisées avec l'orientation objet et codées avec du "C pur" ou des outils traduisant du "C ++" ou d'autres progr. lang en C.

J'ai entendu dire que certains jeux vidéo se font de cette façon. Certains outils inter-plateformes également, ainsi que la bibliothèque d'interface visuelle GTK (GObject, GLibrary) pour les distributions GNome Linux OS.

Umlcat
la source
3
La dernière partie de cette réponse doit être désobfusquée.
Aramis
@aramis. La deuxième partie signifie: beaucoup de code semble être écrit directement dans "C", mais en fait dans une autre langue, et traduit en "C"
umlcat
0

Je vois que certains des répondants ont expliqué pourquoi C était le plus populaire, il existe depuis longtemps, il est disponible sur la plupart des plateformes, gratuit, etc.

Mais on peut en dire autant des autres langages, Pascal par exemple - il est gratuit et supporté pour à peu près toutes les plateformes.

Pascal a été inventé autour de 1970, C a été inventé vers 1972, donc je pense que Pascal existe depuis aussi longtemps que C.

Personnellement, je pense que C est le langage le plus populaire car il y a simplement plus de code source ouvert disponible pour être réutilisé par quiconque. Et oui, il est plus bas que Pascal, donc ça approche de l’assemblage mais c’est beaucoup plus lisible que l’assemblage.

Je pense qu'il y a beaucoup trop de langages de programmation. En tant que programmeurs, nous devons connaître la plupart des éléments importants, mais à la fin, cela ne devrait pas être nécessaire. Un langage de programmation peut être implémenté pour tout faire, de la construction de sites Web aux jeux pour ordinateurs iOS.

C semble être ce langage global, mais j'aimerais que ce soit quelque chose comme Object Pascal. Pourquoi Object Pascal est un langage de programmation plus lisible, le code POO a tendance à être plus réutilisable et moins sujet aux bogues (à mon avis) que C.

Les applications très volumineuses sont plus faciles à gérer avec Object Pascal que C / C ++.

Pour ce qui est d’avoir un langage de programmation qui est le même depuis les années 70, et qui n’aime pas les langages qui changent tous les 5 ou 10 ans. Au fil du temps, la technologie avance et les méthodes de programmation sont améliorées. Si une langue change radicalement toutes les quelques années, le concepteur ne l’a probablement pas bien pensée. Mais de 1970 à 2012, ce qui représente presque un demi-siècle, il est correct d’apporter des modifications à un langage à cette époque afin d’intégrer les avancées utilisées dans le développement de logiciels.

C lui-même a été révisé plusieurs fois. Donc, ce n'est pas mieux que les autres langues forment ce point de vue.

Sergio Fernandez
la source
3
Un problème avec Pascal a été que la version "officielle" de la langue laissait de côté certaines fonctionnalités très nécessaires. Pendant très longtemps, le compilateur Pascal et le compilateur PC étaient beaucoup plus utilisables que tous les compilateurs C existants, mais ils ajoutaient des extensions de langage non prises en charge par un standard "officiel". Je pense que s’il avait été tenté de créer une norme officielle codifiant de telles extensions, Pascal aurait pu remplacer ce hack d’une langue connue sous le nom de "C".
Supercat
0

Parce que C a une base d'utilisateurs énorme. Oui, c'est un peu un catch-22, mais quand je pose une question à propos de C sur StackOverflow, j'obtiens la réponse presque instantanément. La même question à propos de Python pourrait prendre des heures pour obtenir une réponse.

En ce qui concerne C ++, il est plus compliqué d'apprendre à l'OMI. En outre, après avoir essayé la POO pendant 10 ans, je trouve que ce n'est pas toujours utile et qu'il est souvent plus facile d'utiliser la programmation procédurale à la place.

puk
la source
Avez-vous comparé les questions SO avec C # ou Java?
Gnat
@gnat c'était un exemple isolé de C v Python (qui a d'ailleurs plus de questions posées!). Je n'ai aucune expérience avec C # (avez-vous remarqué que je ne posais pas tellement de questions pour C # ou jav?)
mercredi
Hé, je trouve que la communauté #python sur StackOverflow est presque toujours super rapide. Bien que je serais surpris que la communauté C devance la communauté javascript pour la rapidité des réponses. (Principalement à cause du volume)
ThorSummoner