web-dev-qa-db-fra.com

Pourquoi n'y a-t-il pas de compilateur python pour le code machine natif?

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?

26
user2986898

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:

  1. Assurez-vous que la structure des données est statique pendant l'exécution du programme. Ceci est problématique car Python a des eval et des métaclasses. Les deux qui permettent de changer la structure du programme en fonction de l'entrée du programme. C'est l'une des choses qui donnent Python une telle puissance expressive.
  2. Déduisez les types de toutes les variables, structures et classes à partir du code source lui-même. Bien que cela soit possible dans une certaine mesure, le système de type statique et l'algorithme seraient si complexes qu'il serait presque impossible de les mettre en œuvre de manière utilisable. Vous pouvez le faire pour un sous-ensemble de la langue, mais certainement pas pour l'ensemble des fonctionnalités linguistiques.
30
Euphoric

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.

0
user214354