La position actuelle:Accueil du site>JVM (XVII) - - chargement du Code octet et de la classe (II) - - ensemble d'instructions du Code octet

JVM (XVII) - - chargement du Code octet et de la classe (II) - - ensemble d'instructions du Code octet

2022-05-15 02:49:56Leo Messi94

5. Ensemble d'instructions Bytecode

JavaBytecode for Virtual Machine,C'est comme si le langage d'assemblage,Appartient à la commande d'exécution de base
JavaL'instruction de la machine virtuelle est composée d'un octet de longueur,Un nombre qui représente un sens opérationnel particulier(Appelé opcode:Opcode)Et les zéros suivants représentent au plus les paramètres requis pour cette opération(Appelé opérande:Operands)Composition
Parce queJavaLa machine virtuelle a une structure orientée vers la pile d'opérandes au lieu du registre,La plupart des instructions ne contiennent donc pas d'opérandes,Il n'y a qu'un seul Code d'opération en raison des restrictionsJavaLa longueur de l'opcode de la machine virtuelle est d'un octet(C'est - à - dire:0 ~ 255),Cela signifie que le nombre total d'opérandes d'un ensemble d'instructions ne peut dépasser256Article (s)

Modèle d'exécution
Si la gestion des exceptions n'est pas envisagée,AlorsJavaL'interpréteur de la machine virtuelle peut utiliser le pseudocode suivant comme modèle d'exécution de base pour comprendre
Insérer la description de l'image ici

5.1 Octets et types de données

InJavaEnsemble d'instructions pour les machines virtuelles,La plupart des directives contiennent des informations sur le type de données correspondant à leur fonctionnement
Par exemple,iloadInstruction utilisée pour charger à partir d'une table de variables localesintType de données dans la pile d'opérandes,EtfloadLes instructions sont chargéesfloatType de données

Pour la plupart des instructions Bytecode liées au type de données,Leurs mnémoniques opcode ont tous des caractères spéciaux pour indiquer le type de données à servir:
Pour la plupartboolean、byte、shortEtcharFonctionnement des données de type, En fait, ils utilisent tous les intType comme type d'opération

  • i Pour le bien deintType de données à utiliser
  • l Représentantlong
  • s Représentantshort
  • b Représentant byte
  • c Représentantchar
  • f Représentantfloat
  • d Représentantdouble

5.2 Classification des directives

  • Instructions de chargement et de stockage
  • Instruction arithmétique
  • Instructions de conversion de type
  • Appel de méthode et instructions de retour
  • Instructions de gestion de la pile d'opérandes
  • Commande de transfert de contrôle
  • Instructions de gestion des exceptions
  • Commande de contrôle de synchronisation

5.2.1 Instructions de chargement et de stockage

Action
Les instructions de chargement et de stockage sont utilisées pour transférer des données d'avant en arrière entre la table des variables locales du cadre de pile et la pile d'opérandes

