En savoir plus sur le bytecode Java et la machine virtuelle Java
-
05-07-2019 - |
Question
Dans une question récente posée récemment, ma réponse simple a souligné de nombreuses idées fausses sur Java, la machine virtuelle Java et la manière dont le code est compilé et exécuté. Cela a créé un désir en moi de porter ma compréhension à un niveau inférieur. Je n'ai aucun problème avec la compréhension de bas niveau telle que l'assemblage, mais le bytecode et la JVM me déroutent. La façon dont le code orienté objet est décomposé à un niveau bas est perdue pour moi. Je me demandais si quelqu'un avait des suggestions sur la manière de se renseigner sur la JVM, le bytecode et le fonctionnement de niveau inférieur de Java. Existe-t-il des utilitaires qui vous permettent d’écrire et d’exécuter le bytecode directement, car je pense que l’expérience pratique de quelque chose est le meilleur moyen d’améliorer sa compréhension? De plus, des suggestions de lecture sur ce sujet seraient appréciées.
Modifier: question secondaire. J'ai donc une sorte de question secondaire, les réponses m'ont donné une idée intéressante d'apprendre sur le jvm, quelle serait la plausibilité d'écrire un langage très simple comme brainf ** k ou Ook uniquement dans une syntaxe lisible (peut-être que je pourrais même le développer soutenir oo éventuellement) qui compile en code binaire soit? Serait-ce une bonne expérience d'apprentissage?
La solution
Lectures suggérées: la spécification JVM .
Vous pouvez également jouer avec BCEL - il existe d'autres bibliothèques pour manipuler le bytecode, mais c'est probablement le plus connu.
Autres conseils
Le Apache BCEL vous permettra d'analyser et de manipuler des fichiers .class à partir de bytecode.
javap vous permettra de démonter fichiers .class existants. Il est particulièrement utile pour les classes de tests rapides de comprendre ce qui se passe réellement sous les couvertures.
J'ai appris en lisant le didacticiel ASM et la discussion avec la bibliothèque elle-même.
IMHO, ASM est meilleur que BECL.
BCEL est déjà utilisé avec succès dans plusieurs projets tels comme compilateurs, optimiseurs, obsfuscateurs, générateurs de code et outils d'analyse. Malheureusement là pas beaucoup de développement en cours ces dernières années . Ne hésitez pas à aider ou vous voudrez peut-être un examinez le projet ASM à objectweb. - http://jakarta.apache.org/bcel/
Il existe une seule source fiable pour la compréhension de la machine virtuelle Java
Le Java & # 174; Spécifications de la machine virtuelle Java SE 7 Edition
http://docs.oracle.com/javase/ specs / jvms / se7 / html / index.html
Programmation pour la machine virtuelle Java est un bon livre pour ce sujet. (Divulgation: je travaille avec l'auteur.)
Pour comprendre l'architecture de Java / JVM: lisez Wikipedia, les spécifications et le code source.
Pour comprendre comment le code orienté objet est créé à un niveau bas: essayez d'imiter des fonctionnalités telles que l'héritage / le polymorphisme / l'encapsulation dans un langage de niveau inférieur tel que le langage C.
En C, vous pouvez obtenir ce qui précède en combinant par exemple des pointeurs de fonction et des structures imbriquées.