Pourquoi un langage plus «rapide» que le C n'est-il pas sorti? [fermé]

147

Avec tous les nouveaux langages "modernes" publiés aujourd'hui, comment se fait-il que C soit toujours considéré comme le plus rapide et le "plus proche de la machine"? Je ne crois pas 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 pas trouvé quelque chose 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 telles que le ramassage des ordures et l’allocation de mémoire et utilisent des bibliothèques, etc. Je demande simplement pourquoi il n'y a jamais eu de véritable deuxième option pour C.

C est-il possible que C soit si parfait qu’aucune autre façon de faire fonctionner un ordinateur ne soit possible (mise à part l’adoption du développeur)?

EDIT Regardez, je ne cherche pas à 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 vu le jour et que C était simplement "accepté".

Jason
la source
44
C ++ est tout aussi rapide et beaucoup plus productif pour écrire. <3
GManNickG
6
euh, n'oublies-tu pas de c ++?
23
Je dirais que l’assemblage est le plus rapide et le "plus proche" de la machine.
27
pourquoi toutes les motions pour fermer? Je suis vraiment curieux ... Je n'essaie pas de déclencher des guerres de flammes ou quoi que ce soit
Jason
15
refermé? après avoir été rouvert par Jeff Atwood lui-même? pourquoi voudriez-vous éventuellement fermer ceci?
Jason

Réponses:

164

C est un langage très simple, et c’est pour cela, avec sa longévité, qu’il est rapide et optimisé. Il est également extrêmement largement pris en charge, notamment dans les environnements embarqués, les microprocesseurs, etc.

Il est difficile de battre un langage très simple et rapide. La seule chose à améliorer sur un langage comme celui-là est la facilité d'utilisation: réduisez le temps nécessaire à la création de code générique similaire et facilitez la modélisation avec des abstractions.

C ++ peut être aussi rapide que C, mais C ++ est un langage beaucoup plus complexe, ce qui signifie qu’il augmente nettement la productivité; tant que les gens savent comment l'utiliser. C ++ et C ne sont plus 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 elle n’a jamais été acceptée. Espérons que cela change, car cela supprime ce qui sévit dans C ++: la compatibilité avec le C,

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

GManNickG
la source
31
Par "simple", vous voulez dire "simple à partir d'un POV de compilateur, pas des POV de programmeur". C est simple car il s’agit essentiellement d’un assemblage avec des déclarations et des expressions. Ce n'est pas simple la façon dont Python est simple.
Marius
15
Mais pour clarifier, simple pour le compilateur ne signifie pas simple à ramasser. Peut-être pas simple de mettre en œuvre des idées compliquées
po
16
OCaml produit un code natif hautement optimisé à peu près aussi rapide que C et C ++, et le code lui-même est aussi succinct que Python. Avec un peu de polissage, je pense qu’OCaml pourrait correspondre ou battre C comme langage de choix lorsque vous devez écrire du code pour une vitesse maximale et un minimum d’empreinte mémoire. Objective-C fait aussi un très bon travail, bien que ce ne soit pas toujours aussi rapide que C, il obtient tout le "C avec des objets" comme C ++ ne pourrait ni ne le fera jamais.
Juliette
2
Convenu avec @ Thorbjørn, la compatibilité ascendante avec C est la raison pour laquelle C ++ s’est accroché et D non. Si nous sommes disposés à renoncer à celui-ci, il n’ya aucune raison de nous contenter de l’amélioration progressive D. Comme @Juliet le dit, OCaml pourrait être un concurrent viable en termes de performances. Mais il en serait de même pour un certain nombre d'autres langages, si les rédacteurs de compilateur avaient passé autant de temps sur eux que sur C ou C ++. Quoi qu'il en soit, bonne réponse et +1 de moi.
Jalf
5
@ Ferruccio: Oui, mais chaque langue peut être reliée aux bibliothèques C. Donc, si nous sommes disposés à accepter cela, au lieu de la compatibilité réelle du code source, comme le propose C ++ (plus ou moins), nous pourrions aussi bien choisir un langage complètement différent, par exemple Haskell ou Python. La raison pour laquelle C ++ a fait son chemin n’était pas qu’il pouvait se lier à des bibliothèques C. C'était qu'il pouvait compiler le code C.
Jalf
64

Il y a plus rapide que les langues C.

Il existe des langages plus rapides que le C. Par exemple, Fortran, comme on l'a déjà mentionné, se débrouille très bien car il a des règles de langage de crénelage beaucoup plus restreintes.

Il existe également des assemblages expérimentaux tels que des langages qui attaquent C sur le front, où il est utilisé comme langage d'assemblage de haut niveau, par exemple pour la création d'un compilateur. Jamais entendu parler de C-- ou de Janus? Mais ces deux personnes ont été tuées par le projet LLVM.

Je parierais qu'APL ou d'autres langages mathématiques vont faire exploser C dans des domaines d'application spécifiques, car ils prennent en charge de manière intégrée les unités de traitement vectoriel. 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 le langage C).