Instructions communes
1[Instruction de pile de pression variable locale]Charger une variable locale dans la pile d'opérandes:
xload、xload_(Parmi euxxPouri、l、f、d
a,n0Pour3)
2[Instruction de pile constante] Charger une constante sur la pile d'opérandes:
bipush、 sipush、ldc、ldc_w、ldc2_w、
aconst_null、 iconst_m1、 iconst_、lconst、
fconst_、 dconst
3[Instruction de Table des variables locales de chargement hors pile]Stocker une valeur de la pile d'opérandes dans la table des variables locales:
xstore、 xstore_(Parmi euxxPouri、l、f、d、a,nPour0À3);
xastore(Parmi euxxPour、l、f、d、a、b、c、s)
4 Instructions pour étendre l'index d'accès à la table des variables locales:wide
Dans les mnémoniques d'instruction énumérés ci - dessus,Une partie se termine par des crochets d'angle
(Par exempleiload_).Ces mnémoniques d'instruction représentent en fait un ensemble d'instructions
(Par exempleiloa_Ça représenteiload_0、iload_1、iload_2Et iload_3
Ces directives).
Ces ensembles d'instructions sont des instructions générales avec un opérande(Par exempleiload)De
Forme spéciale
Équation,Pour ces groupes de directives particulières,Ils n'ont pas d'opérandes en surface,Pas besoin.
Effectuer l'action de récupération des opérandes ,Mais les opérandes sont implicites dans la directive.
Par exemple,:
iload_0: Indexer le tableau des variables locales comme 0Les données de position sont pressées dans la pile d'opérandes.
En plus de ça,,Leur sémantique est parfaitement conforme aux instructions génériques natives(Par exempleiload_0
La sémantique et l'opérande de0HeureiloadLa sémantique de l'instruction est entièrement cohérente. Entre crochets
La lettre indique le type de données de l'opérande implicite de la directive ,Représente un entier non négatif,
くi>Ça veut direintDonnées de type,ReprésentantlongType,ReprésentantfloatType,
Représentant doubleType.

5.2.1.1 Instruction de pile de pression variable locale

L'instruction de pile de variables locales presse les données d'une table de variables locales donnée dans la pile d'opérandes
Ces directives peuvent être divisées en
x1oad_(xPouri、l、f、d、a,n0Pour3)
xload(xPouri、l、f、d、a)
Description:Ici,xLa valeur de indique le type de données.
Directivesxload_nIndique que lenVariables locales pressées dans la pile d'opérandes,Par exemple,iload_1、
fload_0、 aload_0Attendez les instructions.Parmi eux aload_n Représente la référence des objets à la pile .
DirectivesxloadEn spécifiant la forme du paramètre,Appuyez sur la variable locale dans la pile d'opérandes,Lorsqu'il est utilisé
Quand cette commande,Indique que le nombre de variables locales peut dépasser4- Oui.,Comme les instructions.iload、
floadAttendez..

5.2.1.2 Instruction de pile constante

La fonction d'une instruction de pile constante est de presser une constante dans la pile d'opérandes, Selon le type de données et l'entrée
La différence dans le contenu de la pile ,Peut être divisé enconstSérie、pushSérie etldcDirectives.
DirectivesconstSérie:Pour empiler des constantes spécifiques, Les constantes sur la pile sont implicites
Dans l'ordre lui - même .La directive: iconst_(iDe-1À5)、l
const_(lDe0À1)、 fconst_(fDe0À2)、
dconst_(dDe à1)、 aconst_null.

Par exemple,,
iconst_m1Oui.-1Appuyez sur la pile d'opérandes:
iconst_x(xPour0À5)Oui.xAppuyez sur la pile
lconst_0、lconst_1 Faites des entiers longs 0Et1Appuyez sur la pile:
fconst_0、 fconst_1、 fconst_2Nombre de points flottants0、1、2Appuyez sur la pile
dconst_0Et dconst_1SéparémentdoubleType0Et1Appuyez sur la pile
aconst_nullOui.nullAppuyez sur la pile d'opérandes
Il n'est pas difficile de trouver les règles du nom de la directive, Le premier caractère du mnémonique d'instruction est toujours
Aime représenter les types de données ,iReprésente un entier,lReprésente un entier long,fIndique le nombre de points flottants,dReprésentation
Point flottant de double précision,Habituellement utiliséaReprésente une référence d'objet.Si l'instruction implique des paramètres pour l'opération,
Sera souligné.
DirectivespushSérie:Comprend principalement: bipushaEt sipush.La différence est que
Différents types de données reçues , bipashaRéception8 Bit entier comme argument ,sipush
Réception16Nombre entier de bits,Ils poussent tous les deux les paramètres sur la pile.
DirectivesldcSérie:Si aucune des directives ci - dessus ne satisfait aux exigences, Alors on peut utiliser tout - puissant
DeldcDirectives,Il peut recevoir un8Paramètres du BIT,Ce paramètre pointe vers
int、floatOu StringlIndex de,Appuyez sur le contenu spécifié dans la pile.

Insérer la description de l'image ici

5.2.1.3 Instruction de Table des variables locales de chargement hors pile

L'instruction de Table des variables locales de chargement de la pile sortante est utilisée pour éjecter l'élément supérieur de la pile dans la pile d'opérandes ,
Emplacement spécifié pour charger la table des variables locales,Utilisé pour attribuer des valeurs aux variables locales.
Ces directives sont principalement destinées à:storeL'existence formelle de,Par exemple,
xstore(xPouri、l、f、d、a)、xstore_n(xPouri、l、f、d、a,nPour0à3).
Parmi eux,Directivesistore nUn entier sera éjecté de la pile d'opérandes, Et l'assigner
Indexer les variables locales nEmplacement.
DirectivesxstoreComme il n'y a pas d'informations implicites sur les paramètres,Il est donc nécessaire de fournir unbyteParamètres du type
La classe spécifie l'emplacement de la table des variables locales de destination .
Description:
En général,Comme ça. storeUne telle commande nécessite un argument,Utilisé pour indiquer
Placez l'élément pop - up à la position numéro un du tableau des variables locales .Mais, Pour essayer de
Taille de l'instruction de compression ,Utilisation de produits spécialisés istore_1 L'instruction indique que l'élément pop - up est placé à
Tableau des variables locales par 1Position.De même,
istore_0、 istore_2、 istore_3, Ils représentent respectivement l'éjection du Haut de la pile d'opérandes
Un élément,Stocké dans le tableau des variables locales0、2、3Position.

Comme les premières positions du tableau des variables locales sont toujours très courantes, C'est pourquoi, bien que
Augmentation du nombre de commandes ,Mais le volume du Bytecode généré peut être considérablement comprimé.Par exemple:
Le tableau des variables locales est grand. ,Le nombre de fentes à stocker est supérieur à3,Alors on peut utiliser istoreÇa veut dire
Ordre,Ajouter un paramètre, Utilisé pour indiquer l'emplacement de la fente à stocker
Position

5.2.2 Instruction arithmétique

Les instructions arithmétiques sont utilisées pour effectuer une certaine opération sur les valeurs des deux navettes d'opérandes , Et un nœud.
Résultat de la recompression dans l'opérande .

Classification
En général, les instructions arithmétiques peuvent être divisées en deux types: Instructions et contrepoids pour le calcul des données entières
Instructions pour le fonctionnement des données de type droit .

byte、 short、charEt booleanDescription du type
Dans chaque grande catégorie,Tous ciblésJavaInstructions arithmétiques spéciales pour les types de données spécifiques à la machine virtuelle.
Mais pas de soutien directbyte、 short、charEt booleanInstruction arithmétique de type,
Calcul de ces données,Utilisez tousintType d'instruction à traiter.En outre,
En cours de traitement boolean、byte、 shortEtcharCatégorie
Lorsque le tableau de type ,Il sera également converti en utilisant leintType Bytecode instruction to Process.
Insérer la description de l'image ici
Débordement lors de l'opération
Les opérations de données peuvent entraîner un débordement,Par exemple, deux grands entiers positifs ajoutés,Les résultats sont bons.
Peut être un nombre négatif .En fait...Java La spécification de la machine virtuelle ne spécifie pas explicitement les données entières
Résultats spécifiques du débordement ,Spécifiez seulement lorsque vous travaillez avec des données entières, Seules les instructions de division sont
Et lorsque le diviseur apparaît dans l'instruction de recherche de surplus est 0 Provoque le lancement de la machine virtuelle
Anomalie Arithmeticexception

Mode de fonctionnement
Mode d'arrondi au nombre le plus proche:JVMLors du calcul du nombre de points flottants, Toutes les expéditions
Les résultats doivent être arrondis à la précision appropriée , Les résultats inexacts doivent être arrondis à
La valeur exacte la plus proche représentée , S'il y a deux représentations de la même valeur
Approche,La priorité sera donnée à la sélection de;
Mode d'arrondi à zéro:Lors de la conversion d'un nombre flottant en entier,Adopter ce modèle,Le mode
Sélectionnez l'un des nombres les plus proches mais pas plus grands que la valeur originale dans le type de valeur cible pour faire
Arrondi au résultat le plus précis

NaNValeur utilisée
Quand une opération génère un débordement,Sera représenté par un infini signé,Si
Si le résultat d'une opération n'est pas mathématiquement clair ,Sera utiliséNaNLes valeurs représentent.Et
Et toutes les utilisations NaNOpération arithmétique avec valeur comme opérande,Les résultats reviennentNaN

Toutes les instructions arithmétiques comprennent: :
Instruction d'addition:iadd ladd、fadd、dadd
Soustraire les instructions :isub、lsub、fsub、dsub
Instruction de multiplication:imul、lmul、fmul、dmul
Instruction de division:idiv、ldiv、fdiv、ddiv
Instruction complémentaire:irem、lrem、frem、drem // remainder:Reste
Instruction inverse:ineg、lneg、fneg、dneg // negation:Inverse
Directive auto - ajoutée:iinc
Instructions de fonctionnement des bits,Peut être divisé en
Instruction de déplacement:ishl、ishr、 iushr、lshl、lshr、lushr
Bitwise or Command:ior、lor
Bitwise and Command:iand、land
Commande Xor bitwise:ixor、lxor
Comparer les directives: dcmpg、dcmpl、 fcmpg、fcmpl、lcmp

5.2.2.1 Comparer les directives

Le but de l'instruction comparer est de comparer la taille des deux éléments en haut de la pile,Et mettre les résultats de la comparaison sur la pile
Les directives de comparaison sont les suivantes:: dcmpg,dcmpl、 fcmpg、 fcmpl、lcmp
Similaire à la directive précédente,Premier caractèredReprésentation doubleType,fReprésentationfloat,
lReprésentationlongPourdoubleEtfloatNombre de types,Parce queNaNL'existence de,Chacun.
Deux versions des instructions de comparaison .Par floatPar exemple,Oui. fcmpEtfcmplDeux directives,
La différence est qu'en comparant les chiffres,Si vous rencontrezNaNValeur,Les résultats du traitement sont différents.
DirectivesdcmplEt dcmpgC'est similaire.,Sa signification peut être déduite de sa désignation,
Ne répétez pas ici.
DirectiveslcmpPourlongType entier,Parce queongType entier nonNaNValeur,
Il n'est donc pas nécessaire de préparer deux séries de directives.
Exemples
DirectivesfcmpgEtfcmplLes deux opérandes sont éjectés de la pile,Et les mettre
Comparer,Définir l'élément supérieur de la pile commev2,Position de la pile supérieure2L'élément du BIT estv1,Siv1=v2,
Appuyez sur0:Siv1>v2Appuyez sur1:Siv1<v2Appuyez sur-1.
La différence entre les deux directives est que,Si vous rencontrezNaNValeur, fcmpgVa pousser1,
EtfcmplVa pousser-1.

5.2.3 Instructions de conversion de type

L'instruction de conversion de type convertit deux types numériques différents les uns des autres.
Ces opérations de conversion sont généralement utilisées pour mettre en œuvre des opérations de conversion de type explicite dans le code utilisateur ,
.Ou l'instruction utilisée pour traiter le type de données de l'ensemble d'instructions Bytecode ne peut pas être liée à
Les types de données correspondent un par un au problème .

5.2.3.1 Conversion de type large

Conversion de type large( Widening Numeric Conversions)
1 Règles de conversion
JavaLes machines virtuelles supportent directement la conversion de type large des valeurs suivantes
( widening numeric conversion, Type de petite portée au type de grande portée
Conversion sécurisée de ).
C'est - à - dire,Aucune instruction n'est requise,Y compris deintType àlong、float
Ou doubleType.L'instruction correspondante est:i21、i2f、i2d
DelongType àfloat、 doubleType.L'instruction correspondante est:i2f、i2d
DefloatType àdoubleType.L'instruction correspondante est:f2d
Réduit à:int–>long–>float-> double
2 Perte de précision
2.1 La conversion de type Widening ne perd pas d'informations parce que le type cible maximum est dépassé,
Par exemple,DeintConvertir enlong,Ou deintConvertir endouble, Je ne perdrai jamais rien
Quel message? ,Les valeurs avant et après conversion sont exactement égales.
2.2 Deint、long Valeur de type convertie en float,Oulong Valeur de type convertie en
doubleHeure, Perte possible de précision un par un perte possible de quelques - uns des effets les plus faibles
Valeur en bits,La valeur du point flottant converti est basée surIEEE754 Le plus proche du mode d'inclusion
Valeur entière correcte obtenue .

Bien que la conversion de type large puisse en fait entraîner une perte de précision, Mais cette conversion est toujours
Loin de causer JavaException d'exécution de la machine virtuelle

3 Notes complémentaires
Debyte、charEt shortType àint Type Widening type conversion is actually
N'existe pas.PourbyteType àint, Le simulateur n'a pas fait de travail substantiel
Transformation, Il suffit d'échanger deux données via la pile d'opérandes .Et
Oui.bytePasser àlongHeure,Utiliséi2l,Peut être vu à l'intérieur
byteC'est l'équivalent ici.intTraitement des types,De même, shortType,
Ce traitement présente deux caractéristiques:
D'une part, les types de données réels peuvent être réduits,Si oui shortEtbyte Tout est prêt.
Un ensemble de directives , Alors le nombre de directives augmentera considérablement , Et la conception actuelle de la machine virtuelle
Allez.,Prêt à n'utiliser qu'un seul octet pour représenter l'instruction, Le nombre total d'instructions ne peut donc pas dépasser
Oui.256- Oui.,Pour économiser les ressources de la directive,Oui. shortEtbyteComme
intC'est logique..
D'un autre côté,Parce que la fente dans le tableau des variables locales est fixée à32Bits,Que ce soitbyteOu
De shortEnregistrer dans le tableau des variables locales,Ils vont tous occuper32Espace binaire.De ce point de vue,
Il n'est pas non plus nécessaire de distinguer ces types de données.

5.2.3.2 Conversion de type étroit

Conversion de type étroit( Narrowing Numeric Conversion)
1 Règles de conversion
JavaLes machines virtuelles prennent également en charge directement les transformations de type étroites suivantes::
Du SeigneurintType àbyte、 shortOucharType.Les instructions correspondantes sont::
i2b、i2c、i2s
DelongType àintType.Les instructions correspondantes sont::l2i
DefloatType àintOulongType.Les instructions correspondantes sont::f2i、f2l
DedoubleType àint、longOufloatType.Les instructions correspondantes sont::
d2i、d2l、d2f

2 Perte de précision
Une conversion de type étroit peut entraîner des résultats de conversion avec différents signes positifs et négatifs、 Différentes quantités
Niveau,Donc,,Le processus de conversion entraînera probablement une perte de précision numérique.
Bien qu'un débordement de limite supérieure puisse se produire lors d'une conversion étroite du type de données、 Dépassement de la limite inférieure et perte de précision
Perte de qualité ,MaisJava La spécification de la machine virtuelle spécifie explicitement le type numérique de conversion étroite signifie
Rendre impossible pour la machine virtuelle de lancer une exception d'exécution

3 Notes complémentaires
3.1 Lors de la conversion d'une valeur de point flottant étroite en un type entierT(TLimité àintOulongCatégorie
Type 1 )Quand,Les règles de conversion suivantes seront suivies::
Si la valeur du point flottant estNaN,Le résultat de la conversion estintOulongType0.
Si la valeur du point flottant n'est pas infinie ,Utilisation de valeurs flottantesIEEE754 La direction zéro contient la matrice
Arrondi ,Obtenir une valeur entièreVvSivDans le type de cibleT(intOulong)Plage de représentation de
À l'intérieur,Le résultat de la conversion estv.Sinon,Sera basé survSymbole de,Convertir enTBureau
Nombre positif maximum ou minimum qui peut être exprimé

