web-dev-qa-db-fra.com

Pourquoi un langage plus rapide et "meilleur" que C n'est-il pas sorti?

Avec tous les nouveaux langages "modernes" sortis aujourd'hui, comment se fait-il que C soit encore annoncé comme le plus rapide et "le plus proche de la machine"? Je ne crois pas vraiment qu'il n'y ait jamais qu'une seule façon correcte de faire les choses, et C existe depuis très longtemps (depuis les années 60!). N'avons-nous vraiment rien trouvé de mieux que quelque chose d'écrit il y a près de 50 ans?

Je suis conscient que les langages modernes sont de niveau supérieur et s'occupent de certaines tâches comme la collecte des ordures et l'allocation de mémoire et utilisent des bibliothèques et autres. Je demande simplement pourquoi il n'y a jamais eu de véritable deuxième option pour C.

Se peut-il que C soit si parfait qu'aucune autre façon de faire fonctionner un ordinateur ne soit possible (adoption par le développeur mise à part)?

EDIT Ecoutez, je n'essaye pas de frapper C ou quelle que soit votre langue préférée. Je me demande pourquoi C est devenu la norme et pourquoi d'autres alternatives n'ont jamais émergé et C a juste été "accepté".

149
Jason

C est un langage très simple, et c'est pour cela, avec sa longévité, que c'est rapide et optimisé. Il est également extrêmement largement pris en charge, en ce qui concerne les environnements embarqués, les microprocesseurs, etc.

Il est difficile de battre une langue vraiment simple et rapide. La seule chose à améliorer sur un langage comme celui-ci est la convivialité: réduisez le temps nécessaire pour créer un code générique similaire et simplifiez la modélisation avec des abstractions.

C'est là que C++ entre en jeu. C++ peut être aussi rapide que C. Le fait est que C++ est un langage beaucoup plus complexe, ce qui signifie qu'il augmente définitivement la productivité; tant que les gens savent comment l'utiliser. C++ et C sont pas presque le même langage.

Maintenant, D était une autre étape. Même capacité pour le code rapide, la récupération de place facultative, etc., mais cela n'a jamais pris de l'ampleur. Espérons que cela change, car il laisse tomber ce qui afflige C++: la compatibilité descendante avec C.

Donc, pour répondre à votre question, "mieux" est une chose difficile à juger. En termes de simplicité et de vitesse, C est probablement proche du meilleur que nous puissions faire. En termes de productivité par rapport à la simplicité, le C++ est probablement le meilleur que nous puissions faire, bien que cette opinion varie beaucoup plus. Enfin, en termes de langage étoffé et épuré, avec la rapidité et la simplicité de C, D gagne ce contexte.

164
GManNickG

Il existe des langages plus rapides que C.

Il y a des langages plus rapides que C. Par exemple, Fortran comme déjà mentionné se porte très bien car il a des règles de langage d'alias beaucoup plus restreintes.

Il existe également des langages d'assemblage expérimentaux qui attaquent C sur le front où il est utilisé comme langage d'assemblage de haut niveau, par exemple pour la création de compilateurs. Avez-vous déjà entendu parler de C-- ou de Janus? Mais ces deux-là ont été tués par le projet LLVM.

