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à?
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 dejavac
code- octet moderne telle que réalisée par, disons , qui englobe le lexing, l’analyse et l’optimisation.Réponses:
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
.pyc
fichiers que vous voyez sont du code octet pour la machine virtuelle Python (similaire aux.class
fichiers 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.)
la source
Python tombera sous le code d'octet interprété.
.py
Le 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 .
la source
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.
la source
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.
la source
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.
la source