3.2 Quand undoubleConversion de type étroit enfloatType,À suivre
Les règles de conversion suivantes
En arrondissant un au mode d'arrondi le plus proche, vous pouvez utiliserfloatLe type représente
Nombre de.Le résultat final est basé sur3Règle de jugement
Si la valeur absolue du résultat de conversion est trop petite pour être utiliséefloatPour représenter,RetourfloatCatégorie
Plus - moins zéro de
Si la valeur absolue du résultat de conversion est trop grande pour être utiliséefloatPour représenter,RetourfloatCatégorie
Infini positif et négatif de type .
PourdoubleTypeNaN La valeur sera convertie en floatTypeNaNValeur.

5.2.4 Instructions de création et d'accès pour les objets

Instructions de création et d'accès pour les objets
JavaEst un langage de programmation orienté objet, Plate - forme VM slave Bytecode Layer
Le visage supporte profondément l'objet face à face . Il existe une série de directives spécifiquement destinées à
Opération éléphant ,Peut être subdivisé en instructions de création、Instructions d'accès au champ、Opération Array
Directives、Commande de contrôle de type.

5.2.4.1 Créer une directive

Bien que les instances de classe et les tableaux soient des objets,Mais...Java Création d'instances de classe et de tableaux par des machines virtuelles
Différentes instructions Bytecode sont utilisées pour la construction et l'exploitation :
1 Instructions pour créer une instance de classe:
Instructions pour créer une instance de classe new
Il reçoit un opérande,Est l'index pointant vers le pool constant,Représente le type à créer,
Une fois l'exécution terminée,Appuyez sur la référence de l'objet dans la pile.
2 Instructions pour créer un tableau:
Instructions pour créer un tableau: newarray、 anewarray、 multianewarray.
newarray:Créer un tableau de types de base
anewarray:Créer un tableau de types de référence
multilanewarra/Créer un tableau multidimensionnel
Les instructions de création ci - dessus peuvent être utilisées pour créer des objets ou des tableaux,Parce que les objets et les tableauxJavaMoyenne
Largement utilisé,La fréquence d'utilisation de ces directives est également très élevée..

