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?
+"<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.Réponses:
Quelques facteurs qui contribuent:
la source
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!
la source
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.
la source
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.
la source
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
string
type 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 desstring
capacité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.la source
std
string
qui 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.std::string
n’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, sanschar*
pour autant en être sûr. (Les cordes sont étonnamment complexes, même si vous vous attendez à ce qu'elles soient compliquées.)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.
la source
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.
la source
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.
la source
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):
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.
la source
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.
la source
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 ++.
la source
Rien. TIOBE est un index sans valeur. Si vous regardez réellement leur mesure, c'est une hypothèse absolue - au mieux.
la source
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.
la source
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.
la source
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.
la source