Je parierais que l'APL ou d'autres langages mathématiques feront sauter C de l'eau dans leurs domaines d'application spéciaux, car ils prennent en charge les unités de traitement Vector. C'est quelque chose qui n'est pas possible pour C (et les gars: NON! Les bibliothèques optimisées spéciales avec la liaison C n'ont rien à voir avec C comme langage).

Les producteurs de CPU ont également supprimé tout ce qui aidait les rédacteurs de compilateurs dans d'autres langues - rappelez-vous les codes d'assembleur arithmétique balisés pour rendre l'implémentation LISP sur SPARC rapide? Autant en emporte le vent).

Et si vous passez des micro-benchmarks au développement d'applications, il existe des langages plus rapides pour le développement d'applications. Mon exemple personnel ici est toujours SmartEiffel. Il cible C mais utilise l'optimisation globale du système, ce qui le rend plus rapide que C dans le développement d'applications réelles.

Dans ce domaine, même une simple abstraction erronée ou de bas niveau peut tuer toutes les performances du langage. Parce que C n'offre pas d'abstractions élevées, la plupart des gens disent que c'est un problème de programmation, mais ce n'est pas le cas. Par exemple, regardez le manque de génériques. En C, vous vous retrouverez avec des implémentations lentes comme la fonction de bibliothèque "qsort" qui peut être écrite plus rapidement avec des génériques (où l'appel de fonction pour les comparaisons clés est éliminé).

Il suffit de comparer un appel qsort sur un tableau de mégaoctets d'entiers avec une bonne implémentation écrite à la main qui utilise l'accès au tableau et l'opérateur "<" intégré.

64
Lothar

Bonne question. Je pense que les langues réussissent en trouvant une niche. Il est important de noter qu'il existe de nombreux langages plus récents qui sont meilleurs que C dans leurs niches.

  • C était autrefois largement utilisé comme langage d'application, et dans ce domaine, il a régulièrement perdu du terrain par rapport à C++, Java et récemment toutes sortes d'autres langages (notamment les langages dynamiques).

  • C était un langage pour écrire du code serveur. Le Web a poussé une incroyable variété de langages dans cet espace - Perl, Java, Python, VBScript, VB.NET, Ruby, C # - et les cas où C a un sens pour le code du serveur sont maintenant rares.

  • C a été utilisé pour le calcul scientifique, mais il fait face à la concurrence de langages spécifiques à un domaine comme Matlab et Mathematica, ainsi que de bibliothèques comme SciPy . Beaucoup de gens qui écrivent du code dans ce créneau ne sont pas des codeurs de métier et C ne leur convient pas.

Mais la niche de C est le code système. Noyaux du système d'exploitation. Conducteurs. Bibliothèques d'exécution. Il est tellement établi dans cet espace que même C++ le déplace assez lentement.

C a gagné dans les années 1970 à cause d'UNIX, parce que les langages concurrents étaient soit trop restrictifs soit trop lents, et parce que le code C était considéré comme raisonnablement portable (mensonge, même alors). Mais ses plus grands avantages aujourd'hui ne sont pas liés et découlent principalement de décennies de domination de sa niche. Il existe de bons outils pour C: optimisation des compilateurs, débogueurs de noyau, analyse statique efficace pour trouver des bogues dans le code du pilote, etc. Presque toutes les grandes plates-formes définissent un C ABI, et souvent c'est la lingua franca pour les bibliothèques. Il y a un groupe de programmeurs qui savent coder C - et qui connaissent les problèmes et les pièges de C.

À long terme, ce créneau ne disparaîtra pas; et C a quelques problèmes. Mais il serait encore extrêmement difficile pour tout nouveau venu de rivaliser.

35
Jason Orendorff

Pour paraphraser un très bon commentaire: Il n'y a pas beaucoup de façons différentes de rendre un langage rapide et "proche de la machine" - C l'a bien fait, et il n'y a guère de place pour l'améliorer.

Réponse originale:

Rapide à exécuter ou rapide à écrire des trucs?

Les langages ne sont ni rapides ni lents pour s'exécuter, des implémentations spécifiques le sont. Un languge ne peut être considéré comme plus rapide que les autres lorsqu'il facilite en quelque sorte d'avoir implémentations rapides. Invariablement, cela signifie "près de la machine". Mais avec des machines qui s'accélèrent de façon exponentielle, cela est devenu progressivement moins intéressant au fil du temps. Au lieu de cela, la facilité et la rapidité de développement et de portabilité sont devenues beaucoup plus importantes, donc "mieux" est devenu signifier "loin de la machine". Presque tous les efforts dans la conception de la langue sont allés dans cette direction au cours des 5 dernières décennies.

Vous voilà donc: plus proche de la machine et des langages plus rapides que C existent; ils sont ceux qui ont précédé C: Assembleur, Fortran. Probablement quelques oubliés.

25
Michael Borgwardt

Fortran est plus rapide que C pour les tâches numériques en raison de la façon dont il gère les références de mémoire (les pointeurs C sont plus difficiles à optimiser). Les bibliothèques numériques lourdes à la base de choses comme Matlab et Numpy sont toujours écrites en Fortran.

D'un autre côté, C++ peut être aussi rapide que C, mais possède de nombreuses fonctionnalités de programmation plus avancées. C'est une langue beaucoup plus récente, du milieu des années 80.

21
zaharpopov

Que diable, je vais carillon avec mes 0,02 $.

Dans de nombreux cas, il existe une différence réelle ou perçue entre les langues "systèmes" et les langues de niveau supérieur. J'ignorerai la plupart des langages de "niveau supérieur", car personne (du moins pas beaucoup) dira que pour de nombreuses tâches, les langages comme Python, Ruby, etc. sont plus simples à utiliser.

C a été conçu pour être un langage système, ce qui signifie qu'il a été conçu comme le langage dans lequel le système d'exploitation Unix a été écrit. En tant que tel, il a été conçu pour être simple, puissant et rapide. Un langage simple gagne en puissance au moyen que les non-programmeurs considèrent souvent dangereux: pointeurs, gestion manuelle de la mémoire, etc. Comme cela a déjà été mentionné, C est assez simple. K&R est de loin le plus petit livre sur ma tablette de programmation (sans compter les références de poche O'Reilly) et il n'est que légèrement "plus grand" que mon Ruby Pocket Reference. C est assez puissant. Si vous avez besoin pour parler au matériel, vérifier manuellement et tordre la mémoire, etc. C a la capacité.

Du point de vue d'un programmeur, cependant, C n'est pas si simple. La vitesse et la puissance viennent au prix d'une gestion manuelle de la mémoire et pas beaucoup OOP support intégré au langage. C++ (pas mon langage préféré) est beaucoup plus simple du point de vue d'un programmeur, mais beaucoup moins simple du point de vue d'un compilateur. Objective-C (peut-être mon langage préféré) a le même compromis, avec un léger penchant dans le sens de garder le langage simple (le ramasse-miettes est un nouveau venu dans Objective-C, par exemple). Mais depuis le monde informatique comme beaucoup d'entre nous savent qu'il a été écrit en C, il est difficile pour les langages plus récents, plus compliqués mais "plus faciles" d'être largement adoptés.

Dans certains cas, en particulier lorsque la "norme" actuelle est aussi "assez bonne" que C, il n'y a tout simplement pas beaucoup d'incitation pour que quelque chose de "meilleur" (C++, Objective-C, D, etc.) gagne du terrain, lorsqu'il y a est même assez incitatif pour créer quelque chose de "mieux".

16
alesplin