5.2.4.2 Instructions d'accès au champ

Après la création de l'objet, L'Instance objet ou l'Instance Array peut être obtenue à partir de l'instruction d'accès objet
Champ ou élément de tableau dans .

Champ de classe d'accès( staticChamp,Ou variable de classe)Directives:
getstatic、 putstatic
Accéder aux champs d'instance de classe(Non staticChamp,Ou variable d'instance)Directives:
getfield、 putfield

Exemples:
Par getstaticLa directive, par exemple,Il contient un opérande, Pour pointer vers le pool constant
DeFieldrefIndex,Son rôle est d'obtenir FieldrefDésignation
Objet ou valeur ,Et pressez - le dans la pile d'opérandes.
public void sayhello(){
System. out.println(“hello”);
}
Instruction Bytecode correspondante:
0 getstatic #8 <java/lang/System. out>
3 1dc #9
5 invokevirtual #10 <java/io/Printstream println>
8 return

5.2.5.3 Instructions de fonctionnement du tableau

Les instructions de fonctionnement du tableau sont principalement: xastoreEt xloadDirectives.Plus précisément::
Instructions pour charger un élément de tableau dans la pile d'opérandes:
baload、 caload、 saload、 iaload、laload、 faload、
daload、 aaload
Instructions pour stocker la valeur d'une pile d'opérandes dans un élément de tableau:
bastore、 castore、 sastore、 iastore、lastore、
faster、 dastore、 aastore
C'est - à - dire::
Insérer la description de l'image ici
Instructions pour prendre la longueur du tableau: arraylength
L'instruction éjecte l'élément Array en haut de la pile,Obtenir la longueur du tableau,Pousser la longueur dans la pile.
Description
DirectivesxaloadReprésente la pile d'éléments d'un tableau,Par exemple,saload、 caloadPoints
N'insistez pas. shortTableau etcharTableau.Directives
xaloadAu moment de l'exécution,Exiger que l'élément supérieur de la pile de l'opérande soit un index de tableaui, Alignement de la pile
Bits2Les éléments sont des références de tableaua, L'instruction s'éjecte en haut de la pile.
Deux éléments,Et vaa[i] Recompresser dans la pile .
xastorPour les opérations de tableau,Par iastorePar exemple,Il est utilisé pour
Donne - en un.intAssigner une valeur à un index donné d'un tableau.In iastoreAvant la mise en œuvre
Le Haut de la pile d'opérandes doit être préparé de cette façon3Éléments:Valeur、Index、Référence du tableau,
iastoreÇa va sortir.3Valeurs, Et assigne la valeur à l'index spécifié dans le tableau
Position de la citation .

