Tout d'abord, interprété/compilé n'est pas une propriété de la langue, mais une propriété de la mise en œuvre. Pour la plupart des langues, la plupart, si pas tous les implémentations de la chute dans une catégorie, donc on pourrait économiser quelques mots en disant que la langue est interprété/compilé trop, mais c'est toujours une distinction importante, à la fois parce qu'elle permet de comprendre et parce qu'il y a assez peu de langues utilisable implémentations de ces deux types (surtout dans le domaine des langages fonctionnels, voir Haskell et ML). En outre, il existe C interprètes et des projets qui tentent de compiler un sous-ensemble de Python pour le code C ou C++ (et par la suite en code machine).
Deuxièmement, la compilation n'est pas restreint à l'avance sur le temps de compilation du code machine natif. Un compilateur est, plus généralement, un programme qui convertit un programme dans un langage de programmation dans un programme dans un autre langage de programmation (sans doute, vous pouvez même avoir un compilateur avec la même entrée et de sortie de la langue si d'importantes transformations sont appliquées). Et compilateurs JIT compiler en code machine natif au moment de l'exécution, ce qui peut donner de la vitesse très proche ou même mieux que (en fonction de l'indice de référence et la qualité de la mise en œuvre par rapport) à l'avance du temps de compilation.
Mais pour arrêter coupant les cheveux en quatre et de répondre à la question que tu voulais dire: Pratiquement (lire: à l'aide d'un peu populaire et de la maturité de la mise en œuvre), le Python est compilé. Pas compilé en code machine à l'avance (c'est à dire "compilé" par le limité et le mal, mais hélas définition commune), "seulement" compilé vers du bytecode, mais c'est toujours de la compilation avec au moins certains des avantages. Par exemple, l'instruction a = b.c()
est compilé en un flux d'octets qui, lors de la "démonté", ressemble load 0 (b); load_str 'c'; get_attr; call_function 0; store 1 (a)
. C'est une simplification, c'est en fait de moins en moins lisible et un peu plus bas-niveau, vous pouvez expérimenter avec la bibliothèque standard dis
module et voir ce que la vraie affaire ressemble. L'interprétation de ce est plus rapide que l'interprétation d'un plus haut niveau de représentation.
Que le bytecode est soit interprété (à noter qu'il y a une différence, à la fois dans la théorie et dans la pratique de la performance, entre l'interprétation directement et première compilation de certains intermédiaires de la représentation et de l'interpréter), comme avec l'implémentation de référence (Disponible), ou les deux, interprété et compilé à l'optimisation de code machine au moment de l'exécution, comme avec PyPy.