web-dev-qa-db-fra.com

Python est-il interprété, compilé ou les deux?

De ma compréhension:

Un interprété langage est un langage de haut niveau exécuté et exécuté par un interprète (un programme qui convertit le langage de haut niveau en code machine puis s’exécute) en déplacement; il traite le programme un peu à la fois.

Un compilé langage est un langage de haut niveau dont le code est d’abord converti en code machine par un compilateur (un programme qui convertit le langage de haut niveau en code machine), puis exécuté par un exécuteur (un autre programme le code).

Corrigez-moi si mes définitions sont fausses.

Revenant maintenant à Python, je suis un peu confus à ce sujet. Partout, vous apprenez que Python est un langage interprété, mais il est interprété selon un code intermédiaire (tel que byte-code ou IL) et not dans le code machine. Alors quel programme exécute ensuite le code IM? Aidez-moi à comprendre comment un script Python est géré et exécuté. 

144
Pankaj Upadhyay

Tout d'abord, interprété/compilé n'est pas une propriété du langage mais une propriété de la mise en œuvre. Pour la plupart des langages, la plupart sinon toutes les implémentations appartiennent à une seule catégorie. On peut donc enregistrer quelques mots disant que le langage est également interprété/compilé, mais cela reste une distinction importante, à la fois parce que cela facilite la compréhension et qu'il y a pas mal de langages. avec des implémentations utilisables des deux types (principalement dans le domaine des langages fonctionnels, voir Haskell et ML). En outre, il existe des interprètes C et des projets qui tentent de compiler un sous-ensemble de code Python en C ou C++ (et ultérieurement en code machine).

Deuxièmement, la compilation ne se limite pas à la compilation anticipée en code machine natif. Plus généralement, un compilateur est un programme qui convertit un programme d’un langage de programmation en un programme d’un autre langage de programmation (vous pouvez même avoir un compilateur avec le même langage d’entrée et de sortie si des transformations importantes sont appliquées). Et les compilateurs JIT compilent en code machine natif au moment de l’exécution, ce qui permet une vitesse très proche, voire meilleure, de la compilation à l’avance (en fonction du benchmark et de la qualité des implémentations comparées).

Mais pour arrêter de chiquer et répondre à la question que vous vouliez poser: Pratiquement (lisez: en utilisant une implémentation assez populaire et mature), Python est compilé. Non compilé à l'avance dans le code machine (c'est-à-dire "compilé" par la définition restreinte et fausse, mais hélas commune), "uniquement" compilé en bytecode , mais il reste une compilation avec au moins certains des avantages. Par exemple, l'instruction a = b.c() est compilée en un flux d'octets qui, lorsqu'il est "désassemblé", ressemble un peu à load 0 (b); load_str 'c'; get_attr; call_function 0; store 1 (a). Ceci est une simplification, il est en fait moins lisible et un peu plus bas - vous pouvez expérimenter avec la bibliothèque standard module dis et voir ce qui se passe réellement. L'interprétation est plus rapide que l'interprétation à partir d'une représentation de niveau supérieur.

Ce code est soit interprété (notez qu’il existe une différence, à la fois théorique et pratique, entre l’interprétation directe et la compilation initiale vers une représentation intermédiaire et l’interpréter), comme avec l’implémentation de référence (CPython), ou interprété et compilé pour code machine optimisé à l'exécution, comme avec PyPy .

178
user395760

Le processeur ne peut en effet comprendre que le code machine. Pour un programme interprété, le but ultime d'un interpréteur est d '"interpréter" le code du programme en code machine. Cependant, généralement, un langage interprété moderne n'interprète pas directement le code humain, car il est trop inefficace.

L'interpréteur Python lit d'abord le code humain et l'optimise en un code immédiat avant de l'interpréter en code machine. C'est pourquoi vous avez toujours besoin d'un autre programme pour exécuter un script Python. Contrairement à C++, vous pouvez exécuter directement l'exécutable. Par exemple, c:\Python27\python.exe ou/usr/bin/python.

24
Jeremy

