87 votes

La JVM est-elle un compilateur ou un interprète ?

J'ai une question très basique sur la JVM : est-ce un compilateur ou un interprète ?

S'il s'agit d'un interprète, qu'en est-il du compilateur JIT qui existe à l'intérieur de la JVM ?
Si ce n'est ni l'un ni l'autre, alors qu'est-ce que la JVM ? (Je ne veux pas de la définition de base de la JVM qui consiste à convertir le code d'octet en code spécifique à la machine, etc.)

18 votes

La JVM est une machine virtuelle. Le bytcode entre, les effets observables du programme se produisent. Tout le reste est un détail d'implémentation.

1 votes

Oui, il n'y a pas "la" JVM, il y a plusieurs implémentations de la spécification.

0 votes

@delnan, s'il vous plaît, écrivez cela comme une réponse. J'ai vraiment envie d'upvoter une telle réponse.

178voto

Srikanth Bandaru Points 2435

Tout d'abord, ayons une idée claire des termes suivants

Javac est un compilateur Java -- Compile votre code Java en Bytecode

JVM est la Machine Virtuelle Java -- Exécute/ Interprète/ traduit le Bytecode en Code machine natif

JIT est Just In Time Compiler -- Compile la séquence d'instruction bytecode donnée en code machine à temps de fonctionnement avant de l'exécuter en mode natif. Son objectif principal est d'effectuer des optimisations lourdes en termes de performances.

Alors maintenant, trouvons des réponses à vos questions

1) JVM: is it a compiler or an interpreter? -- Ans : Interprète

2) what about JIT compiler that exist inside the JVM? -- Ans : Si vous avez lu cette réponse entièrement, vous le savez probablement maintenant.

3) what exactly is the JVM? -- Ans :

  • La JVM est une plate-forme virtuelle qui réside dans votre mémoire vive.
  • Son composant, Chargeur de classe charge le .class dans la RAM
  • El Code de l'octet Vérificateur de la JVM vérifie s'il y a des violations de restrictions d'accès dans votre code. (C'est l'une des principales raisons pour lesquelles Java est sécurisé).
  • Ensuite, le Moteur d'exécution Le composant convertit le bytecode en code machine exécutable.

J'espère que cela vous a aidé

0 votes

Vous dites que la JVM traduit le bytecode en code machine natif. Je ne suis pas sûr que le terme "traduction" soit correct ici.

0 votes

J'ai beaucoup apprécié. Vous avez presque levé mon doute sur la différence entre la compilation et l'interprétation, le code octet et le code machine. Votre réponse m'a dit que le code octet est converti en code machine par un interprète et que le compilateur convertit le code source en bytecode.

3 votes

Pouvez-vous également me dire ce qu'est un code natif ? Est-ce que cela signifie le code machine ? J'essaie d'apprendre tout ce processus de compilation et d'interprétation mais ces termes intermédiaires sont très déroutants.

32voto

Mark Peters Points 42201

C'est un peu des deux, mais aucun des deux au sens traditionnel du terme.

Les JVM modernes prennent le bytecode et le compilent en code natif dès qu'elles en ont besoin. Dans ce contexte, "JIT" signifie "just in time". Elle agit comme un interprète de l'extérieur, mais en réalité, en coulisse, elle compile en code machine.

La JVM ne doit pas être confondue avec le compilateur Java, qui compile le code source en bytecode. Il n'est donc pas utile de la considérer comme "un compilateur", mais plutôt de savoir qu'en arrière-plan, elle effectue une certaine compilation.

8 votes

@NaeemShah : Je suis flatté que vous ayez suffisamment aimé cette réponse pour la copier presque mot pour mot dans un article de blog sous votre propre nom. Et vous avez le droit de le faire, mais selon le schéma de licence de StackOverflow, vous êtes légalement tenu de mentionner la source ici, et vous devez donner une licence à votre article de blog sous la même licence. Voir le pied de page de ce site, qui renvoie à la licence suivante : creativecommons.org/licenses/by-sa/3.0 . Voir aussi cet article de blog : blog.stackoverflow.com/2009/06/attribution-required

9voto

cubuspl42 Points 1293

Comme @delnan déjà indiqué dans la section des commentaires, c'est ni .

JVM est une machine abstraite fonctionnant bytecode Java .

La JVM a plusieurs implémentations :

  • HotSpot (interprète + JIT compilateur)
  • Dalvik (interpréteur + compilateur JIT)
  • ART ( AOT compilateur + compilateur JIT)
  • GCJ (compilateur AOT)
  • JamVM (interprète)

...et beaucoup d'autres .

La plupart des autres réponses, lorsqu'elles parlent de JVM, se réfèrent soit à HotSpot, soit à la JVM. un mélange des approches ci-dessus pour implémenter la JVM.

1 votes

ART est également un interprète : "Android peut en fait exécuter le .dex directement par interprétation ou par compilation Just-In-Time (JIT)..." ( source.Android.com/devices/tech/ota/ab/ )

5voto

Paul Cager Points 1577

C'est les deux. Il commence par interpréter le bytecode et peut (s'il décide que cela en vaut la peine) compiler ce bytecode en code machine natif.

0 votes

Vous faites probablement référence à HotSpot

5voto

Mat Points 104488

C'est les deux. Il peut interpréter le bytecode, et le compiler en code natif.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X