Depuis Java 1.6, la JVM peut exécuter une myriade de langages de programmation par dessus au lieu de simplement Java. Je comprends conceptuellement comment Java est exécuté sur la machine virtuelle Java, mais pas comment d'autres langages peuvent également s'exécuter dessus. Pour moi, tout cela ressemble à de la magie noire. Avez-vous des articles à me montrer pour que je puisse mieux comprendre comment tout cela s'imbrique?
12
Réponses:
La clé est le langage natif de la JVM: le bytecode Java. Tout langage peut être compilé en bytecode que la JVM comprend - tout ce dont vous avez besoin pour cela est un compilateur émettant du bytecode. Dès lors, il n'y a plus de différence du point de vue de la JVM. À tel point que vous pouvez prendre un fichier de classe Scala, Clojure, Jython etc. compilé et le décompiler (en utilisant par exemple JAD ) en code source Java d'aspect normal.
Vous pouvez trouver plus de détails à ce sujet dans les articles / discussions suivants:
Je n'ai pas connaissance de changements fondamentaux dans les JVM Java 5 ou 6 qui auraient rendu possible ou plus facile (le code compilé à partir) d'autres langages de s'exécuter dessus. À ma connaissance, la JVM 1.4 était plus ou moins aussi performante à cet égard que la JVM 6 (il peut cependant y avoir des différences; je ne suis pas un expert de la JVM). C'est juste que les gens ont commencé à développer d'autres langages et / ou des compilateurs de bytecode dans la première moitié de la décennie, et les résultats ont commencé à apparaître (et à devenir plus connus) vers 2006 lorsque Java 6 a été publié.
Cependant, toutes ces versions de JVM partagent certaines limitations: la JVM est typée de manière statique par nature et, jusqu'à la version 7, ne supportait pas les langages dynamiques. Cela a changé avec l'introduction de
invokedynamic
, une nouvelle instruction de bytecode qui permet l'appel de méthode en s'appuyant sur la vérification de type dynamique.la source
Une machine virtuelle, comme la JVM, est un programme qui accepte en entrée, généralement des fichiers, un ensemble d'instructions simples (qui sont généralement faciles à convertir en instructions CPU réelles), et les compile et les exécute en tant qu'instructions CPU natives (généralement en utilisant un compilateur à la demande tel que HotSpot ou JIT).
C'est essentiellement une couche d'abstraction. Il est généralement beaucoup plus facile de porter des implémentations de jeux d'instructions VM vers différentes architectures de processeur, en raison de plusieurs similitudes (telles que la pile). Il est également beaucoup plus facile de porter différents langages de programmation vers des instructions VM, car il est plus orienté vers les langages de programmation modernes que les instructions CPU primitives. De nombreuses machines virtuelles telles que la JVM et le CLR (.NET) contiennent des instructions pour appeler des méthodes virtuelles et créer des instances d'objet.
Prenons donc une langue par exemple. Appelez ça MyLanguage. Puisqu'il s'agit d'un langage de programmation, il se compile finalement en un ensemble de quelques instructions d'architecture CPU. Cela signifie donc que, étant donné un ensemble d'instructions de machine virtuelle flexible et compatible, il est également possible de compiler MyLanguage en un ensemble d'instructions de cette machine virtuelle.
Il y a toujours une question d'efficacité, car vous devrez peut-être pirater des solutions de contournement dans les jeux d'instructions VM que vous n'auriez pas à faire de manière native, mais c'est toujours possible.
la source
Une machine virtuelle Java est une machine de calcul complète de Turing (à l'exception de la mémoire limitée), et toute machine complète de Turing (physique ou virtuelle) peut exécuter n'importe quel langage de programmation (à l'exception de la mémoire, des performances et des limitations d'E / S physiques).
la source
Pour un instant, considérez la JVM comme un processeur avec son propre jeu d'instructions comme peut-être le x86. Le processeur peut exécuter, par exemple, du code C qui a été compilé dans son langage machine. En appliquant la même analogie à la JVM, d'autres langues peuvent être exécutées sur la JVM comme sur d'autres processeurs si ces langues sont compilées selon les instructions de la machine de la JVM. La JVM peut ensuite exécuter ces instructions pour la langue X.
la source