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 :
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?
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.)
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 .
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.
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).
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.