Plusieurs raisons peuvent être envisagées pour choisir un langage X plutôt qu'un langage Y. La lisibilité du programme, la facilité de programmation, la portabilité sur de nombreuses plates-formes, l'existence de bons environnements de programmation peuvent être de telles raisons. Cependant, je n’examinerai que la rapidité d’exécution demandée dans la question. La question ne semble pas prendre en compte, par exemple, la vitesse de développement.
Deux langues peuvent être compilées sous le même code octet, mais cela ne signifie pas que le même code sera produit.
En fait, le bytecode est uniquement du code pour une machine virtuelle spécifique. Il présente des avantages techniques, mais n'introduit pas de différences fondamentales avec la compilation directe pour un harware spécifique. Donc, vous pourriez aussi bien envisager de comparer deux langages compilés pour une exécution directe sur le même ordinateur.
Cela dit, la question de la vitesse relative des langues est ancienne et remonte aux premiers compilateurs.
Pendant de nombreuses années, à cette époque, Professional considérait que le code écrit à la main était plus rapide que le code compilé. En d'autres termes, le langage machine était considéré comme plus rapide que les langages de haut niveau tels que Cobol ou Fortran. Et c'était à la fois plus rapide et généralement plus petit. Les langages de haut niveau sont encore développés car ils étaient beaucoup plus faciles à utiliser pour de nombreuses personnes qui n'étaient pas des informaticiens. Le coût d'utilisation de langages de haut niveau porte même un nom: le taux d'expansion, qui peut concerner la taille du code généré (un problème très important à cette époque) ou le nombre d'instructions réellement exécutées. Le concept était principalement expérimental, mais le ratio était supérieur à 1 au début, car les compilateurs effectuaient un travail assez simple selon les normes actuelles.
Ainsi, le langage machine était plus rapide que Fortran.
Bien sûr, cela a changé au fil des ans, à mesure que les compilateurs sont devenus plus sophistiqués, au point que la programmation en langage assembleur est maintenant très rare. Pour la plupart des applications, les programmes en langage assembleur sont en concurrence médiocre avec le code généré par l'optimisation des compilateurs.
Cela montre que l'un des problèmes majeurs est la qualité des compilateurs disponibles pour le langage considéré, leur capacité à analyser le code source et à l'optimiser en conséquence.
Cette capacité peut dépendre, dans une certaine mesure, des caractéristiques du langage pour souligner les propriétés structurelles et mathématiques de la source afin de faciliter le travail du compilateur. Par exemple, un langage pourrait permettre l'inclusion d'énoncés concernant les propriétés algébriques des fonctions définies par l'utilisateur, de manière à permettre au compilateur d'utiliser ces propriétés à des fins d'optimisation.
Le processus de compilation peut être plus facile, produisant ainsi un meilleur code, lorsque le paradigme de programmation du langage est plus proche des fonctionnalités des machines qui interprèteront le code, qu’il soit réel ou virtuel.
Un autre point est de savoir si les paradigmes mis en œuvre dans le langage sont fermés au type de problème programmé. Il faut s’attendre à ce qu’un langage de programmation spécialisé dans des paradigmes de programmation spécifiques compile très efficacement les fonctionnalités liées à ce paradigme. Par conséquent, le choix d'un langage de programmation peut dépendre, pour des raisons de clarté et de rapidité, du choix d'un langage de programmation adapté au type de problème à programmer.
La popularité du C pour la programmation système est probablement due au fait que ce dernier est proche de l’architecture de la machine et que la programmation système est également directement liée à cette architecture.
Un autre problème sera plus facilement programmé, avec une exécution plus rapide utilisant la programmation logique et les langages de résolution de contraintes .
Les systèmes réactifs complexes peuvent être programmés de manière très efficace avec des langages de programmation synchrones spécialisés comme Esterel, qui incorpore des connaissances très spécialisées sur de tels systèmes et génère un code très rapide.
Pour prendre un exemple extrême, certains langages sont hautement spécialisés, tels que les langages de description de syntaxe utilisés pour programmer des analyseurs. Un générateur d'analyseur n'est qu'un compilateur pour de tels langages. Bien sûr, il n’est pas encore complet, mais ces compilateurs sont extrêmement bons pour leur spécialité: produire des programmes d’analyse syntaxique efficaces. Le domaine de la connaissance étant restreint, les techniques d'optimisation peuvent être très spécialisées et réglées très finement. Ces générateurs d’analyseurs sont généralement bien meilleurs que ce qui pourrait être obtenu en écrivant du code dans une autre langue. Il existe de nombreux langages hautement spécialisés avec des compilateurs qui produisent un code excellent et rapide pour une classe restreinte de problèmes.
Par conséquent, lors de l'écriture d'un grand système, il peut être judicieux de ne pas compter sur une seule langue, mais de choisir la meilleure langue pour différents composants du système. Ceci pose bien entendu des problèmes de compatibilité.
Un autre point qui compte souvent est simplement l’existence de bibliothèques efficaces pour les sujets programmés.
Enfin, la vitesse n'est pas le seul critère et peut être en conflit avec d'autres critères tels que la sécurité du code (par exemple en ce qui concerne les mauvaises entrées, ou la résilience face aux erreurs système), l'utilisation de la mémoire, la facilité de programmation (bien que la compatibilité des paradigmes puisse réellement aider cela). ), taille du code objet, maintenabilité du programme, etc.
La vitesse n'est pas toujours le paramètre le plus important. En outre, cela peut prendre différentes formes, telles que la complexité, qui peut être une complexité moyenne ou une complexité pire. En outre, dans un grand système comme dans un programme plus petit, il existe des domaines dans lesquels la rapidité est essentielle, et d'autres dans lesquels cela importe peu. Et ce n’est pas toujours facile de déterminer cela à l’avance.