Python est-il interprété ou compilé?

76

C’est simplement une question que j’avais en lisant sur les langages interprétés et compilés.

Ruby est sans aucun doute un langage interprété puisque le code source est traité par un interpréteur au moment de l'exécution.
Au contraire, C est un langage compilé, car il faut d'abord compiler le code source en fonction de la machine, puis l'exécuter. Ce résultat est une exécution beaucoup plus rapide.

J'arrive maintenant à Python :

  • Un code python ( somefile.py ) lors de l’importation crée un fichier ( somefile.pyc ) dans le même répertoire. Supposons que l'importation s'effectue dans un shell Python ou un module Django. Après l'importation, je modifie un peu le code et exécute à nouveau les fonctions importées pour constater que l'ancien code est toujours en cours d'exécution. Cela suggère que les fichiers * .pyc sont des fichiers python compilés similaires aux fichiers exécutables créés après la compilation d'un fichier C, bien que je ne puisse pas exécuter directement le fichier * .pyc.
  • Lorsque le fichier python (somefile.py) est exécuté directement (./somefile.py ou python somefile.py), aucun fichier .pyc n'est créé et le code n'est exécuté que lorsqu'il indique un comportement interprété.

Celles-ci suggèrent qu'un code python est compilé chaque fois qu'il est importé dans un nouveau processus pour créer un fichier .pyc alors qu'il est interprété lorsqu'il est exécuté directement.

Alors, quel type de langue devrais-je le considérer comme? Interprété ou compilé? Et comment son efficacité se compare-t-elle aux langages interprétés et compilés?

Selon la page Langages interprétés de wiki , celui-ci est répertorié en tant que langage compilé pour le code de machine virtuelle. Qu'entend-on par là?

crodjer
la source
1
Quand doute-t-on que Ruby est un langage interprété? Quand c'est compilé. :) macruby.org
mipadi
8
Il convient de noter qu’aucun langage moderne n’est interprété au sens strict. Presque tous compilent en bytecode.
Winston Ewert
@ Winston Ewert: bravo! Applesoft Basic (dans les années 1980) a été compilé en code octet. Dans ce cas, "moderne" signifie tout langage interprété dans la mémoire vivante à la seule exception possible de certaines implémentations rudimentaires de Dartmouth Basic.
S.Lott
6
>> Au contraire, C est un langage compilé << root.cern.ch/drupal/content/cint
igouy
3
@ S.Lott: Appeler le processus de génération de jetons utilisé par les interprètes Applesoft et BASIC des années 80 pour la "compilation de codes octets" est plus qu'un peu trompeur. Oui, le code de programme entré par l'utilisateur était stocké en mémoire sous une forme comprimée, un octet par mot réservé, mais rien n'a été fait jusqu'à ce que vous ayez tapé RUN. C'était comme si vous aviez un compilateur qui effectuait l'étape de lexing puis produisait un flux de jetons qui devaient être reparsés chaque fois que le programme était exécuté. Pas du tout comme la compilation de javaccode- octet moderne telle que réalisée par, disons , qui englobe le lexing, l’analyse et l’optimisation.
dodgethesteamroller

Réponses:

80

Il convient de noter que les langages ne sont ni interprétés ni compilés, mais que leurs implémentations interprètent ou compilent du code. Vous avez noté que Ruby est un "langage interprété", mais vous pouvez le compiler à la MacRuby , de sorte qu'il ne s'agit pas toujours d' un langage interprété.

