web-dev-qa-db-fra.com

Python interprété ou compilé?

C'est juste une question que j'ai eue 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ète au moment de l'exécution.
Au contraire [~ # ~] c [~ # ~] est un langage compilé, car il faut compiler le code source d'abord en fonction de la machine, puis exécutez. Il en résulte une exécution beaucoup plus rapide.

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 se fasse dans un python Shell ou Django . Après l'importation, je modifie un peu le code et exécute à nouveau les fonctions importées pour constater qu'il exécute toujours l'ancien code. Cela suggère que les fichiers * .pyc sont compilés python fichiers similaires à l'exécutable. créé après la compilation d'un fichier C, bien que je ne puisse pas exécuter le fichier * .pyc directement.
  • Lorsque le fichier python (somefile.py) est exécuté directement (./somefile.py ou python somefile.py) aucun fichier .pyc n'est créé et le fichier le code est exécuté tel qu'il indique un comportement interprété.

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

Alors, quel type de langue dois-je 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 Interpreted Languages de wiki, il est répertorié comme un langage compilé en Virtual Machine Code, qu'est-ce que cela signifie?

82
crodjer

Il convient de noter que les langages ne sont pas interprétés ou compilés, mais plutôt les implémentations de langage interpréter ou compiler du code. Vous avez noté que Ruby est un "langage interprété", mais vous pouvez compiler Ruby à la MacRuby , donc ce n'est pas toujours un langage interprété.

À peu près chaque Python consiste en un interpréteur (plutôt qu'en un compilateur). Le .pyc les fichiers que vous voyez sont du code octet pour la machine virtuelle Python (similaire à .class des dossiers). Ils ne sont pas les mêmes que le 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 Python octet en code machine natif.

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

83
mipadi

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

Pour des comparaisons de vitesse de diverses implémentations de langages, vous pouvez essayer ici .

36
aufather

Compilé vs interprété peut être utile dans certains contextes, mais lorsqu'il est appliqué dans un sens technique, c'est une fausse dichotomie.

Un compilateur (au sens large) est un traducteur . Il traduit le programme A en programme B et pour une exécution future, il utilise une machine M.

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


Par exemple, prenez re.compile . Il "compile" une expression régulière 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 vous intéresse. Les gens disent "compilé" ou "interprété" comme de larges descriptions 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 populaire du langage Python) est principalement intéressant pour l'exécution de code. Donc CPython serait généralement décrit comme interprété. Bien qu'il s'agisse d'une étiquette lâche.

11
Paul Draper

Le code de la machine virtuelle est une version plus compacte du code source d'origine (code octet). Il doit encore être interprété par une machine virtuelle, car il ne s'agit pas d'un code machine. Cependant, il est plus facile et plus rapide à analyser que le code original écrit par un être humain.

Certaines machines virtuelles génèrent du code machine lors de la première interprétation du code machine virtuelle (compilation juste à temps - JIT). Les appels suivants utiliseront directement ce code machine, ce qui accélérera l'exécution.

Autant que je sache Ruby> = 1.9 utilise une machine virtuelle comme Python aussi).

7
LennyProgrammers

L'exécution Python exécute du code objet personnalisé (code 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'octets, si vous préférez) est stocké sur le disque, il peut donc être réutilisé lors de la prochaine exécution du programme.

5
ykombinator