web-dev-qa-db-fra.com

Java "machine virtuelle" vs "interprète" Python?

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 les codes d'octet; pourquoi appeler l'un une machine virtuelle et l'autre un interprète?

177
twils

Une machine virtuelle est un environnement informatique virtuel avec un ensemble spécifique d’instructions atomiques bien définies prises en charge indépendamment de tout langage spécifique et est généralement considéré comme un bac à sable en soi. Le VM est analogue à un jeu d'instructions d'une CPU spécifique et tend à fonctionner à un niveau plus fondamental avec des blocs de construction de base de telles instructions (ou codes d'octet) indépendants du suivant. Une instruction est exécutée de manière déterministe uniquement en fonction de l'état actuel de la machine virtuelle et ne dépend pas d'informations ailleurs dans le flux d'instructions à ce moment précis.

En revanche, un interprète est plus sophistiqué en ce sens qu’il est conçu pour analyser un flux de syntaxe d’une langue spécifique et d’une grammaire 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 séparément et savoir exactement quoi faire. Les jetons dans la langue ne peuvent pas être pris isolément comme ils peuvent l'être par rapport aux instructions (codes d'octet) d'une VM.

Un compilateur Java convertit le langage Java en un flux de code octet identique à celui d’un compilateur C convertissant les programmes en langage C en code Assembly. En revanche, un interprète ne convertit pas vraiment le programme en une forme intermédiaire bien définie, il prend simplement les actions du programme comme un processus d’interprétation de la source.

Un autre test de la différence entre a VM et un interprète consiste à déterminer si vous le considérez comme indépendant du langage. Ce que nous appelons Java VM n'est pas vraiment spécifique à Java. Vous pouvez créer un compilateur à partir d'autres langages, ce qui génère des codes d'octets pouvant être exécutés sur la machine virtuelle Java. D'autre part, je ne pense pas que nous songerions vraiment à "compiler" un autre langage que Python en Python pour l'interprétation par l'interpréteur Python.

En raison de la complexité du processus d’interprétation, il peut s’avérer relativement lent… analyser et identifier spécifiquement les jetons de langage, etc. et comprendre le contexte de la source pour pouvoir exécuter le processus d’exécution au sein de l’interprète. Pour aider à accélérer ces langages interprétés, c'est ici 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, c’est à partir d’une forme beaucoup moins lisible pour améliorer les performances. Cependant, la logique qui exécute ce formulaire n'est pas une machine virtuelle, car ces codes ne peuvent toujours pas être pris isolément - le contexte des jetons environnants est toujours important, ils se présentent maintenant sous une forme différente, plus efficace en informatique.

120
Tall Jeff

Une des raisons de la différence de terminologie est probablement que l’on pense normalement à alimenter l’interprète python en code source brut lisible par l’homme et à ne pas se préoccuper du bytecode et de tout le reste. 

En Java, vous devez explicitement compiler 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. 

56
Mr Fooz

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 faisant partie du système interpréteur.

Une caractéristique très importante d'une machine virtuelle est que le logiciel qui y est exécuté est limité aux ressources fournies par la machine virtuelle. Justement, il ne peut pas sortir de son monde virtuel. Pensez à une exécution sécurisée du code à distance, des applets Java. 

Dans le cas de python, si nous conservons les fichiers pyc, comme indiqué dans le commentaire de ce message, le mécanisme ressemblerait davantage à une machine virtuelle et ce code intermédiaire s'exécutera plus rapidement. sous une forme beaucoup plus conviviale. Si nous considérons tout cela dans sa globalité, PVM est la dernière étape de Python Interpreter.

En résumé, lorsque vous vous référez à Python Interpreter, cela signifie que nous le référons dans son ensemble, et lorsque nous parlons de PVM, cela signifie que nous ne parlons que d’une partie de Python Interpreter, un environnement d’exécution. Semblable à celui de Java, nous nous référons à différentes parties différentyl, JRE, JVM, JDK, etc.

Pour plus d'informations, Entrée Wikipedia: Interpreter , et Virtual Machine . Encore un autre ici . Ici vous pouvez trouver le Comparaison de machines virtuelles d’application . Cela aide à comprendre la différence entre les compilateurs, les interprètes et les ordinateurs virtuels.

14
Adeel Ansari

Le terme interprète est un terme hérité qui remonte aux langages de script Shell précédents. Alors que les "langages de script" ont évolué pour devenir des langages complets et que leurs plates-formes correspondantes sont devenues plus sophistiquées et mises en sandbox, la distinction entre une machine virtuelle et un interprète (au sens Python) est très petite, voire 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 distincte. Au-delà de cela, les différences entre l'interpréteur de Python (ou Perl ou Ruby) et la machine virtuelle Java sont principalement des détails d'implémentation. (On pourrait soutenir que Java est plus complet que Sandbox, mais les deux fournissent en fin de compte un accès à l'architecture sous-jacente via une interface C native.)

12
Daniel Naab

Il n'y a pas vraiment de différence entre eux, les gens ne font que suivre les conventions choisies par les créateurs.

9
Cody Brocious

N'oubliez pas que Python dispose de compilateurs JIT pour x86, ce qui complique encore le problème. (Voir psyco).

Une interprétation plus stricte d’un "langage interprété" ne devient utile que lorsqu’on aborde des problèmes de performances de la machine virtuelle, par exemple, comparé à Python. mots, le contexte est tout.

3
Arafangion

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 est compilé en bytecode.

0
Michael Tamillow

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 la machine virtuelle Java, la machine virtuelle est un logiciel contenant un interpréteur, des chargeurs de classe, un ramasse-miettes, un planificateur de threads, un compilateur JIT et bien d'autres choses.

comme vous pouvez le constater, l’interprète est une partie ou la machine virtuelle Java et toute la machine virtuelle Java 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, en revanche, n’est pas explicite, car Java parle de son processus de compilation et d’interprétation, de l’interprétation en perspective à l’utilisateur final, le seul mécanisme utilisé pour exécuter des programmes python

0
mightyWOZ