Pratiquement toutes les implémentations Python consistent en un interpréteur (plutôt qu'un compilateur). Les .pycfichiers que vous voyez sont du code octet pour la machine virtuelle Python (similaire aux .classfichiers Java ). Ils ne sont pas identiques au code machine généré par un compilateur C pour une architecture de machine native. Certaines implémentations Python, cependant, consistent en un compilateur juste à temps qui compilera le code octet Python en code machine natif.

(Je dis "à peu près tous les" parce que je ne connais pas de compilateur de machine natif pour Python, mais je ne veux pas prétendre qu'il n'en existe aucun ailleurs.)

Mipadi
la source
Selon votre définition, des compilateurs natifs pour Python existent. Certains ne compilent qu'un sous-ensemble de python. D'autres implémentent tout le python mais utilisent l'API python pour effectuer les opérations qu'il ne peut pas exécuter en C.
Winston Ewert
Je pense que vous décrivez en fait que Python est soit ce que j'appellerais «semi-compilé», soit peut être réellement compilé. Par semi-compilé, je veux dire que puisqu'il est habituellement compilé dans le fichier .pyc de langage intermédiaire utilisé par la machine virtuelle Python, il est généralement exécuté à partir de ce formulaire "semi-compilé", ce qui rend généralement le code plus rapide interprétation simple du code interprété à l'exécution. Fait intéressant, le code semi-compilé peut parfois être plus rapide que le code natif (par exemple, C # est généralement plus rapide que C ++).
Chris Halcrow
5
Cython compile le code Python en C afin qu'il puisse être compilé en tant qu'objet partagé.
Greyfade
Distinguer le code octet et le code machine de cette façon est assez arbitraire. Java est compilé: le compilateur javac génère des fichiers de classe contenant des instructions de bas niveau pouvant être exécutées, soit sur une machine virtuelle (par exemple, un hotspot), soit directement par du matériel (par exemple, sur des processeurs ARM dotés de l’extension Jazelle). Autant que je sache, il n'y a pas de raison technique qu'une architecture de processeur similaire ne puisse pas être conçue pour exécuter directement des instructions python vm.
Jules
@ Jules Par coïncidence, le code Jython est en fait compilé dans des fichiers .class qui, je crois, sont réutilisés jusqu'à ce que vous modifiiez la source py.
JimmyJames
35

Python tombera sous le code d'octet interprété. .pyLe code source est d'abord compilé en code octet .pyc. Ce code d'octet peut être interprété (CPython officiel) ou compilé JIT (PyPy). Le code source Python ( .py) peut être compilé en code octet différent également comme IronPython (.Net) ou Jython (JVM). Il existe plusieurs implémentations du langage Python. Le code officiel est un code octet interprété. Il existe également des implémentations compilées sous forme de code JIT.

Vous pouvez essayer ici les comparaisons de vitesse de différentes implémentations de langues .

aufather
la source
Merci pour l'info. Selon les tests de performance, la performance de python est en baisse!
Crodjer
1
Le lien que j'ai donné indique très clairement qu'il s'agit de points de repère erronés pour les implémentations de langage . Python ne devrait pas être votre choix de langue si vous vous inquiétez trop des performances d'exécution. Si vous voulez toujours comparer, comparez des langues similaires. Le code d'octet interprété officiellement par CPython est comparable ou plus rapide que Ruby compilé par JIT.
aufather
1
@ jase21 - "Mes projets pour 2006 sont de porter les techniques mises en œuvre dans Psyco dans PyPy. PyPy nous permettra de créer un spécialiste JIT plus flexible, plus facile à expérimenter et sans la surcharge de devoir rester en phase avec les évolutions de le langage Python. " psyco.sourceforge.net/introduction.html
igouy
1
@ jase21 - "rend les codes python plus rapides que les compteurs C" - Sommes-nous supposés nous contenter de votre parole?
igouy
3
Le lien dans la réponse est cassé.
Basilevs
11

Compilé ou interprété peut être utile dans certains contextes, mais appliqué dans un sens technique, il s'agit d'une fausse dichotomie.

Un compilateur (au sens le plus large) est un traducteur . Il traduit le programme A en programme B et, pour une exécution ultérieure, à l'aide d'une machine M.

Un interprète (au sens le plus large) est un exécutant . C'est une machine M qui exécute le programme A. Bien que nous excluions généralement de cette définition les machines physiques (ou les machines non physiques qui agissent comme des machines physiques). Mais du point de vue théorique, cette distinction est quelque peu arbitraire.


Par exemple, prenez re.compile. Il "compile" une expression rationnelle en une forme intermédiaire, et cette forme intermédiaire est interprétée / évaluée / exécutée.


En fin de compte, cela dépend du niveau d'abstraction dont vous parlez et de ce qui compte pour vous. Les gens disent "compilé" ou "interprété" comme une description générale des parties les plus intéressantes du processus, mais en réalité, la plupart des programmes sont compilés (traduits) et interprétés (exécutés) d'une manière ou d'une autre.

CPython (l’implémentation la plus répandue du langage Python) est surtout intéressant pour l’exécution de code. Donc, CPython serait typiquement décrit comme interprété. Bien que ce soit une étiquette en vrac.

Paul Draper
la source
7

Le code de machine virtuelle est une version plus compacte du code source original (code en octets). Il doit encore être interprété par une machine virtuelle, puisqu'il ne s'agit pas d'un code machine. Il est cependant plus facile et plus rapide d’analyser que le code original écrit par un être humain.

Certaines machines virtuelles génèrent du code machine en interprétant le code de machine virtuelle pour la première fois (compilation juste à temps - JIT). Les invocations suivantes utiliseront directement ce code machine, ce qui accélérera l'exécution.

Autant que je sache, Ruby> = 1.9 utilise également une machine virtuelle telle que Python.

LennyProgrammers
la source
5

Le moteur d'exécution Python exécute un code d'objet personnalisé (code d'octet) sur une machine virtuelle.

Le processus de compilation convertit le code source en code objet.

Pour accélérer les choses, le code objet (ou le code d'octet, si vous préférez) est stocké sur le disque afin qu'il puisse être réutilisé lors de la prochaine exécution du programme.

ykombinator
la source