5.2.4.4 Commande de contrôle de type

Instructions pour vérifier une instance de classe ou un type de tableau: instanceof、 checkcast.
DirectivescheckcastUtilisé pour vérifier si la conversion de type peut être effectuée.Si
C'est possible.,AlorscheckcastL'instruction ne change pas la pile d'opérandes
Sinon, il va sortir.ClassCasteExceptionAnomalie.
Directives instanceofUtilisé pour déterminer si un objet donné est une instance d'une classe,
Il pousse le résultat du jugement dans la pile d'opérandes.

5.2.5 Appel de méthode et instructions de retour

5.2.5.1 Instruction d'appel de méthode

Instruction d'appel de méthode: invokevirtual、 invokeinterface、
invokespecial、 invokestatic、 invokedynamic
Ci - dessous5Instructions pour les appels de méthode:

invokeqlvirtualMéthode d'instance utilisée par l'instruction pour invoquer l'objet, Selon la classe réelle de l'objet
Type de distribution (Répartition des méthodes virtuelles),Polymorphisme pris en charge.Et ça aussi.Java Dans la langue
Méthode commune de répartition .
invokeinterfaceInstruction utilisée pour invoquer la méthode d'interface, Il va chercher à l'exécution
Cette méthode d'interface implémentée par l'objet défini ,Et trouver le bon moyen d'appeler
invokespeciaLes instructions sont utilisées pour invoquer certaines méthodes d'instance nécessitant un traitement spécial,Y compris:
Méthode d'initialisation de l'Instance(Constructeur)、Méthodes privées et méthodes parentales. Toutes ces méthodes
Est lié par type statique ,Ne pas envoyer dynamiquement au moment de l'appel.
invokestatic La directive est utilisée pour appeler une méthode de classe dans une classe nommée ( staticMéthodes).
C'est une liaison statique.
invokedynamic:Appelez la méthode de liaison dynamique,C'est...JDK1.7 Ajouter après
Instructions entrantes . Utilisé pour résoudre dynamiquement le qualificatif de point d'appel à l'exécution
Méthode citée,Et mettre en œuvre la méthode.Devant.4 Logique d'expédition pour les instructions d'appel
Sont solidifiés javaMachine virtuelle interne,Et
invokedynamicLa logique d'expédition de l'instruction est déterminée par la méthode de démarrage définie par l'utilisateur.

5.2.5.2 Instruction de retour de méthode

