3

"Un programme de bytecode est normalement exécuté en analysant les instructions une à la fois.Ce type d'interpréteur de bytecode est très portable.Certains systèmes, appelés traducteurs dynamiques, ou" just-in-time "(JIT) compilateurs, traduire bytecode dans le langage de la machine si nécessaire à l'exécution: cela rend la machine virtuelle non portable. "Différence entre une instruction analysée par bytecode et le langage machine?

Une question sur ce paragraphe est que: Après le bytecode ont été traitées, quelle est la différence entre une instruction et analysable langage machine (ou code machine)?

+0

cela dépend vraiment de ce que vous entendez par "instruction analysée" - faites-vous référence à la représentation dans l'arbre de syntaxe abstraite? – none

Répondre

7

JIT est différent d'un interpréteur de code octet.

Tenir compte de la fonction C suivante:

int sum() { 
    return 5 + 6; 
} 

Ce sera compilé le code machine directement. Les instructions exactes sur les processeurs par exemple x86 et ARM seront différentes.

Si nous avons écrit un interprète bytecode de base, il pourrait ressembler à ceci:

for(;;) { 
    switch(*currentInstruction++) { 
    case OP_PUSHINT: 
     *stack++ = nextInt(currentInstruction); 
     break; 
    case OP_ADD: 
     --stack; 
     stack[-1].add(*stack); 
     break; 
    case OP_RETURN: 
     return stack[-1]; 
    } 
} 

Cela peut alors interpréter l'ensemble des instructions suivantes:

OP_PUSHINT (5) 
OP_PUSHINT (6) 
OP_ADD 
OP_RETURN 

Si vous compilez l'interpréteur de code octet sur à la fois x86 ou ARM, vous seriez capable d'exécuter le même code d'octet sans réécrire l'interpréteur. Si vous avez écrit un compilateur JIT, vous devez émettre des instructions spécifiques au processeur (code machine) pour chaque processeur pris en charge, tandis que l'interpréteur de code octet compte sur le compilateur C++ pour émettre les instructions spécifiques au processeur.

2

Il n'y a aucune différence - le compilateur JIT est fait exactement pour cela - il produit un code machine qui est exécuté sur le matériel.

1

Finalement, tout se résume à des instructions de machine. Native App - contient les instructions de la machine qui sont exécutées directement.

  • JIT App - bytecode est compilé dans les instructions de la machine et exécuté.
  • Translated App - bytecode est traduit par une machine virtuelle qui est une application native. Comme vous pouvez le voir, aveC# 1, vous avez le moins de temps tandis que aveC# 3, vous avez le plus de frais généraux. Ainsi, les performances devraient être les plus rapides sur # 1 et tout aussi rapides sur les # 2 après le temps de compilation initial.

  • 2

    Dans un interpréteur bytecode, le format d'instruction est généralement conçu pour un "analyse" très rapide utilisant des opérateurs de décalage et de masque. L'interpréteur, après "analyse" (je préfère "décoder") l'instruction, met immédiatement à jour l'état de la machine virtuelle, puis commence à décoder l'instruction suivante. Ainsi, une fois le bytecode traité dans un interpréteur , il ne reste aucun reste.

    Dans un compilateur JIT, les octets sont traités en unités plus grandes qu'une seule instruction.L'unité minimale est le bloc de base, mais les JIT modernes convertissent les chemins les plus importants en code machine. Il s'agit d'une étape de traduction , et la sortie de l'étape de traduction est code machine. Le bytecode original peut rester en mémoire, mais il n'est pas utilisé pour la mise en œuvre — donc il n'y a pas de réelle différence. (Bien qu'il soit toujours typique que le code machine d'une machine virtuelle JITted fasse des choses différentes du code machine émis par un compilateur de code natif.)