Les producteurs de processeurs ont également supprimé tous les éléments d'aide aux rédacteurs de compilateur dans d'autres langues - rappelez-vous les codes d'assembleur arithmétiques étiquetés pour rendre la mise en oeuvre LISP rapide sur SPARC? Emporté par le vent.

Et si vous vous écartez des micro-critères pour le 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 le C mais utilise l'optimisation globale du système, ce qui le rend plus rapide que le C dans le développement d'applications dans le monde réel.

Dans ce domaine, même une simple abstraction erronée ou de bas niveau peut tuer l'ensemble des 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 obtiendrez des implémentations lentes, comme la fonction de bibliothèque "qsort", qui peuvent être écrites 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'ints avec une bonne implémentation écrite à la main qui utilise l'accès à un tableau et l'opérateur '<' intégré.

Lothar
la source
9
Très bon commentaire. Il est important de comprendre que certains aspects de la spécification du langage C (comme les règles de repliement de pointeur) empêchent de générer un code machine vraiment optimal. En tant qu'assembleur de haut niveau, C n'est pas "le plus rapide", mais simplement "assez rapide".
1
Merci, j'ai oublié de mentionner l'impossibilité de renvoyer plusieurs valeurs de résultat. Un autre aspect de bas niveau qui me manque quand je l’utilise comme assembleur de haut niveau.
5
Le C moderne, correctement écrit, peut coder les mêmes hypothèses de repliement que tout autre langage, permettant ainsi au compilateur de faire les mêmes optimisations. Une caractéristique importante du langage est qu’il permet également au programmeur de ne pas assumer ces exigences quand elles ne sont pas applicables. Vos autres points sont sur place, donc +1.
Stephen Canon
1
@Rascher: C'est vrai et vous voyez là l'influence du C sur les concepteurs de CPU qui spécifient toujours un ABI de CPU. Et plusieurs valeurs de retour est quelque chose qui ne vient pas à l'esprit même si le nombre de registres ne serait pas un problème (SPARC, PowerPC, Itanium)
13
Le pseudo aliasing en C a été traité restricten C99 (il y a 10 ans!).
35

Bonne question. Je pense que les langues réussissent en trouvant une niche. Il est important de noter qu'il y a beaucoup de nouvelles langues qui sont meilleures que le C dans leurs créneaux.

  • C était autrefois largement utilisé comme langage d’application et, dans ce domaine, il a progressivement perdu du terrain au profit du C ++, de Java et de toutes sortes d’autres langages (notamment les langages dynamiques).

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

  • C a été utilisé pour le calcul scientifique, mais il est confronté à la concurrence de langages spécifiques à un domaine tels que 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 spécialisés 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 le 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 que le code C était considéré comme raisonnablement portable (même à l’époque). Mais ses principaux avantages ne sont pas liés, et découlent principalement de décennies de domination de son créneau. 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 une ABI en C, et c'est souvent la lingua franca des bibliothèques. Il existe un groupe de programmeurs qui savent coder C - et qui connaissent les problèmes et les pièges de C.

À long terme, cette niche ne va pas disparaître; et C a quelques problèmes. Mais il serait toujours extrêmement difficile pour tout nouveau venu de rivaliser.

Jason Orendorff
la source
9
C est encore largement utilisé pour le code serveur. Il n'y a pas que le Web, la plupart des serveurs DNS, de messagerie, etc. sont écrits en C. Même pour le Web, Apache est en C.
@ bortzmeyer: Apache est assez vieux cependant. Je ne dis pas que ce n'est pas utile ou a été remplacé, il a été créé quand C l'était et il n'y avait pas beaucoup de bonnes alternatives.
Macke
1
Je suis curieux de savoir pourquoi vous considérez que C "n'est pas un très bon choix" pour le calcul scientifique. Python est certes plus agréable à travailler, mais j’ai trouvé que C était une alternative solide quand un code plus rapide était nécessaire et que de nombreuses alternatives possibles (C ++) ne rapportaient pas énormément plus, contrairement à d’autres aspects de la programmation. .
Fomite
1
Au-delà de cela, la quantité de choses dans SciPy / NumPy, etc., écrite en C, rend déjà utile de savoir.
Fomite
1
@EpiGrad Peut-être que C est une alternative solide pour vous. Mais C a une courbe d’apprentissage très raide, en particulier pour les personnes qui n’ont aucune expérience en programmation. En particulier, il se bloque parfois et si vous n'êtes pas un codeur, vous avez peu d'espoir de le savoir. Mathematica facilite l'écriture d'un grand nombre de choses et vous obtenez moins de code par centaines. Et ça ne plante pas.
Jason Orendorff
25

En paraphrasant un très bon commentaire: il n’existe pas beaucoup de façons différentes de rendre une langue rapide et "proche de la machine" - C l’a bien fait et il n’ya guère de place pour l’améliorer.

Réponse originale:

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