Avant la fin de l'appel de méthode,Retour requis. La commande de retour de la méthode est basée sur le retour
Type de valeur de retour .
Y compris: ireturn(Lorsque la valeur de retour est boolean、byte、char、
shortEtintUtilisé pour le type)、lreturn、 freturn、dreturn
EtareturnIl y en a un autre. returnInstruction à déclarer commevoidMéthode、Début de l'Instance
Méthodes d'initialisation et méthodes d'initialisation des classes et des interfaces utilisant .
Insérer la description de l'image ici
Exemples:
Adoption ireturnDirectives,éjecter l'élément supérieur de la pile d'opérandes de fonction courante,Et mettre ceci
Éléments pressés dans la pile d'opérandes de la fonction appelant ( Parce que l'appelant
Très préoccupé par la valeur de retour de la fonction ), Tous les autres dans la pile d'opérandes de fonction courante
Les éléments sont jetés .
Si vous retournez actuellement synchronizedMéthodes, Et puis il y a un autre implémentation
Inclus monitorexitDirectives,Sortie de la zone critique.

5.2.5 Instructions de gestion de la pile d'opérandes

Comme pour manipuler une pile dans une structure de données normale,JVM Gestion de la pile d'opérandes fournie
Directives,Instructions qui peuvent être utilisées pour manipuler directement la pile d'opérandes.

Ces directives comprennent les éléments suivants:
éjecter un ou deux éléments du Haut de la pile,Et directement abandonné:pop,pop2
Copiez une ou deux valeurs en haut de la pile et appuyez à nouveau sur la valeur copiée ou double en haut de la pile:
dup,dup2,dup_×1,
dup2_x1, dup x2, dup2 x2;

Les deux plus hauts de la pileSlotÉchange de position numérique:swap.Java La machine virtuelle n'a pas fourni
Deux en échange.64Type de données binaires(long、 double)Instruction numérique
Directivesnop,C'est une directive très spéciale,Son code byte est0x00.Et
Dans le langage d'assemblagenopC'est pareil,Ça veut dire ne rien faire.. Cette directive peut en général
Pour la mise en service、Occupation, etc..

Ces directives sont de type général,Il n'est pas nécessaire d'indiquer le type de données pour appuyer ou éjecter la pile.

Description:
Sans_xL'instruction pour copier les données du Haut de la pile et appuyer sur le Haut de la pile.Comprend deux directives,
dupEtdup2.dupLe coefficient pour représenteSlotNombre.

dupLes instructions initiales sont utilisées pour copier1- Oui.SlotDonnées.Par exemple1- Oui.intOu1- Oui.
referenceDonnées de type
dup2Les instructions initiales sont utilisées pour copier2- Oui.SlotDonnées.Par exemple1- Oui.long,Ou2- Oui.int,
Ou1- Oui.int+1- Oui.
floatDonnées de type

Avec_xL'instruction est de copier les données du Haut de la pile et de les insérer quelque part sous le Haut de la pile.Total4Directives,
dup_x1,dup2_x1,dup_x2,dup2_x2,Pour les ceintures_xCopier les instructions d'insertion pour,
Il suffit dedupEtxSomme des coefficients, Le résultat est la position à insérer
Donc,
dup_x1Insérer la position:1+1=2, C'est le Sommet. 2- Oui.SlotEn bas
dup_x2Insérer la position:1+2=3,En haut de la pile3- Oui.SlotEn bas
dup2_x1Insérer la position:2+1=3,En haut de la pile3- Oui.SlotEn bas
dup2_x2Insérer la position:2+2=4,En haut de la pile4- Oui.SlotEn bas
pop:En haut de la pile1- Oui.SlotSortie numérique de la pile.Par exemple1- Oui. short.Valeur du type
pop2:En haut de la pile2- Oui.SlotSortie numérique de la pile.Par exemple1- Oui.double Valeur du type,
Ou2- Oui.intValeur du type

5.2.6 Commande de transfert de contrôle

3.2.7.1 Aujourd'hui

Le but de l'instruction de comparaison est de comparer la taille des deux éléments qui occupent le Haut de la pile , Et les résultats de la comparaison .
Les directives de comparaison sont les suivantes:: dcmpg,dcmpl、 fcmp、fcmpl、lcmp
Similaire à la directive précédente,Premier caractèredReprésentationdoubleType,fReprésentationfloat,lTableau
(En milliers de dollars des États - Unis)long.PourdoubleEtfloatNombre de types,Parce queNaNL'existence de,Deux chacun
Version de la directive comparative .ParfloatPar exemple,Oui.fcmpgEtfcmplDeux directives,C'est
La différence entre eux est qu'en comparant les chiffres ,Si vous rencontrezNaNValeur,Les résultats du traitement sont différents.
DirectivesdcmplEt dcmpgC'est similaire.,Sa signification peut être déduite de sa désignation,
Ne répétez pas ici.

Exemples
Directives fcmpEtfcmpl Les deux opérandes sont éjectés ,Et les comparer,
Définir l'élément supérieur de la pile commev2, Position supérieure 2L'élément du BIT estv1,Siv1=v2,Appuyez sur0:
Siv1>v2Appuyez sur1:Siv1<v2Appuyez sur-1.
La différence entre les deux directives est que,Si vous rencontrezNaNValeur, fcmpgVa pousser1,
EtfcmplVa pousser-1

