Qu'est ce qu'une pile de la carte
J'ai récemment été à la recherche à La Spécifications De La Machine Virtuelle Java (JVM) pour essayer de mieux comprendre ce que le fait de mes programmes de travail, mais j'ai trouvé un article que je ne suis pas tout à fait arriver...
Section 4.7.4 décrit les StackMapTable Attribut, et dans cette section, le document va dans les détails à propos de la pile de la carte des cadres. Le problème, c'est qu'il est un peu bavard et je apprendre par l'exemple; non pas par la lecture.
Je comprends que le premier de la pile de la carte est dérivé à partir du descripteur de la méthode, mais je ne comprends pas comment (qui est censé être expliqué ici.) Aussi, je ne suis pas tout à fait comprendre ce que la pile de la carte frames ne sont. Je suppose qu'ils sont semblables à des blocs en Java, mais il semble que vous ne pouvez pas avoir de la pile de la carte des cadres à l'intérieur les uns des autres.
De toute façon, j'ai deux questions spécifiques:
- Que faire de la pile de la carte frames ne?
- Comment est le premier de la pile de la carte créée?
et une question générale:
- Quelqu'un peut-il fournir une explication moins bavard et plus facile à comprendre que celui qui est donné dans la JVM?
- Je vous suggère d'aller sur ce je-apprendre-par-exemple des trucs et apprendre à lire les spécifications, comme tout le monde le fait.
- C'est quelque chose que je suis en train de travailler sur. C'est l'une des principales raisons que j'ai décidé de lire la JVM en premier lieu.
- J'ai aussi été la lecture de la JVM spec, et croyez-moi, ce n'est pas tout comme la lecture de la spécification, par exemple: pour comprendre la partie de la façon dont le type de vérification œuvres (liée à cette question), vous devez avoir une connaissance de base de Prolog programmation... donc je pense que d'une question/réponse à cette question vaut la peine d'être dans Stackoverflow
- Je trouve que c'est beaucoup plus utile d'ignorer le Prologue de trucs et de se concentrer sur les classiques d'inférence verifier. Le nouveau vérificateur est très similaire, ils ont juste décidé de le spécifier dans les 200 pages de Prologue au lieu d'utiliser un vauge description en anglais comme l'ancienne
- exactement, c'est ce que cette question est à propos, pour traduire en anglais la spécification formelle.
- J'ai essayé de les expliquer de manière exhaustive ici volatileinterface.com/...
- car le lien est mort, est-il disponible quelque part d'autre peut-être?
- web.archive.org/web/20170327123525/http://...
Vous devez vous connecter pour publier un commentaire.
Java exige que toutes les classes qui sont chargés de vérifier, dans le but de maintenir la sécurité de l'espace de sécurité et de s'assurer que le code est sûr à optimiser. Notez que ceci est fait sur le bytecode niveau, de sorte que la vérification n'est pas vérifier les invariants de la Java langue, il vérifie simplement que le bytecode de sens selon les règles de bytecode.
Entre autres choses, le bytecode de vérification permet de s'assurer que les instructions sont bien formés, que tous les sauts sont valables instructions à l'intérieur de la méthode, et que toutes les instructions d'opérer sur les valeurs du type correct. La dernière est celle où la pile de la carte est en.
Le truc, c'est que le bytecode par lui-même ne contient pas de type explicite de l'information. Les Types sont déterminés implicitement par le biais de flux de données pour l'analyse. Par exemple, un iconst instruction crée une valeur entière. Si vous le stocker dans le slot 1, ce logement dispose maintenant d'un int. Si le contrôle de flux fusionne de code qui stocke un flotteur, il y a lieu, l'emplacement est maintenant considéré comme ayant de type non valide, ce qui signifie que vous ne pouvez pas faire quelque chose de plus à cette valeur jusqu'à ce que de l'écraser.
Historiquement, le bytecode verifier déduit tous les types à l'aide de ces règles de flux de données. Malheureusement, il est impossible de déduire tous les types dans un seul linéaire passer à travers le bytecode en raison d'un saut en arrière pourrait invalider déjà déduit types. Le classique vérificateur résolu ce problème en parcourant le code jusqu'à ce que tout cesse de se modifier, ce qui pourrait nécessiter plusieurs passages.
Cependant, la vérification rend les cours de chargement lent en Java. Oracle a décidé de résoudre ce problème en ajoutant une nouvelle, plus rapide vérificateur, qui peuvent vérifier la bytecode en un seul passage. Pour ce faire, ils requis, toutes les nouvelles classes à partir de Java 7 (avec la version 6 de Java dans un état de transition) pour réaliser des métadonnées à propos de leurs types, de sorte que le bytecode peut être vérifiée en un seul passage. Depuis le bytecode format lui-même ne peut pas être changé, ce type d'information est stocké séparément dans un attribut appelé
StackMapTable
.Tout simplement de stocker le type de chaque valeur unique à chaque point dans le code serait évidemment prendre beaucoup d'espace et très inutile. Afin de rendre les métadonnées plus petit et plus efficace, ils ont décidé de faire seulement une liste des types à des positions qui sont les cibles de sauts. Si vous pensez à ce sujet, c'est le seul moment où vous avez besoin d'informations supplémentaires pour en faire une seule passe de vérification. Entre les cibles de saut, tous les flux de contrôle est linéaire, de sorte que vous pouvez déduire les types entre les positions à l'aide de l'ancien règles d'inférence.
Chaque position où les types sont explicitement énumérés est connu comme une pile de la carte. Le
StackMapTable
attribut contient une liste d'images dans l'ordre, même si elles sont généralement exprimées sous une différence à partir de l'image précédente afin de réduire la taille des données. Si il n'y a pas d'images dans la méthode, qui se produit lorsque le contrôle de flux ne jamais jointures (c'est à dire le CFG est un arbre), puis à la StackMapTable attribut peut être omise.C'est donc l'idée de base de la façon dont StackMapTable fonctionne et pourquoi il a été ajouté. La dernière question est de savoir comment l'implicite cadre initial est créé. La réponse est évidemment que le début de la méthode, l'opérande de la pile est vide et que la variable locale créneaux horaires sont les types des types des paramètres de la méthode, qui sont déterminées à partir de la méthode decriptor.
Si vous avez utilisé pour Java, il existe quelques différences mineures à la façon dont la méthode de types de paramètres de travail au niveau du bytecode. Tout d'abord, les méthodes virtuelles ont un implicite
this
comme premier paramètre. Deuxièmement,boolean
,byte
,char
, etshort
n'existent pas au niveau du bytecode. Au lieu de cela, ils sont tous mis en œuvre comme ints derrière les coulisses.long
etdouble
paramètres, comme pour toutes les variables locales, de consommer de l' deux les variables locales dans le cadre de la pile.