Dans ce billet, le terme "machine virtuelle" fait référence aux machines virtuelles de processus, et non aux machines virtuelles de système comme Qemu ou Virtualbox. 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 une machine virtuelle ainsi qu'un interpréteur. virtuelle et d'un interprète. La raison pour laquelle "machine virtuelle" est un terme plus est un terme plus courant en Java et que "interprète" est un terme plus courant en Python a beaucoup a beaucoup à voir avec la différence majeure entre les deux langages : le typage statique (Java) et le typage dynamique (Python). Dans ce contexte, le terme "type" fait référence à types de données primitives -- types qui suggèrent la taille de stockage en mémoire des données. La machine virtuelle Java a la tâche facile. Elle exige du programmeur qu'il spécifie le type de données primitif de chaque variable. Cela fournit suffisamment informations suffisantes pour que le bytecode Java soit interprété et exécuté par la machine virtuelle Java. machine virtuelle Java, mais aussi pour être compilé en instructions machine . La machine virtuelle Python est plus complexe dans le sens où elle prend en charge la tâche supplémentaire qui consiste à faire une pause avant l'exécution de chaque opération afin de déterminer si la machine virtuelle a bien été exécutée. tâche supplémentaire qui consiste à faire une pause avant l'exécution de chaque opération pour déterminer les types de données primitifs de chaque variable ou structure de données impliquée dans l'opération. opération. Python libère le programmeur de la nécessité de penser en termes de types de données primitives. et permet d'exprimer les opérations à un niveau supérieur. Le prix de cette 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 la syntaxe relativement concise des langages à typage dynamique convient bien aux interfaces interactives. interfaces interactives. Il n'y a pas de barrière technique à la construction d'une interface interactive en Java. interactive en Java, mais essayer d'écrire un code statiquement typé de manière interactive serait fastidieux, c'est pourquoi il n'est pas fait de cette façon.
Dans le monde Java, la machine virtuelle vole la vedette parce qu'elle exécute des programmes écrits dans un langage qui peut être compilé en instructions machine, et le résultat est la vitesse et l'efficacité des ressources. Le bytecode Java peut être exécuté par la machine virtuelle Java avec des performances proches de celles des programmes compilés. compilés, relativement parlant. Cela est dû à la présence d'informations sur les types de données primitives dans le bytecode. de données primitives dans le bytecode. La machine virtuelle Java place Java dans une catégorie à part :
langage interprété portable à typage statique
Ce qui s'en rapproche le plus est LLVM, mais LLVM opère à un niveau différent :
langage assembleur interprété portable
Le terme " bytecode " est utilisé à la fois en Java et en Python, mais tous les bytecodes ne sont pas égaux. Le bytecode est simplement le terme générique pour les langages intermédiaires utilisés par les ordinateurs. utilisés par les compilateurs/interprètes. Même les compilateurs C comme gcc utilisent un code intermédiaire langue (ou plusieurs) pour faire le travail. Le bytecode Java contient des informations sur les types de données primitifs, alors que le bytecode Python n'en contient pas. Sur A cet égard, la machine virtuelle Python (et Bash, Perl, Ruby, etc.) est vraiment plus lente que la machine virtuelle Java. fondamentalement plus lente que la machine virtuelle Java, ou plutôt, elle a tout simplement plus de travail à faire. Il est utile de considérer quelles informations sont contenues dans les différents formats de bytecode :
-
llvm : registres du processeur
-
Java : types de données primitives
-
Python : types définis par l'utilisateur
Pour faire une analogie avec le monde réel : LLVM travaille avec des atomes, la machine virtuelle Java travaille avec des molécules, et la machine virtuelle Python travaille avec des matériaux. Puisque tout doit finalement se décomposer en particules subatomiques (opérations de la machine réelle), la machine virtuelle Python a la tâche la plus complexe. opérations de la machine), la machine virtuelle Python a la tâche la plus complexe.
Les interprètes/compilateurs de langages à typage statique n'ont tout simplement pas le même bagages que les interprètes/compilateurs de langages à typage dynamique. Les programmeurs des langages à typage statique doivent prendre le relais, pour lesquels les performances en sont le prix. Cependant, tout comme toutes les fonctions non déterministes sont déterministes, tous les langages dynamiquement typés sont secrètement statiques. statiquement typés. Les différences de performances entre les deux familles de langages devraient donc se stabiliser au moment où Python changera son nom en HAL 9000.
Les machines virtuelles des langages dynamiques comme Python implémentent une machine logique idéalisée, et ne correspondent pas nécessairement à un matériel physique réel. matériel physique réel. La machine virtuelle Java, par contre, est plus similaire en termes de à un compilateur C classique, sauf qu'au lieu d'émettre des instructions de machine des instructions machine, elle exécute des routines intégrées. En Python, un nombre entier est un objet Python avec un tas d'attributs et de méthodes qui lui sont attachés. En Java, un int est un nombre désigné de bits, généralement 32. Ce n'est pas vraiment une comparaison équitable. Les entiers Python doivent être comparés à la classe Java Integer de Java. Le type de données primitif "int" de Java ne peut pas être comparé à quoi que ce soit dans le langage Python. dans le langage Python, parce que le langage Python n'a pas cette couche de primitives. primitives, tout comme le bytecode Python.
Comme les variables Java sont explicitement typées, on peut raisonnablement s'attendre à ce que quelque chose comme Jython pour être dans la même fourchette que cPython . D'autre part, une machine virtuelle Java implémentée en Python est presque garantie d'être plus lente que la boue. Et ne vous attendez pas à ce que Ruby, Perl, etc, s'en sortent mieux. Ils n'ont pas été conçus pour cela. Ils ont été conçus pour "scripting", ce que l'on appelle la programmation dans un langage dynamique.
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 suffisamment générales pour exécuter toute combinaison d'opérations logiques. Une machine virtuelle n'émet peut-être pas de nouvelles instructions machine, mais elle exécute certainement ses propres routines encore et encore dans des séquences arbitrairement complexes. La machine virtuelle Java, la machine virtuelle Python et toutes les autres machines virtuelles à usage général sont identiques dans le sens où elles peuvent être amenées à exécuter n'importe quelle logique dont vous pouvez rêver, mais elles sont différentes en termes de tâches qu'elles prennent en charge et de tâches qu'elles laissent au programmeur.
Psyco for Python n'est pas une machine virtuelle Python à part entière, mais un compilateur juste-à-temps qui détourne la machine virtuelle Python normale à des endroits où elle pense que le programme est prêt à fonctionner. juste à temps qui détourne la machine virtuelle Python normale aux endroits où il pense pouvoir compiler quelques lignes de code -- principalement des boucles où il pense que le type primitif primitif d'une variable restera constant même si la valeur change à chaque itération. chaque itération. Dans ce cas, il peut renoncer à une partie de la détermination incessante du type de la machine virtuelle régulière. de la machine virtuelle ordinaire. Vous devez être un peu prudent, Cependant, vous devez être un peu prudent, de peur de retirer le type sous les pieds de Psyco. Pysco, cependant, sait généralement qu'il faut se rabattre sur la machine virtuelle régulière s'il n'est pas n'est pas complètement sûr que le type ne changera pas.
La morale de l'histoire est que l'information sur les types de données primitives est 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 et s'exécutant sur un interpréteur/machine virtuelle Java machine virtuelle implémentée en LLVM fonctionnant sur une machine virtuelle qemu fonctionnant sur un iPhone. s'exécutant sur un iPhone.
permalien