Java "machine virtuelle" vs langage "interpréteur" Python?

Il semble rare de lire une "machine virtuelle" Python alors qu'en Java "machine virtuelle" est utilisé tout le temps.

Les deux interprètent des codes d'octets; pourquoi appeler l'un une machine virtuelle et l'autre un interpréteur?

164
demandé sur Matthias Braun 2009-01-14 06:39:32

9 réponses

Une machine virtuelle est un environnement informatique virtuel avec un ensemble spécifique d'instructions atomiques bien définies qui sont prises en charge indépendamment d'un langage spécifique et il est généralement considéré comme un bac à sable en soi. La machine virtuelle est analogue à un jeu d'instructions d'un processeur spécifique et a tendance à fonctionner à un niveau plus fondamental avec des blocs de construction très basiques de telles instructions (ou codes d'octets) qui sont indépendants de la suivante. Une instruction s'exécute de manière déterministe basée uniquement sur l'état actuel de la machine virtuelle et ne dépend pas d'informations ailleurs dans le flux d'instructions à ce moment-là.

Un interpréteur d'autre part est plus sophistiqué en ce sens qu'il est conçu pour analyser un flux de syntaxe d'un langage spécifique et d'un grammeur spécifique qui doit être décodé dans le contexte des jetons environnants. Vous ne pouvez pas regarder chaque octet ou même chaque ligne isolément et savoir exactement quoi faire ensuite. Les jetons dans la langue ne peuvent pas être pris isolément comme ils peuvent par rapport aux instructions (codes d'octets) d'une machine virtuelle.

Un compilateur Java convertit le langage Java en un flux de code octet pas différent d'un compilateur C convertit les programmes de langage C en code d'assemblage. Un interpréteur d'autre part ne convertit pas vraiment le programme en une forme intermédiaire bien définie, il prend simplement les actions du programme comme une question du processus d'interprétation de la source.

Un autre test de la différence entre une VM et un interprète est de savoir si vous pensez qu'il est indépendant de la langue. Ce que nous savons comme la machine virtuelle Java n'est pas vraiment spécifique à Java. Vous pouvez créer un compilateur à partir d'autres langages qui aboutissent à des codes d'octets pouvant être exécutés sur la JVM. D'un autre côté, Je ne pense pas que nous penserions vraiment à "compiler" un autre langage que Python en Python pour l'interprétation par l'interpréteur Python.

En raison de la sophistication du processus d'interprétation, cela peut être relativement lent processus....spécifiquement analyser et identifier les jetons de langue, etc. et comprendre le contexte de la source pour pouvoir entreprendre le processus d'exécution au sein de l'interpréteur. Pour aider à accélérer ces langages interprétés, c'est là que nous pouvons définir des formes intermédiaires de code source pré-analysé, pré-tokenisé qui est plus facilement interprété directement. Ce type de forme binaire est toujours interprété au moment de l'exécution, il ne fait que commencer à partir d'une forme beaucoup moins lisible par l'homme à améliorer performance. Cependant, la logique exécutant cette forme n'est pas une machine virtuelle, car ces codes ne peuvent toujours pas être pris isolément - le contexte des jetons environnants compte toujours, ils sont maintenant sous une forme différente plus efficace.

113
répondu Tall Jeff 2009-01-14 17:16:25

Dans ce post, "machine virtuelle" fait référence à traiter les machines virtuelles, pas à machines virtuelles système comme Qemu ou Virtualbox. Une machine virtuelle de processus est simplement un programme qui fournit un environnement de programmation général -- un programme qui peut être programmé.

Java a un interpréteur ainsi qu'une machine virtuelle, et Python a un de la machine ainsi que d'un interprète. La raison "machine virtuelle" est un plus terme commun en Java et "interpréteur" est un terme plus commun dans Python a beaucoup a voir avec la différence majeure entre les deux langues: typage statique (Java) vs typage dynamique (Python). Dans ce contexte," type " fait référence à types de données primitifs -- types qui suggèrent la taille de stockage en mémoire de données. La machine virtuelle Java a facile. Cela nécessite que le programmeur spécifiez le type de données primitives de chaque variable. Cela fournit suffisamment informations pour Java bytecode non seulement à interpréter et à exécuter par le Machine virtuelle Java, mais même pour être compilé dans les instructions de la machine . La machine virtuelle Python est plus complexe dans le sens où elle prend le tâche supplémentaire de pause avant l'exécution de chaque opération pour déterminer les types de données primitifs pour chaque variable ou structure de données opération. Python libère le programmeur de penser en termes de données primitifs types, et permet d'exprimer les opérations à un niveau supérieur. Le prix de cette liberté est la performance. "Interprète" est le terme préféré pour Python parce qu'il doit faire une pause pour inspecter les types de données, et aussi parce que le la syntaxe relativement concise des langages typés dynamiquement est un bon ajustement pour interfaces interactives. Il n'y a pas d'obstacle technique à la construction d'un Interface Java, mais en essayant d'écrire un code statiquement typé de manière interactive ce serait fastidieux, donc ce n'est tout simplement pas fait de cette façon.

Dans le monde Java, la machine virtuelle vole le spectacle car elle exécute des programmes écrit dans une langue qui peut effectivement être compilé dans les instructions de la machine, et le résultat est la rapidité et l'efficacité des ressources. Le bytecode Java peut être exécuté par la machine virtuelle Java avec des performances approchant celles de compilé programmes, relativement parlant. Cela est dû à la présence de données primitifs tapez des informations dans le bytecode. La machine virtuelle Java met Java dans un catégorie propre:

Portable interprété statiquement typé langue

La chose la plus proche suivante est LLVM, mais LLVM fonctionne à un niveau différent:

Langage d'assemblage interprété Portable

Le terme "bytecode" est utilisé à la fois en Java et en Python, mais tous les bytecodes ne le sont pas créés égaux. bytecode est juste le terme générique pour les langages intermédiaires utilisé par les compilateurs / interprètes. Même les compilateurs C comme gcc utilisent un intermédiaire langue (ou plusieurs) pour faire le travail. Java bytecode contient informations sur les types de données primitifs, alors que le bytecode Python ne le fait pas. Dans ce respect, le Python (et Bash, Perl, Ruby, etc.) la machine virtuelle est vraiment fondamentalement plus lent que la machine virtuelle Java, ou plutôt, il a simplement plus de travail à faire. Il est utile de considérer quelles informations sont contenues dans différents formats de bytecode:

  • llvm: registres du cpu
  • Java: types de données primitives
  • Python: types définis par l'utilisateur

Pour dessiner une analogie du monde réel: LLVM fonctionne avec des atomes, Le Java la machine virtuelle fonctionne avec des molécules, et la machine virtuelle Python fonctionne avec des matériaux. Puisque tout doit finalement se décomposer en particules subatomiques (réelles opérations de la machine), la machine virtuelle Python a la tâche la plus complexe.

Intepreters / compilateurs de langages statiquement typés n'ont tout simplement pas la même chose bagages que les interprètes / compilateurs de langages typés dynamiquement ont. Les programmeurs de langages statiquement typés doivent prendre le relais, pour lequel le paiement est performance. Cependant, comme toutes les fonctions non déterministes sont secrètement déterministe, donc tous les langages typés dynamiquement sont secrètement statiquement typé. Différences de Performance entre les deux familles linguistiques devrait donc se stabiliser au moment où Python change de nom pour HAL 9000.

Les machines virtuelles de langages dynamiques comme Python implémentent des machine logique, et ne correspondent pas nécessairement très étroitement à tout réel matériel physique. Le virtuel Java machine, en revanche, est plus similaire dans fonctionnalité à un compilateur C classique, sauf qu'au lieu d'émettre instructions de la machine, il exécute des routines intégrées. En Python, un entier est un objet Python avec un tas d'attributs et de méthodes qui lui sont attachés. Dans Java, un int est un nombre désigné de bits, généralement 32. Ce n'est pas vraiment un comparaison équitable. Les entiers Python devraient vraiment être comparés à Java Classe Integer. Le type de données primitif "int" de Java ne peut être comparé à rien dans le langage Python, parce que le langage Python n'a tout simplement pas cette couche de primitives, et le bytecode Python aussi.

Étant donné que les variables Java sont explicitement typées, on peut raisonnablement s'attendre à quelque chose comme Jython performance pour être dans le même stade que disponible. D'autre part, une machine virtuelle Java implémentée en Python est presque garanti d'être plus lent que la boue. Et ne vous attendez pas à Ruby, Perl, etc., au prix mieux. Ils n'ont pas été conçus pour faire ça. Ils ont été conçus pour "scripting", qui est ce que la programmation dans un langage dynamique est appelée.

Chaque opération qui a lieu dans une machine virtuelle doit finalement toucher du matériel réel. Les machines virtuelles contiennent des routines pré-compilées qui sont assez générales pour exécuter n'importe quelle combinaison d'opérations logiques. Une machine virtuelle peut ne pas émettre de nouvelles instructions de machine, mais elle exécute certainement ses propres routines encore et encore dans des séquences arbirtrarily complexes. Java la machine virtuelle, la machine virtuelle Python et toutes les autres machines virtuelles à usage général sont égales en ce sens qu'elles peuvent être incitées à exécuter n'importe quelle logique, mais elles sont différentes en termes de tâches et de tâches qu'elles laissent au programmeur.

Psyco pour Python n'est pas une machine virtuelle Python complète, mais un juste-à-temps compilateur qui détourne la machine virtuelle Python régulière aux points qu'il pense pouvez compiler quelques lignes de code -- principalement des boucles où il pense que le primitif le type d'une variable restera constant même si la valeur change avec à chaque itération. Dans ce cas, il peut renoncer à une partie du type incessant détermination de la machine virtuelle régulière. Vous devez être un peu prudent, bien que, de peur que vous tirez le type sous les pieds de Psyco. Pysco, cependant, habituellement sait juste revenir à la machine virtuelle régulière si ce n'est pas le cas complètement confiant le type ne changera pas.

La morale de l'histoire est que les informations de type de données primitives sont vraiment utile pour un compilateur / machine virtuelle.

Enfin, pour tout mettre en perspective, considérez ceci: un programme Python exécuté par un interpréteur Python / machine virtuelle implémentée en Java s'exécutant sur un Java interpréteur / machine virtuelle implémenté dans LLVM s'exécutant dans un qemu virtuel Machine fonctionnant sur un iPhone.

Permalien

128
répondu pooryorick 2009-11-14 04:55:15

Probablement une raison pour la terminologie différente est que l'on pense normalement à alimenter le code source RAW lisible par l'homme de l'interpréteur python et ne pas se soucier du bytecode et tout cela.

En Java, vous devez compiler explicitement en bytecode, puis exécuter uniquement le bytecode, pas le code source sur la machine virtuelle.

Même si Python utilise une machine virtuelle sous les couvertures, du point de vue de l'utilisateur, on peut ignorer ce détail la plupart du temps.

54
répondu Mr Fooz 2009-01-14 03:56:21

Interpreter , traduit le code source en une représentation intermédiaire efficace (code) et l'exécute immédiatement.

Virtual Machine , exécute explicitement le code pré-compilé stocké construit par un compilateur qui fait partie du système d'interpréteur.

Une caractéristique très importante d'une machine virtuelle, c'est que le logiciel s'exécute à l'intérieur, est limité aux ressources fournies par la machine virtuelle. Précisément, il ne peut pas sortir de son monde virtuel. Pensez à l'exécution sécurisée du code distant, des Applets Java.

Dans le cas de python, Si nous conservons les fichiers pyc, comme mentionné dans le commentaire de ce post, alors le mécanisme deviendrait plus comme une machine virtuelle, et ce bytecode s'exécuterait plus rapidement-il serait toujours interprété mais à partir d'une forme beaucoup plus conviviale. Si nous regardons cela dans son ensemble, PVM est une dernière étape de L'interpréteur Python.

La ligne du bas est, quand référez L'interpréteur Python, cela signifie que nous le référons comme un entier, et quand nous disons PVM, cela signifie que nous parlons juste d'une partie de L'interpréteur Python, un environnement d'exécution. Similaire à celle de Java, nous référons différentes parties differentyl, JRE, JVM, JDK, etc.

Pour plus, Entrée Wikipédia: interprète , et machine virtuelle . Encore un ici . Vous trouverez ici la comparaison des machines virtuelles d'application . Il aide à comprendre la différence entre les compilateurs, les interprètes et les machines virtuelles.

14
répondu Adeel Ansari 2015-05-29 11:15:40

Le terme interpréteur est un terme hérité datant des langages de script shell antérieurs. Comme les "langages de script" ont évolué vers des langages complets et que leurs plates-formes correspondantes sont devenues plus sophistiquées et en sandbox, la distinction entre une machine virtuelle et un interpréteur (au sens Python) est très faible ou inexistante.

L'interpréteur Python fonctionne toujours de la même manière qu'un script shell, en ce sens qu'il peut être exécuté sans étape de compilation. Au-delà de cela, les différences entre l'interpréteur de Python (ou Perl ou Ruby) et la machine virtuelle de Java sont principalement des détails d'implémentation. (On pourrait soutenir que Java est plus complètement Sandbox que Python, mais les deux fournissent finalement un accès à l'architecture sous-jacente via une interface C native.)

12
répondu Daniel Naab 2009-01-14 04:27:47

Il n'y a pas de différence réelle entre eux, les gens suivent simplement les conventions que les créateurs ont choisies.

8
répondu Cody Brocious 2009-01-14 03:41:23

N'oubliez pas que Python a des compilateurs JIT disponibles pour x86, ce qui confond davantage le problème. (Voir psyco).

Une interprétation plus stricte d'un 'langage interprété' ne devient utile que lors de la discussion des problèmes de performance de la machine virtuelle, par exemple, par rapport à Python, Ruby était (est?), considéré comme plus lent parce que c'est un langage interprété, contrairement à Python - en d'autres termes, le contexte est tout.

3
répondu Arafangion 2009-01-14 04:36:21

Tout d'abord, vous devez comprendre que la programmation ou l'informatique en général ne sont pas des mathématiques et que nous n'avons pas de définitions rigoureuses pour la plupart des termes que nous utilisons souvent.

Maintenant à votre question :

Qu'est Ce qu'un Interprète (en informatique)

Il traduit le code source par la plus petite unité exécutable, puis exécute cette unité.

Qu'est Ce qu'une machine virtuelle

Dans le cas de JVM, la machine virtuelle est un logiciel qui contient un interpréteur, des chargeurs de classe, un garbage collector , un planificateur de threads, un compilateur JIT et bien d'autres choses.

Comme vous pouvez le voir, l'interpréteur est une partie ou une JVM et la JVM entière ne peut pas être appelée un interpréteur car elle contient de nombreux autres composants.

Pourquoi utiliser le mot "Interprète" quand on parle de python

Avec java, la partie compilation est explicite. python d'autre part n'est pas explicite comme java sur son processus de compilation et d'interprétation, de la fin l'interprétation de la perspective de l'utilisateur est le seul mécanisme utilisé pour exécuter des programmes python

0
répondu mightyWOZ 2016-10-01 09:06:40

Non, ils n'interprètent pas tous les deux le code d'octet.

Python n'interprète le bytecode que si vous utilisez pypy. Sinon, il est compilé en C et interprété à ce niveau.

Java compile en bytecode.

0
répondu Michael Tamillow 2018-03-12 17:46:44