Java "Machine virtuelle" vs Python "Interpréteur" langage?


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

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

Author: Matthias Braun, 2009-01-14

9 answers

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 de tout langage spécifique et il est généralement considéré comme un bac à sable à lui-même. 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 des suivants. Une instruction s'exécute de manière déterministe uniquement sur la base état actuel de la machine virtuelle et ne dépend pas des 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 qui est 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 le 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 assembleur. Un interprète d'autre part ne convertit pas vraiment le programme en une forme intermédiaire bien définie, il prend simplement les actions du programme en tant que processus d'interprétation de la source.

Un autre test de la différence entre une machine virtuelle et un interprète est si vous pensez qu'il est indépendant de la langue. Ce que nous connaissons comme la machine virtuelle Java n'est pas vraiment spécifique à Java. Vous pouvez créer un compilateur à partir d'autres langages qui entraînent 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....analyser et identifier spécifiquement 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ète. Pour aider à accélérer de tels langages interprétés, c'est là que nous pouvons définir des formes intermédiaires de code source pré-analysé et 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 partir d'une forme beaucoup moins lisible par l'homme pour s'améliorer performance. Cependant, la logique exécutant ce formulaire n'est pas une machine virtuelle, car ces codes ne peuvent toujours pas être pris isolément - le contexte des jetons environnants importe toujours, ils sont maintenant sous une forme différente plus efficace sur l'ordinateur.

 113
Author: Tall Jeff, 2009-01-14 17:16:25

Dans cet article, "virtual machine" fait référence aux machines virtuelles de processus, pas à machines virtuelles système comme Qemu ou Virtualbox. Une machine virtuelle de processus est tout simplement un programme qui offre un environnement de programmation -- 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 "virtual machine" est un plus terme commun en Java et "interpréteur" est un terme plus commun dans Python a beaucoup à voir avec la différence majeure entre les deux langues: le typage statique (Java) vs typage dynamique (Python). Dans ce contexte, "type" fait référence à types de données primitives {[4] } types types qui suggèrent la taille de stockage en mémoire de données. La machine virtuelle Java l'a facile. Il nécessite que le programmeur spécifier le type de données primitif de chaque variable. Cela fournit suffisamment informations pour le bytecode Java non seulement à interpréter et à exécuter par le Machine virtuelle Java, mais même pour être compilé en instructions 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 la pensée en termes de données primitives 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 dynamiquement typés est un bon ajustement pour interfaces interactives. Il n'y a pas d'obstacle technique à la construction d'un interactif Interface Java, mais essayant d'écrire n'importe quel code typé statiquement 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 la vedette car elle exécute des programmes écrit dans une langue qui peut réellement ê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 saisissez les informations dans le bytecode. La machine virtuelle Java met Java dans un catégorie propre:

Langage de type statiquement interprété portable

La prochaine chose la plus proche 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 l'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. Le bytecode Java contient informations sur les types de données primitifs, contrairement au bytecode Python. 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 faire 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 éventuellement se décomposer en particules subatomiques (réelles opérations machine), la machine virtuelle Python a la tâche la plus complexe.

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

Les machines virtuelles de langages dynamiques comme Python implémentent certains idéalisés machine logique, et ne correspondent pas nécessairement très étroitement à un réel matériel physique. Le Java virtuel 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 doivent vraiment être comparés au Java Classe Integer. Le type de données primitif "int" de Java ne peut être comparé à rien dans le langage Python, car le langage Python manque simplement de cette couche de primitives, tout comme le bytecode Python.

Étant donné que les variables Java sont explicitement typées, on peut raisonnablement s'attendre à quelque chose commeJython 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'étaient pas conçus pour faire ça. Ils ont été conçus pour "scripting", c'est ce que l'on appelle la programmation dans un langage dynamique.

Chaque opération qui a lieu dans une machine virtuelle doit éventuellement 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 n'émet peut-être pas de nouvelles instructions de machine, mais elle exécute certainement ses propres routines encore et encore dans des séquences complexes. Java la machine virtuelle, la machine virtuelle Python et toutes les autres machines virtuelles à usage général sont égales dans le sens où elles peuvent être incitées à effectuer n'importe quelle logique que vous pouvez imaginer, mais elles sont différentes en termes de tâches qu'elles assument 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 où il le pense pouvez compiler quelques lignes de code -- principalement des boucles où il pense 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, cependant, de peur que vous ne retiriez le type sous les pieds de Psyco. Pysco, cependant, sait généralement se replier sur la machine virtuelle ordinaire si ce n'est pas le cas complètement confiant que 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 mettre tout cela en perspective, considérez ceci: un programme Python exécuté par un interpréteur/machine virtuelle Python implémenté 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.

Lien permanent

 128
Author: pooryorick, 2009-11-14 04:55:15

Probablement une des raisons de la terminologie différente est que l'on pense normalement à alimenter l'interpréteur python en code source brut lisible par l'homme et à ne pas se soucier du bytecode et de 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
Author: 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 est que le logiciel exécuté à 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 de code distant, Applets Java.

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

La ligne de fond est, quand référez-vous à 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 simplement d'une partie de l'interpréteur Python, un environnement d'exécution. Semblable à celui de Java, nous référons différentes parties differentyl, JRE, JVM, JDK, etc.

De plus, l'Entrée de Wikipedia: Interprète, et Virtual Machine. Encore un autre ici. Ici vous pouvez trouver laComparaison des machines virtuelles d'application . Il aide à comprendre la différence entre les compilateurs, les interprètes et les machines virtuelles.

 14
Author: Adeel Ansari, 2015-05-29 11:15:40

L'interpréteur de terme 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 sandbox, la distinction entre une machine virtuelle et un interpréteur (au sens Python) est très petite ou inexistante.

L'interpréteur Python fonctionne toujours de la même manière qu'un script shell, dans le sens où il peut être exécuté sans une é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 entièrement sandbox que Python, mais les deux fournissent finalement un accès à l'architecture sous-jacente via une interface C native.)

 12
Author: Daniel Naab, 2009-01-14 04:27:47

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

 8
Author: 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 car c'est un langage interprété, contrairement à Python - en d'autres termes, le contexte est tout.

 3
Author: 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 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 en tant que java sur son processus de compilation et d'interprétation, à partir 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
Author: mightyWOZ, 2016-10-01 09:06:40

Non, ils n'interprètent pas tous les deux le code 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
Author: Michael Tamillow, 2018-03-12 17:46:44