OK je sais que cela: Nous écrire le code source de java, le compilateur, ce qui est indépendant de la plateforme traduit en bytecode,
En fait le compilateur lui-même fonctionne comme un fichier exécutable natif (donc javac.exe). Et de vrai, il transforme le fichier source en bytecode. Le pseudo-code est indépendant de la plateforme, car il est ciblé à une Machine Virtuelle Java.
puis la jvm qui est dépendants de la plateforme traduit en code machine.
Pas toujours. Comme pour le Soleil de la JVM, il y a deux machines virtuelles: le client et le serveur. Ils peuvent tous les deux, mais certainement pas avoir à les compiler en code natif.
Afin de commencer, nous allons écrire le code source java. Le compilateur javac.exe est un .exe fichier. Quelle est exactement ce .fichier exe? N'est-ce pas le compilateur java écrit en java, alors comment se fait il est .fichier exe qui l'exécute?
Cette exe
le fichier est enveloppé bytecode java. C'est par commodité et pour éviter compliqué scripts batch. Il commence une JVM et exécute le compilateur.
Si le compilateur de code est écrit en java, alors comment se fait compilateur de code est exécuté lors de la phase de compilation, depuis sa le travail de la machine pour exécuter du code java.
C'est exactement ce que l'emballage code ne.
Comment une langue elle-même composer son propre code de langue? Il semble que tout comme l'oeuf et la poule de problème pour moi.
Vrai, déroutant au premier coup d'œil. Cependant, ce n'est pas seulement de Java est un langage. Le compilateur Ada est également écrit en Ada lui-même. Il peut sembler comme une "poule et de l'œuf problème", mais en vérité, c'est seulement l'amorçage problème.
Maintenant exactement ce que fait le .fichier de classe contiennent? C'est un arbre de syntaxe abstraite en forme de texte, est-il des informations tabulaires, c'est quoi?
C'est pas de l'Arbre de Syntaxe Abstraite. AST est uniquement utilisé par le générateur de jetons et le compilateur lors de la compilation de temps pour représenter le code en mémoire. .class
le fichier est comme une assemblée, mais pour la JVM. La JVM est une machine abstraite qui peut exécuter machine spécialisée de la langue - cible uniquement à la machine virtuelle. Dans son expression la plus simple, .class
le fichier a la structure très similaire à la normale de l'assemblée. Au début, se sont déclarées toutes les variables statiques, puis arrive quelques tables de fonction extern signatures et enfin le code de l'ordinateur.
Si Vous êtes vraiment curieux Vous pouvez aller dans classfile à l'aide de "javap" de l'utilitaire. Voici un exemple (crypté) de sortie de l'invocation d' javap -c Main
:
0: new #2; //class SomeObject
3: dup
4: invokespecial #3; //Method SomeObject."<init>":()V
7: astore_1
8: aload_1
9: invokevirtual #4; //Method SomeObject.doSomething:()V
12: return
Donc, Vous devriez avoir une idée déjà de ce qu'il est vraiment.
quelqu'un peut-il me dire clairement et de façon détaillée sur la manière dont mon code source java est converti en code machine.
Je pense qu'il devrait être plus clair dès maintenant, mais voici, en résumé:
Vous appelez javac
pointant vers votre fichier de code source. L'interne lecteur (ou tokenizer) de javac lit de votre fichier et construit une véritable AST hors de lui. Toutes les erreurs de syntaxe venir à partir de cette étape.
L' javac
n'a pas fini, il travail encore. Quand il a de l'AST le véritable compilation peut commencer. C'est à l'aide de modèle visiteur de parcourir l'AST et résout les dépendances externes pour ajouter du sens (sémantique) du code. Le produit fini est enregistré en tant que .class
le fichier contenant le bytecode.
Maintenant, il est temps d'exécuter la chose. Vous appelez java
le nom de .classfile. Maintenant, la machine commence à nouveau, mais à interpréter Votre code. La JVM peut, ou peut ne pas compiler Votre résumé du bytecode en natif de l'assemblée. Le Soleil HotSpot compilateur en conjonction avec Juste le Temps de compilation peut le faire si nécessaire. Le code en cours d'exécution est constamment profilée par la JVM et compilées en code natif si certaines règles sont respectées. Le plus souvent, le chaud, le code est le premier à compiler en natif.
Edit: Sans le javac
on aurait pu invoquer le compilateur à l'aide de quelque chose de similaire à ceci:
%JDK_HOME%/bin/java.exe -cp:myclasspath com.sun.tools.javac.Main fileToCompile
Comme Vous pouvez le voir, c'est l'appel du Soleil API privée donc c'est lié à la Sun JDK mise en œuvre. Il serait de construire des systèmes dépendant de lui. Si l'on passé à tout autre JDK (wiki listes 5 autre que le Soleil), puis le code ci-dessus devrait être mis à jour pour refléter le changement (car il est peu probable que le compilateur pourrait résider dans com.soleil.outils.javac package). D'autres compilateurs pourrait être écrit en code natif.
Donc, la méthode standard consiste à expédier javac
wrapper avec le JDK.