La réponse courte est: nous ne savons pas , demandez à nouveau dans 100 ans. (Nous pourrions toujours ne pas savoir alors; peut-être que nous ne le saurons jamais.)
En théorie, c'est possible. Prenez tous les programmes jamais écrits, convertissez-les manuellement en code machine le plus efficace possible et écrivez un interpréteur qui mappe les codes sources en codes machines. Cela est possible car seul un nombre fini de programmes a été écrit (et au fur et à mesure que de nouveaux programmes sont écrits, maintenez les traductions manuelles). Ceci est aussi, bien sûr, complètement idiot sur le plan pratique.
Là encore, en théorie, les langages de haut niveau pourraient atteindre les performances du code machine, mais ils ne les dépasseront pas. C'est encore très théorique, car dans la pratique, nous avons très rarement recours à l'écriture de code machine. Cet argument ne s'applique pas à la comparaison de langages de niveau supérieur: cela n'implique pas que C doit être plus efficace que Python, seul ce code machine ne peut pas faire pire que Python.
Venant de l’autre côté, à titre expérimental, nous pouvons constater que la plupart du temps , les langages de haut niveau interprétés ont des performances pires que les langages de bas niveau compilés. Nous avons tendance à écrire du code non sensible au temps dans des langages de très haut niveau et des boucles internes à temps critique dans un assemblage, avec des langages comme C et Python se situant entre les deux. Bien que je ne dispose d'aucune statistique à ce sujet, je pense que c'est la meilleure décision dans la plupart des cas.
Cependant, il existe des cas non contestés où les langages de haut niveau surpassent le code que l'on rédigerait de manière réaliste: les environnements de programmation spéciaux. Des programmes comme Matlab et Mathematica sont souvent bien meilleurs pour résoudre certains types de problèmes mathématiques que ce que de simples mortels peuvent écrire. Les fonctions de la bibliothèque ont peut-être été écrites en C ou C ++ (ce qui alimente le camp «Les langages de bas niveau sont plus efficaces»), mais ça ne me regarde pas si j'écris du code Mathematica, la bibliothèque est une boîte noire.
Est-il théoriquement possible que Python soit aussi proche, voire plus proche, de performances optimales que C? Comme on l'a vu ci-dessus, oui, mais nous en sommes très loin aujourd'hui. Là encore, les compilateurs ont fait beaucoup de progrès au cours des dernières décennies, et ces progrès ne ralentissent pas.
Les langages de haut niveau ont tendance à automatiser davantage les tâches. Ils ont donc plus de travail à effectuer et ont donc tendance à être moins efficaces. D'un autre côté, ils ont tendance à avoir plus d'informations sémantiques, il est donc plus facile de repérer les optimisations (si vous écrivez un compilateur Haskell, vous n'avez pas à craindre qu'un autre thread modifie une variable sous votre nez). L'un des nombreux efforts visant à comparer des pommes et des oranges avec différents langages de programmation est le jeu de tests de langage informatique (anciennement connu sous le nom de fusillade). Fortran a tendance à briller lors de tâches numériques; mais quand il s'agit de manipuler des données structurées ou une commutation de thread à haut débit, F # et Scala se débrouillent bien. Ne prenez pas ces résultats comme des évangiles: une grande partie de ce qu'ils mesurent est la qualité de l'auteur du programme de test dans chaque langue.
Un argument en faveur des langages de haut niveau est que la performance sur les systèmes modernes n’est pas aussi fortement corrélée au nombre d’instructions exécutées, et moins au fil du temps. Les langages de bas niveau conviennent parfaitement aux machines séquentielles simples. Si un langage de haut niveau exécute deux fois plus d'instructions, mais parvient à utiliser le cache de manière plus intelligente, de sorte qu'il en divise par deux le nombre d'omissions manquantes dans le cache, le vainqueur peut en résulter.
Sur les plates-formes de serveur et de bureau, les processeurs ont presque atteint un plateau où ils ne vont pas plus vite (les plates-formes mobiles y parviennent aussi); cela favorise les langues où le parallélisme est facile à exploiter. Beaucoup de processeurs passent le plus clair de leur temps à attendre une réponse d’entrée / sortie; le temps passé en calcul importe peu par rapport à la quantité d'E / S, et un langage permettant au programmeur de minimiser les communications est un avantage.
Dans l’ensemble, si les langues de haut niveau commencent par une pénalité, elles ont plus de marge de progression. À quel point peuvent-ils se rapprocher? Demander à nouveau dans 100 ans.
Note finale: souvent, la comparaison n’est pas entre le programme le plus efficace pouvant être écrit en langue A et le même dans le langage B, ni entre le programme le plus efficace jamais écrit dans chaque langue, mais entre le programme le plus efficace qui puisse être écrit par un humain dans un certain temps dans chaque langue. Cela introduit un élément qui ne peut pas être analysé mathématiquement, même en principe. Concrètement, cela signifie souvent que la meilleure performance est un compromis entre le niveau de code de bas niveau que vous devez écrire pour atteindre les objectifs de performance et le temps que vous avez le temps d'écrire pour respecter les dates de parution.