Un. Instruction de saut conditionnel
Les instructions de saut conditionnel sont généralement utilisées en conjonction avec les instructions de comparaison. Avant l'exécution de la commande de saut conditionnel ,
En général, vous pouvez d'abord préparer l'élément supérieur de la pile avec l'instruction de comparaison ,Ensuite, faites un saut conditionnel.
Les instructions de saut conditionnel sont::
ifeq,iflt,ifle,ifne,ifgt,ifge, ifnull, ifnonnull.Voilà.
Ces instructions reçoivent des opérandes de deux octets
,Pour calculer la position du saut(16Bitsymbol Integer as current positionoffset).
Leur signification unifiée est:éjecter l'élément supérieur de la pile,Pour vérifier si elle répond à une condition,
Si les conditions sont remplies,Passer à la position donnée
Précisez:
Insérer la description de l'image ici

Comparer les instructions de saut conditionnel

Comparer les instructions de saut conditionnel est similaire à une combinaison d'instructions de saut conditionnel et d'instructions de saut conditionnel,Il va
Comparer et sauter deux étapes en un
Ces directives sont les suivantes::if_ icmpeg、if_ cmpne、if_ icmplt、
if_ icmpgt、if_ icmple、if_ icmpge、if_ acmped
Etif_ acmpne
Où mnémonique d'instruction plus“if_”Après,En caractères“i”La directive initiale est destinée à:intType entier
Fonctionnement(Y compris shortEtbyteType),En caractères“a”Vas - y.
L'instruction header représente la comparaison des références d'objets .
Précisez:
Insérer la description de l'image ici
Ces instructions prennent des opérandes de deux octets comme paramètres,Pour calculer la position du saut.
Pendant l'exécution de la commande,Le Haut de la pile doit préparer deux éléments à comparer.
Après l'exécution de l'instruction,Les deux éléments en haut de la pile sont vidés, Et aucune donnée
Implant .Si les conditions préalables sont remplies,Puis le saut est effectué,Sinon, Continuez avec l'instruction suivante .

3.2.7.3 Instruction de saut de branche Multi - Conditions

L'instruction de saut de branche Multi - conditions est conçue pour switch-caseStatement Design,
Principalement: tableswitchEtlookupswitch

Insérer la description de l'image ici
Vu du mnémonique,Les deux sont switchMise en oeuvre de l'énoncé,Leurs différences
tableswitchNécessite plusieurs valeurs de branche conditionnelles continues, Il ne stocke que le début à l'intérieur
Valeurs et terminaisons ,Et plusieurs décalages de saut,Via un opérande donné index,
Peut être immédiatement positionné à la position de décalage de saut,Donc C'est très efficace.
DirectiveslookupswitchÀ l'intérieur, il y a descase- offsetC'est exact.,Chaque fois que
Toutes les lignes à rechercher case- offsetC'est exact.,On a trouvé une correspondance.caseValeur,Et selon
Correspondant offsetCalculer l'adresse de saut,Donc moins efficace.
DirectivestableswitchlLe schéma de la figure ci - dessous.Parce quetableswitchDe
caseLes valeurs sont continues,Il suffit donc d'enregistrer les valeurs minimales et maximales, Et chaque article correspondant
offsetOffset,Selon le indext Les valeurs peuvent être déterminées directement par un simple calcul
Bit to offset.
Insérer la description de l'image ici

3.2.7.4 Instructions de saut inconditionnel

Les principales commandes de saut inconditionnel actuelles sont:goto.Directivesgoto Opération de réception de deux octets
Nombre,Ensemble pour former un entier signé,Utilisé pour spécifier l'offset de la commande
Le but de l'exécution de l'instruction est de sauter à la position donnée par le HALO offset .
Si le décalage de commande est trop grand, Plus que la plage d'entiers signés de deux octets ,Peut être utilisé
Directivesgoto_w,EtgotoA le même effet,Mais il reçoit4 Opérande de octets ,
Peut représenter une plus grande gamme d'adresses.
Directivesjsr、jsr_w、retMême si c'est un saut inconditionnel,Mais Seigneur
Pour try-final1yDéclarations,Et a été progressivement abandonné par la machine virtuelle,
Il n'y a donc pas d'introduction à ces deux directives ici.
Insérer la description de l'image ici

5.2.7 Instructions de gestion des exceptions

3.2.8.1 Lancer une instruction d'exception

(1) athrowDirectives
In]avaL'opération qui a lancé l'exception est affichée dans le programme( throwDéclarations)Tout est fait par athrowÇa veut dire
Pour réaliser
En plus d'utiliser throwL'instruction montre une exception lancée,JVM La spécification prévoit également que
L'exception Multi - Runtime se produit dans d'autres ]avaLancé automatiquement lorsque la commande VM détecte une condition anormale.
Par exemple,Lors des opérations d'entiers décrites précédemment,Lorsque le diviseur est zéro,Les opportunités virtuellesidivOu
ldivLancer dans la directive
ArithmeticexceptionAnomalie.
(2)Attention!
Dans des conditions normales,L'entrée et la sortie de la pile d'opérandes sont effectuées en une seule instruction.Unique
L'exception est lorsqu'une exception est lancée ,]ava L'opérateur de nettoyage d'opportunité virtuelle est à la racine
Tout le contenu de, Appuyez ensuite sur l'instance d'exception sur l'opérande de l'appelant .
Traitement des exceptions et des exceptions
Processus I:Processus de génération de l'objet d'exception-> throw(Manuel/Automatique) -->Directives: athrow
Processus II: Traitement des exceptions:Modèle de prise et de lancer:try-catch-finally --> Utiliser le tableau des exceptions

