Si je comprends bien, la cause de la différence de vitesse entre les langues compilées et python est que le premier compile du code jusqu'au code de la machine native, tandis que python compile en python bytecode, pour être interprété par le PVM. Je vois que de cette façon python peuvent être utilisés sur plusieurs systèmes d'exploitation (au moins dans la plupart des cas) ), mais je ne comprends pas, pourquoi n'y a-t-il pas un compilateur supplémentaire (et facultatif) pour python, qui compile de la même manière que les compilateurs traditionnels. Cela laisserait au programmeur le choix, ce qui est plus important pour eux; performances sur machine native En général, pourquoi n'y a-t-il pas de langages qui pourraient se comporter à la fois comme compilés et interprétés?
Non. La raison pour laquelle il existe des différences de vitesse entre des langages tels que Python et C++ est dû au fait que les langages de type statique fournissent au compilateur des tonnes d'informations sur la structure du programme et ses données, ce qui lui permet d'optimiser à la fois les calculs et l'accès à la mémoire. Parce que C++ sait que la variable est de type int, il peut déterminer la manière optimale de manipuler cette variable avant même que le programme ne soit exécuté. Dans Python d'autre part, le le runtime ne sait pas quelle est la valeur d'une variable jusqu'à ce que la ligne soit atteinte par l'interpréteur. Ceci est extrêmement important pour les structures, où en C++, le compilateur peut facilement indiquer la taille de la structure et chaque emplacement de ses champs dans la mémoire lors de la compilation. Cela lui donne un énorme pouvoir pour prédire comment les données pourraient être utilisées et lui permet d'optimiser en fonction de ces prévisions. Rien de tel n'est possible pour des langages comme Python.
Pour compiler efficacement des langages comme Python, vous devez:
Deux concepts pourraient nous aider à mieux comprendre pourquoi Python compilé en code machine natif "peut" ne pas fonctionner aussi vite que C compilé ou d'autres langages couramment compilés. Ils sont appelés liaison anticipée et liaison tardive.
Je devrais commencer par dire que je ne suis pas un Python, et je suis venu sur ce site par accident. Mais j'aime ce site.
Comme mentionné dans une autre réponse ici, le compilateur C++ peut en savoir beaucoup sur le programme et prendre des décisions sur les opérations à utiliser pour des structures de données spécifiques. Par exemple, si deux variables entières doivent être ajoutées ensemble, le compilateur sait qu'il s'agit d'entiers natifs, de 32 bits de large par exemple et il peut les ajouter avec une instruction "ADD". Il compile donc l'instruction ADD dans le code. Il est verrouillé et ne peut pas être modifié pendant l'exécution du programme. C'est une liaison anticipée.
D'un autre côté, dans un langage comme Python nous pourrions nous attendre à ce que le programme jette différents types de données ensemble de manière complexe. Maintenant, le compilateur ne sait pas si nos 2 variables sont des entiers, des flottants, des chaînes de caractères ou listes. Il doit donc compiler du code qui détermine ces informations au moment de l'exécution et sélectionner l'opération correcte pendant l'exécution du programme. Il s'agit d'une liaison tardive et nous pouvons comprendre qu'il y aura un impact sur les performances pour effectuer ce travail supplémentaire pendant que le programme C'est le prix à payer pour garder ces options ouvertes dans un langage comme Python mais il offre une flexibilité d'exécution maximale.