La réponse dépend de quelle implémentation de python est utilisée. Si vous utilisez, disons CPython (implémentation standard de python) ou Jython (destiné à l'intégration avec le langage de programmation Java), il est d'abord traduit en bytecode python que vous utilisez, ce bycode est dirigé vers la machine virtuelle correspondante pour interprétation. PVM (machine virtuelle Python) pour CPython et JVM (machine virtuelle Java) pour Jython.

Mais disons que vous utilisez PyPy, qui est une autre implémentation standard de CPython. Il utiliserait un compilateur Just-In-Time

16
qualitytest

Selon python.org, il s'agit d'un interprète.

https://www.python.org/doc/essays/blurb/

Python est un langage de programmation interprété, orienté objet et de haut niveau ...

...

Comme il n'y a pas d'étape de compilation ...

... 

L'interpréteur Python et la vaste bibliothèque standard sont disponibles ...

...

Au lieu de cela, lorsque l'interprète découvre une erreur, il déclenche un exception. Lorsque le programme ne détecte pas l'exception, le fichier l'interprète imprime une trace de pile.

6
John S.

Si (vous connaissez Java) { 

Le code Python est converti en bytecode comme le fait Java.
Ce bytecode est exécuté à chaque fois que vous essayez d'y accéder.

} autre {  

Le code Python est initialement traduit en quelque chose appelé bytecode
c'est assez proche du langage machine, mais pas du code machine réel
donc chaque fois que nous y accédons ou l'exécutons, ce bytecode est exécuté à nouveau

}

3
Nabil Qadir

Presque, on peut dire que Python est un langage interprété. Mais nous utilisons une partie du processus de compilation ponctuelle en python pour convertir le code source complet en code octet comme le langage Java.

2
Hemant

Python en tant que langage de programmation ne dit pas si c'est un langage de programmation compilé ou interprété, mais seulement son implémentation. Les termes interprétés ou compilés ne sont pas une propriété du langage mais une propriété de la mise en œuvre. Le programme Python s’exécute directement à partir du code source. donc, Python tombera sous le code octet interprété. Le code source .py est d'abord compilé en code octet au format .pyc. Ce code d'octet peut être interprété (CPython officiel) ou compilé JIT (PyPy). Le code source Python (.py) peut être compilé en un 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.

0
Rajesh

Oui, c'est à la fois un langage compilé et interprété. Alors pourquoi l’appelons-nous généralement comme interprété languate?

voyez comment il est à la fois compilé et interprété?

_ {Tout d'abord, je tiens à dire que vous aimerez plus ma réponse si vous venez du monde Java.} _

En Java, le code source est d'abord converti en code d'octet via le compilateur javac puis dirigé vers leJVM(chargé de générer le code natif à des fins d'exécution). Maintenant, je veux vous montrer que nous appelons le langage Java comme langage compilé, car nous pouvons voir qu'il compile vraiment le code source et donne le fichier .class (rien que du bytecode) via:

javac Hello.Java -------> produit Hello.class fichier

Java Hello --------> Orientation du bytecode versJVMà des fins d'exécution

La même chose se produit avec python, c’est-à-dire que le code source est d'abord converti en bytecode via le compilateur, puis dirigé versPVM(chargé de générer le code natif à des fins d'exécution). Maintenant, je veux vous montrer que nous appelons généralement le langage Python en tant que langage interprété, car la compilation se fait en arrière-plan et lorsque nous exécutons le code python via:

python Hello.py -------> exécute directement le code et nous pouvons voir la sortie fournie si le code est syntaxiquement correct

@ python Hello.py on dirait qu’il s’exécute directement, mais en réalité, il génère d’abord le bytecode interprété par l’interprète pour produire le code natif à des fins d’exécution.

CPython - Assume la responsabilité de la compilation et de l'interprétation.

Regardez dans les lignes ci-dessous si vous avez besoin de plus de détails :

Comme je l’ai dit, CPython compile le code source mais la compilation proprement dite se fait à l’aide de cython puis l’interprétation se fait à l’aide de CPython

Parlons maintenant un peu du rôle du compilateur Just-In-Time en Java et en Python

Il existe un interpréteur Java dans la machine virtuelle Java qui interprète ligne par ligne le bytecode afin d’obtenir le code machine natif à des fins d’exécution, mais lorsque le bytecode Java est exécuté par un interpréteur, l’exécution sera toujours plus lente. Donc, quelle est la solution? la solution est Compilateur Just-In-Time qui produit le code natif pouvant être exécuté beaucoup plus rapidement que ce qui pourrait être interprété. Certains fournisseurs de machine virtuelle Java utilisent interpréteur Java et certains utilisent compilateur Just-In-Time . Référence: cliquez ici

Pour contourner l'interprète afin d'obtenir une exécution rapide, utilisez une autre implémentation de python ( PyPy ) au lieu de CPython . cliquez ici pour une autre implémentation de python incluant PyPy .

0
chirag soni

Pour les débutants

Python compile automatiquement votre script en code compilé, appelé code octet, avant de l'exécuter.

L'exécution d'un script n'est pas considérée comme une importation et aucun fichier .pyc ne sera créé.

Par exemple, si vous avez un fichier de script abc.py qui importe un autre module xyz.py, lorsque vous exécutez abc.py, xyz.pyc sera créé car xyz est importé, mais aucun fichier abc.pyc ne sera créé depuis abc. py n'est pas importé.

0
navaneeth kt

Le code python que vous écrivez est compilé en bytecode python, qui crée un fichier avec l'extension .pyc. Si compile, la question est à nouveau, pourquoi ne pas compiler un langage. 

Notez que ce n'est pas une compilation au sens traditionnel du mot. En règle générale, nous dirions que la compilation prend un langage de haut niveau et le convertit en code machine. Mais c'est une compilation de toutes sortes. Compilé dans le code intermédiaire pas dans le code machine (j'espère que vous l'avez maintenant).

De retour au processus d’exécution, votre bytecode, présent dans le fichier pyc, créé à l’étape de compilation, est ensuite exécuté par les machines virtuelles appropriées, dans notre cas, le CPython VM L’horodatage (appelé numéro magique) ) est utilisé pour valider si le fichier .py est modifié ou non, en fonction du nouveau fichier pyc créé. Si pyc est du code actuel, il saute simplement l'étape de compilation.

0
y durga prasad