3.2.8.2 Gestion des exceptions et tableau des exceptions

1 Gestion des exceptions:
InJavaDans la machine virtuelle,Gestion des exceptions( catchDéclarations) Pas par instruction Bytecode
Maintenant(Utilisation précocejsr、retDirectives), Au lieu de cela, utilisez le tableau des exceptions
2 Tableau des anomalies
Si une méthode définit untry- catchOutry- final1y De l'anomalie
Oui.,Crée une table d'exception.Il contient chaque gestionnaire d'exception oufinallyBloc
Informations sur.
Garantie de surface anormale
Chaque information sur la gestion des exceptions est sauvegardée .Par exemple,:
Position de départ
Position finale
Adresse offset pour le traitement du Code enregistré par le compteur de programme
Index de la classe d'exception capturée dans le pool constant
Quand une exception est lancée,3wMVa chercher un traitement correspondant dans la méthode actuelle,
Si vous ne trouvez pas,Cette méthode force la fin et éjecte le cadre de pile actuel, Et l'anomalie sera lourde
Nouvelle méthode lancée à l'appel supérieur ( Dans le cadre de la méthode d'appel ). Si vous êtes toujours
Aucune exception appropriée n'a été trouvée ,Ce thread se termine. Si cette exception est
Lancé dans ce dernier thread non - gardien ,Qui mènera àJVMRésiliation par soi - même, Comme ce fil
C'est ça.mainThread.
Chaque fois qu'une exception est lancée,Si le traitement des exceptions correspond finalement à tous les types d'exceptions,
Le Code va continuer.Dans ce cas,,Si aucune exception n'est lancée après la fin de la méthode,
Toujours en vigueurfinallyBloc,In returnAvant,Il saute directement à finallyBloc à compléter
Objectifs

5.2.8 Commande de contrôle de synchronisation

1 Synchronisation au niveau de la méthode
Synchronisation au niveau de la méthode:C'est implicite.,C'est - à - dire qu'aucune commande Bytecode n'est nécessaire pour contrôler,C'est vrai.
Maintenant, dans l'appel de méthode et l'opération de retour . Les machines virtuelles peuvent être mises en commun à partir de
Dans la structure du tableau des méthodes ACC SYNCHRONIZED Le drapeau d'accès indique si une méthode est déclarée
Pour la méthode de synchronisation
Lorsque la méthode est appelée, L'instruction d'appel vérifiera la méthode ACC SYNCHRONIZED Objet d'accès
Si le journal est défini .
Si défini,Le thread d'exécution tiendra d'abord la serrure de synchronisation,Et ensuite exécuter la méthode. Enfin, à la fin de la méthode
Oui.( Que ce soit normal aa Terminé ou irrégulier )Verrouillage de synchronisation.

Pendant l'exécution de la méthode,Le fil d'exécution tient la serrure de synchronisation, Aucun autre thread n'est disponible
Même serrure.
Si une exception est lancée lors de l'exécution d'une méthode de synchronisation, Et cette exception ne peut pas être traitée à l'intérieur de la méthode
Souvent,La serrure que cette méthode de synchronisation tient est automatiquement libérée lorsque l'exception est lancée en dehors de la méthode de synchronisation.

Exemples
private int i = 0;
public synchronized void add(){
i++;
}
Code octet correspondant:
e aload_0;
1 dup
2 getfield #2 < com/atguigu/javal/SynchronizedTest.i>
5 iconst_1
6 iadd
7 putfield #2 (com/atguigu/java1/SynchronizedTest.i>

2 Synchronisation de la séquence d'instruction spécifiée dans la méthode
Synchronisation d'une séquence d'instructions:Généralement parjavaDans synchronized Bloc de déclaration
Show.jvmL'ensemble d'instructions pour monitorenterEt
monitorexitDeux directives pour soutenir synchronizedSémantique des mots clés.
Quand un thread entre dans le barrage de code de synchronisation ,Il utilise monitorenterDemande d'accès à la commande.
Si le compteur de moniteurs de l'objet courant est0,Il sera autorisé à entrer.,Si oui1,Pour juger
Si le thread qui détient le moniteur actuel est lui - même ,Si oui,Entrez.,Sinon, attendez.,
Jusqu'à ce que le compteur de moniteurs de l'objet soit0,Pour être autorisé à entrer dans le bloc de synchronisation.
Quand le thread sort du bloc de synchronisation,À utilisermonitorexitiDéclaration de sortie.InJavaVide
Dans le simulateur ,Tout objet a un moniteur associé, Utilisé pour déterminer si un objet
Verrouillé,Lorsque le moniteur est maintenu,L'objet est verrouillé.
DirectivesmonitorenterEt monitorexitAu moment de l'exécution, Doit être sur la pile d'opérandes
Appuyez sur l'objet ,Après monitorenterEt monitorexitl Verrouillage et libération de
Tout est fait pour le moniteur de cet objet .
L'illustration suivante montre comment le moniteur protège le Code de zone critique qui n'est pas accessible simultanément par plusieurs Threads,
Seulement si le thread4Après avoir quitté la zone critique,Thread1、2、3C'est possible..
Insérer la description de l'image ici

Mentions de copyright
Auteur de cet article [Leo Messi94],Réimpression s’il vous plaît apporter le lien vers l’original, merci
https://fra.chowdera.com/2022/135/202205142122403005.html

Recommandé au hasard