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é".
Réponses:
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.
la source
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é.
la source
restrict
en C99 (il y a 10 ans!).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.
la source
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.
la source
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.
la source
restrict
pointeur C99 n'aurait-il pas la même sémantique d'aliasing que Fortran? Et qu'est-ce qui fait la différence?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".
la source