Les langues ne sont pas rapides ou lentes à exécuter, contrairement aux implémentations spécifiques. Une langue ne peut être considérée comme plus rapide que d’autres quand elle facilite en quelque sorte l’ implémentation rapide . Invariablement, cela signifie "proche de la machine". Mais avec l’accélération exponentielle des machines, cela est devenu de moins en moins intéressant au fil du temps. Au lieu de cela, la facilité et la rapidité de développement et la portabilité sont devenues beaucoup plus importantes, ainsi "mieux" est devenu synonyme de "s'éloigner de la machine" . Pratiquement tous les efforts en matière de conception linguistique se sont engagés dans cette direction au cours des cinq dernières décennies.

Vous y êtes donc: plus proche de la machine et des langages plus rapides que C existent; ce sont ceux qui sont venus avant C : Assembler, Fortran. Probablement des oubliés.

Michael Borgwardt
la source
@ michael - mais il existe toujours un marché pour la programmation ultra-légère et ultra-rapide, en particulier avec l'assaut de tous ces appareils mobiles ... pourquoi C est-il toujours la meilleure option pour certains de ces appareils, c.-à-d. pourquoi n'y en a-t-il pas un autre? au niveau de ce langage, comme .NET-vs-Python-esque?
Jason
5
Zézayer. Endormi mais pas oublié! :)
2
@Jason: La question est: combien d'assembleurs portables avez-vous besoin? C est bien connu et il est très difficile d’écrire un langage avec une implémentation plus rapide, alors pourquoi s’embêter? En costume-langue, il n'y a pas d'exigence, pas de marché, pas de motivation.
4
@ Michael, veuillez nous excuser pour avoir commenté votre réponse. Python / Ruby / Java, etc., c’est parce qu’une fois que vous arrêtez de chercher le langage le plus efficace possible, vous avez beaucoup plus d’options quant aux fonctions à prioriser, et chaque approche peut générer un nouveau langage. Il y a beaucoup moins de façons d'écrire la langue la plus rapide possible.
1
-1 pour "et il n'y a guère de place pour l'amélioration" - il y a encore beaucoup à faire pour améliorer le C / C ++ sans affecter les performances.
BlueRaja - Danny Pflughoeft
21

Fortran est plus rapide que le C pour les tâches numériques en raison de la manière dont il traite les références en 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'autre part, le C ++ peut être aussi rapide que le C, mais possède de nombreuses fonctionnalités de programmation plus avancées. C'est une langue beaucoup plus récente, à partir du milieu des années 80.

zaharpopov
la source
1
Et C ++ est toujours en cours de mise à jour.
GManNickG
5
@GMan: il en est de même C.
3
Corrigez-moi si je me trompe, mais un restrictpointeur C99 n'aurait-il pas la même sémantique d'aliasing que Fortran? Et qu'est-ce qui fait la différence?
9
Je pense que l'idée que Fortran est plus rapide que C est un peu mythique, selon ce qui est codé et qui le fait. La raison pour laquelle les bibliothèques numériques lourdes sont en Fortran n’est pas parce que Fortran est plus rapide, mais parce que les routines ont été initialement codées en Fortran et que peu de personnes ont le courage nécessaire ou ont besoin de le réécrire. Le petit nombre de gourous en mathématiques qui écrivent et vérifient ces algorithmes sont heureux en Fortran et ne voient aucune nécessité de changer, d’autant plus qu’ils imaginent que Fortran est plus rapide.
Mike Dunlavey
16

Qu'est-ce que je fous, je vais donner avec mon 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) ne dira que pour de nombreuses tâches, les langages tels que Python, Ruby, etc. sont plus simples à utiliser.

C a été conçu pour être un langage système, c’est-à-dire 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 par des moyens que les non-programmeurs considèrent souvent comme 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 de mon étagère de programmation (sans compter les références O'Reilly Pocket References) et il n’est que légèrement "plus grand" que mon référence Ruby Pocket. C est assez puissant. Si vous avez besoin de parler à du matériel, vérifiez manuellement et tournez avec de la mémoire, etc. C est capable.

Du point de vue du programmeur, cependant, C n’est pas si simple. La vitesse et la puissance sont au prix de la gestion manuelle de la mémoire et de peu de prise en charge de la programmation orientée objet intégrée au langage. C ++ (ce n'est pas ma langue préférée) 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 ma langue préférée) a le même compromis, avec une légère tendance à garder la langue simple (garbage collection est un nouveau venu dans Objective-C, par exemple). Mais comme le monde informatique, comme beaucoup d’entre nous le savent, a été écrit en C, il est difficile pour les langages plus récents, plus compliqués mais "plus faciles" de s’implanter à grande échelle.

Dans certains cas, en particulier lorsque le "standard" actuel est aussi "assez bon" que le C, il n’ya tout simplement aucune incitation à quelque chose de "meilleur" (C ++, Objective-C, D, etc.) pour gagner en traction, est même assez incitatif pour créer quelque chose de "meilleur".

alesplin
la source